The Iris Dataset いろいろ

機械学習で Python の練習をしたいなぁと思っていろいろ触りました。

# 環境
[Colaboratory](https://colab.research.google.com/notebooks/intro.ipynb?hl=ja#scrollTo=5fCEDCU_qrC0)
> Colaboratory とは
Colaboratory（略称: Colab）は、ブラウザから Python を記述、実行できるサービスです。次の特長を備えています。
・環境構築が不要
・GPU への無料アクセス
・簡単に共有

以前、機械学習の勉強をしたときは [Jupyter Notebook](https://jupyter.readthedocs.io/en/latest/install/notebook-classic.html) を使ったので、今回は Colaboratory を使ってみることにしました。

# 教材
[The Iris Dataset](https://scikit-learn.org/stable/auto_examples/datasets/plot_iris_dataset.html#the-iris-dataset)
3種類のアイリス（Setosa、Versicolour、Virginica）について、花びらやがく片の長さで分類していきます。

## そのまま実行してみる

```python:plot_iris_dataset.py
print(__doc__)


# Code source: Gaël Varoquaux
# Modified for documentation by Jaques Grobler
# License: BSD 3 clause

import matplotlib.pyplot as plt
from mpl_toolkits.mplot3d import Axes3D
from sklearn import datasets
from sklearn.decomposition import PCA

# import some data to play with
iris = datasets.load_iris()
X = iris.data[:, :2]  # we only take the first two features.
y = iris.target

x_min, x_max = X[:, 0].min() - .5, X[:, 0].max() + .5
y_min, y_max = X[:, 1].min() - .5, X[:, 1].max() + .5

plt.figure(2, figsize=(8, 6))
plt.clf()

# Plot the training points
plt.scatter(X[:, 0], X[:, 1], c=y, cmap=plt.cm.Set1,
            edgecolor='k')
plt.xlabel('Sepal length')
plt.ylabel('Sepal width')

plt.xlim(x_min, x_max)
plt.ylim(y_min, y_max)
plt.xticks(())
plt.yticks(())

# To getter a better understanding of interaction of the dimensions
# plot the first three PCA dimensions
fig = plt.figure(1, figsize=(8, 6))
ax = Axes3D(fig, elev=-150, azim=110)
X_reduced = PCA(n_components=3).fit_transform(iris.data)
ax.scatter(X_reduced[:, 0], X_reduced[:, 1], X_reduced[:, 2], c=y,
           cmap=plt.cm.Set1, edgecolor='k', s=40)
ax.set_title("First three PCA directions")
ax.set_xlabel("1st eigenvector")
ax.w_xaxis.set_ticklabels([])
ax.set_ylabel("2nd eigenvector")
ax.w_yaxis.set_ticklabels([])
ax.set_zlabel("3rd eigenvector")
ax.w_zaxis.set_ticklabels([])

plt.show()
```

![スクリーンショット 2021-02-27 19.16.52.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/449552/dd6c5449-134f-b069-7e7a-271f5ab84b2b.png)
![スクリーンショット 2021-02-27 19.17.07.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/449552/8024a370-ea96-f060-021b-e574f93e4340.png)

今回は上部分だけ見てみます。
(3Dのやつは、なんかいじっても見づらそうなのでいったん見ない)

```python:plot_iris_dataset.py
print(__doc__)


# Code source: Gaël Varoquaux
# Modified for documentation by Jaques Grobler
# License: BSD 3 clause

import matplotlib.pyplot as plt
from mpl_toolkits.mplot3d import Axes3D
from sklearn import datasets
from sklearn.decomposition import PCA

# import some data to play with
iris = datasets.load_iris()
X = iris.data[:, :2]  # we only take the first two features.
y = iris.target

x_min, x_max = X[:, 0].min() - .5, X[:, 0].max() + .5
y_min, y_max = X[:, 1].min() - .5, X[:, 1].max() + .5

plt.figure(2, figsize=(8, 6))
plt.clf()

# Plot the training points
plt.scatter(X[:, 0], X[:, 1], c=y, cmap=plt.cm.Set1,
            edgecolor='k')
plt.xlabel('Sepal length')
plt.ylabel('Sepal width')

plt.xlim(x_min, x_max)
plt.ylim(y_min, y_max)
plt.xticks(())
plt.yticks(())

plt.show()
```

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/449552/f8f622e8-9275-cfa6-3baf-9131786f64cc.png)

## データセットを変えてみる

まずは中身の確認

```python
import seaborn as sns
iris = sns.load_dataset("iris") 
# ちなみにこのirisはpandasのdataframeです。
iris.head(20)
```
![スクリーンショット 2021-02-27 19.35.39.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/449552/356712e3-7e30-a06b-6b1c-027305c4f9cb.png)


1. `X = iris.data[:, :2]` の部分を `X = iris.data[:, 2:4]`に変える。
2. ラベルも `Sepal` から `Petal` へ変える。

```python
# import some data to play with
iris = datasets.load_iris()
X = iris.data[:, 2:4]  # we only take the first two features.
y = iris.target
```

```python
plt.xlabel('Petal length')
plt.ylabel('Petal width')
```

実行すると、花弁の長さ・幅の分布図が出力されました。


![SS 2021-03-01 11.01.56.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/449552/2d81ecad-1d54-87ef-158b-eb29b1ebd529.png)


### :thinking: iris.data[:, 2:4] 
[NumPy 入門 #多次元配列の要素を選択する
](https://tutorials.chainer.org/ja/08_Introduction_to_NumPy.html#多次元配列の要素を選択する)
NumPy 独自の記法

行列があった場合

```python
array([[1, 2, 3],
       [4, 5, 6],
       [7, 8, 9]])
```

1列目の値 [1, 4, 7] をすべて取得したい場合は

```
x[:, 0]
```

2列目から3列目の値をすべて取得したい場合は

```
x[:, 1:2]
```

## グラフの表示を変えてみる

[matplotlib.pyplot.scatter — Matplotlib 3.3.4.post2472+g1ec609a3f documentation](https://matplotlib.org/devdocs/api/_as_gen/matplotlib.pyplot.scatter.html#matplotlib.pyplot.scatter)

```python
# Plot the training points
plt.scatter(X[:, 0], X[:, 1], c=y, cmap=plt.cm.Set1, marker="*",
            edgecolor='')
```
お星さまになった

![スクリーンショット 2021-02-27 19.57.53.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/449552/f5491235-6ca1-eebb-971b-e29c25c28942.png)

# 感想

Colaboratory が思いのほか良かったです。
とりあえず実行してグラフィックで結果を見たい場合に便利だなぁと思いました。