Irisデータセットで分類の練習!!
- そらまめ
- 2020年8月19日
- 読了時間: 4分
更新日:2020年8月21日

こんにちは、そらまめです。
今回は前回の記事で紹介した、Irisデータセットを用いてアヤメの分類に挑戦していきます!
まずはデータや用いるアルゴリズムの説明を行いその後、分析をしていきます。
データの概要についてはこのようになっています。
レコード数:150
カラム数 :5
説明変数 :
sepal length(cm) ガクの長さ
sepal width(cm) ガクの幅
petal length(cm) 花弁の長さ
petal width(cm) 花弁の幅
目的変数 :アヤメの品種(0: Setosa、1: Versicolor、2: Virginica)
分類には決定木とランダムフォレストを用いていきたいと思います。
決定木とランダムフォレストとは?
決定木(分類木)は木構造を用いて「条件分岐」を繰り返すことでサンプルを分類する教師あり機械学習の手法のことを言います。
この決定木を複数作成し、それらの多数決によって出力を決定するモデルがランダムフォレストです。
それぞれのモデルについては以下の図が直感的に理解しやすいかと思います!


また今回は分類で用いていますが、連続値を予測する回帰モデルでも決定木(回帰木)やランダムフォレストは使用できます。
データの読み込み
scikit-learnからirisのデータを読みこんで確認してみましょう。
pd.DataFrame()関数でデータフレームに変換することでデータの確認が容易になります。
データの確認にはhead()で先頭5行を表示したり、shapeで行数と列数を見ることでデータの外観をつかむことが出来ます。
import pandas as pd
from sklearn.datasets import load_iris
#データの読み込み
iris = load_iris()
#見やすいようにDataFrameに変換
Iris = pd.DataFrame(iris.data,columns=iris.feature_names)
Iris['target'] = iris.target
#先頭5行表示
Iris.head()
#要素確認 150行×5列
Iris.shape
(150, 5)
データの可視化
データの外観は先ほど確認できましたが、説明変数と目的変数の関係を視覚的に理解しやすくするために可視化を行うことが重要になってきます。
今回は可視化ライブラリであるseabornのpairplotを使っていきます。
#可視化ライブラリ
import seaborn as sns
%matplotlib inline
sns.pairplot(Iris, hue='target')
#hueで指定したカテゴリごとに色分けすることが出来ます。
#target(品種)(0:Setosa, 1:Versicolor, 2:Virginica)

グラフから説明変数からかなりアヤメを分類できていることが確認できると思います。
可視化をすることでデータに対する新たな気付きも得られることがあるので、分析を行う前にグラフを描くことをオススメします!
学習用とテスト用データに分割
train_test_split()関数を使って学習用データと検証データに分割していきます。
引数のtest_sizeを入れることでデータをどの割合で分けるかを選択することができます。
またstratifyを設定することで検証データにアヤメが等しい割合で選ばれるようにします。
from sklearn.model_selection import train_test_split
X = Iris[["sepal length (cm)","sepal width (cm)","petal length (cm)","petal width (cm)"]] #説明変数
y = Iris['target'] #目的変数
#学習データと検証データを75:25で分割 層化抽出
x_train,x_test,y_train,y_test = train_test_split(X, y, test_size=0.25, stratify=y ,random_state=0)
#層化抽出をしない場合
x_train,x_test,y_train,y_test = train_test_split(X, y, test_size=0.25 ,random_state=0)
#入っている要素の個数を数える
y_test.value_counts()
1 16
0 13
2 9
Name: target, dtype: int64
#層化抽出を行った場合
x_train,x_test,y_train,y_test = train_test_split(X, y, test_size=0.25, stratify=y ,random_state=0)
#入っている要素の個数を数える
y_test.value_counts()
1 13
0 13
2 12
Name: target, dtype: int64
このように層化抽出を行うことで、0,1,2のカテゴリーがそれぞれ13個、13個、12個とほとんど同じ数が抽出できていることが分かります。
この層化抽出はカテゴリーが大きく偏っている不均衡データ(例:Yes:99% No:1%という回答になったアンケート)で用いるとモデルの精度向上に約に立つので是非活用してみて下さい。
学習と精度評価
最後にtrainデータを学習させて、それをtestデータで試して精度を測ってみましょう。
学習の流れは
モデルを格納する変数を用意
fit()関数の中に学習させるためのデータを投入
predict()関数で予測させたいデータを投入
となっています。
scikit-learnの凄いところはこのように学習を行うのに3行のコードで済み、誰でもお手軽に機械学習に触れることが出来る所にあると思います!
また機会があれば記事にしたいと思いますが、分類木やランダムフォレストを自分で関数を作成して実装しようとするとコードがそこそこの長さになります笑
from sklearn.tree import DecisionTreeClassifier
from sklearn.ensemble import RandomForestClassifier
from sklearn.metrics import accuracy_score
#回帰木の箱を用意
model1 = DecisionTreeClassifier(random_state=0)
#学習
model1.fit(x_train,y_train)
#検証データで予測
pred1 = model1.predict(x_test)
#回帰木の箱を用意
model2 = RandomForestClassifier(random_state=0)
#学習
model2.fit(x_train,y_train)
#検証データで予測
pred2 = model2.predict(x_test)
#精度評価
print('分類木 :',accuracy_score(y_test,pred1))
print('ランダムフォレスト:',accuracy_score(y_test,pred2))
分類木 :0.9736842105263158
ランダムフォレスト :0.9473684210526315
精度の評価はaccuracy_scoreで確認できます。Accuracy(正解率)は0~1の間をとり、1に近づくほど精度が高いと評価することが出来るので、今回試した分類木とランダムフォレストはどちらもかなりの精度を誇っていることが分かります。
まとめ

今回は分類木とランダムフォレストを用いてアヤメデータの分類を行っていきました。これが機械学習の基本となるところなので、ぜひ挑戦していただければと思います!
今度はこの前のガソリン価格予測みたいに実社会に関係のあるデータで分析を行っていきたいですね。
コメント