scikit-learnによる機械学習実装 ~ iris編 ~

# 初めに
## 内容
scikit-learnを用いた機械学習を行います。
データセットは[scikit-learnから提供されるデータセット](https://pythondatascience.plavox.info/scikit-learn/scikit-learn%E3%81%AB%E4%BB%98%E5%B1%9E%E3%81%97%E3%81%A6%E3%81%84%E3%82%8B%E3%83%87%E3%83%BC%E3%82%BF%E3%82%BB%E3%83%83%E3%83%88)を使用します。

本記事では「**iris**」を取り扱います。

[Bostonデータセットの記事はこちらです。](https://qiita.com/RiRyCasals/items/bcf04638245a01fa25f6)
[diabetsデータセットの記事はこちらです。](https://qiita.com/RiRyCasals/items/2ea25de39610db0c78be)
[digitsデータセットの記事はこちらです。](https://qiita.com/RiRyCasals/items/81c1de806fdae0a0e0c4)
その他のデータセットは別の記事にて更新しようと思います。

## 対象
主に**初心者向け**です。が、入門向けではないです。
本記事は友人に向けて作成してますが、
**「機械学習したい」と思っている方**にも読んでもらえるように書いています。
実装に関しての解説は記載しますが、アルゴリズムなどの解説は（基本的に）しませんのでご理解のほどを。

## 環境
- Google Colaboratory
- Python 3.6.9
- sklearn 0.22.2

ローカルで環境をそろえるのは難しいので（Dockerやクラウドを使えばできますが）
今回はColaboratoryを用います。
もし、colaboratoryの使い方がわからない場合などは、各自調べていただきたいです。
（たくさん記事があるので大丈夫かと...）
ローカルでも同じようにコードが書けるはずなので参考にしてください。

---

# irisデータセットにつて
ここからはpythonを用いてirisデータをざっくり確認していきます。
ライブラリのインポート、データの読み込み、先頭5行の表示を一気に書きます。

```python:
from sklearn.datasets import load_iris
import pandas as pd
iris = load_iris()
data = iris.data
feature_names = iris.feature_names
df = pd.DataFrame(data=data, columns=feature_names)
df.head()
```
このような表が生成されるはずです。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/690399/10370ff4-af18-9ff6-d9a6-f74bd9889d3a.png)

- sepal length (cm) : がく片の長さ
- sepal width (cm) : がく片の幅
- petal length (cm) : 花弁の長さ
- petal width (cm) : 花弁の幅

今回のデータセットではこの4つが説明変数になります。

```python:
df.shape # => (150, 4)
```
データは150件あることが確認できますね。

説明変数を確認したので、次は目的変数を見ましょう。

```python:
target = iris.target
target_names = iris.target_names
print(target_names) # => ['setosa' 'versicolor' 'virginica']
```
targetに3つの品種があることがわかります。
（setosa, versicolor, virginica がそれぞれ品種名です）

説明変数と同じようにデータフレームに入れてましょう

```python:
df_target = pd.DataFrame(data=target, columns=['target'])
df_target.head()
```
次のような表が表示されます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/690399/f01acde5-684b-8b16-2ca7-a438c1054ee0.png)
目的変数にどのような値が入っているかは次のように確認できます。

```python:
df_target['target'].unique() # => array([0, 1, 2])
```
数値はtarget_namesのインデックスになっています。

- 0 : setosa
- 1 : versicolor
- 2 : virginica

# 機械学習
irisデータセットなのでわざわざ前処理は行いませんが、
実際には行うべきなので、どのような手法があるか各自調べてみましょう。

## データの分割
irisデータを学習用とテスト用に分割する必要があります。

```python:
from sklearn.model_selection import train_test_split
x_train, x_test, y_train, y_test = train_test_split(df_data, df_target)
print('x_train : ', x_train.shape) # => x_train : (120, 4)
print('x_test : ', x_test.shape) # => x_test : (30, 4)
print('y_train : ', y_train.shape) # => y_train : (120, 1)
print('y_test : ', y_test.shape) # => y_test : (30, 1)
```
scikit-learnではtrain_test_split()で簡単に分割可能です。
デフォルトで25%のデータがテストデータになります。
変更する場合は引数にtest_sizeを追加しましょう。0.2~0.4がおすすめです。

## 学習
学習モデルを作成しましょう。今回はRandomForestを利用します。

```python:
from sklearn.ensemble import RandomForestClassifier
model = RandomForestClassifier()
```
学習にはfitメソッドを使用します。

```python:
model.fit(x_train, y_train)
```

## 推論
学習したモデルで予測をしましょう。
predictメソッドで推論できます。

```python:
pred = model.predict(x_test)
```
最後にモデルの精度がどれくらいかを確認して終わります。
精度の確認にはaccuracy_scoreを使用します。

```python:
from sklearn.metrics import accuracy_score
accuracy_score(y_test, pred) # => 0.9736842105263158
```
精度は 97.3% でした。
train_test_splitで学習データはランダムに分けられますので予測精度は異なっていると思います。

# 最後に
今回、特徴量の選定などは行いませんでしたが、機械学習において特徴量の選定は大事です。
その他の前処理と合わせて、各自調べてみましょう。


数時間でまとめたので全体的には簡素になっていて申し訳ないです...m(__)m