scikit-learnの使い方 [ML:1日目]
チュートリアルでおなじみのirisを使ってscikit-learnの基本的な使い方を学びます。
データの確認
まずはseabornを使ってデータの内容を確認してみましょう。
import seaborn as sb %matplotlib inline # データフレームの読み込み iris = sb.load_dataset('iris') # 先頭のデータを表示 iris.head()
irisはアヤメの3種類の品種について計測したデータです。
- sepal-length: がく片の長さ
- sepal-width: がく片の幅
- petal-length: 花びらの長さ
- petal-width: 花びらの幅
- species: アヤメの種類
となっていて、speciesが予測する目的変数です。
次に可視化して傾向を見てみます。
sb.pairplot(iris, hue='species', markers=["o", "s", "+"])
versicolorとvirginicaが似ているようですね。
分類してみる
よく使われる以下のアルゴリズムをそれぞれ試してみます
- ロジスティック回帰
- SVM
- ランダムフォレスト
前準備として説明変数、目的変数をそれぞれ訓練用データとテストデータに分割します
from sklearn.cross_validation import train_test_split import seaborn as sb iris = sb.load_dataset('iris') x_train, x_test, y_train, y_test = train_test_split( iris.drop('species', axis=1), iris.species, test_size=0.2 )
基本的な使い方は下記です。
- 分類器のインスタンスを作成
fit
で訓練データを当てはめpredict
でテストデータの予測score
で精度の表示
ロジスティック回帰
from sklearn.linear_model import LogisticRegression clf_lr = LogisticRegression() clf_lr.fit(x_train, y_train) accuracy = clf_lr.score(x_test, y_test) print(accuracy)
SVM
from sklearn import svm clf_svm = svm.SVC() clf_svm.fit(x_train, y_train) accuracy = clf_svm.score(x_test, y_test) print(accuracy)
ランダムフォレスト
from sklearn.ensemble import RandomForestClassifier clf_rf = RandomForestClassifier() clf_rf.fit(x_train, y_train) accuracy = clf_rf.score(x_test, y_test) print(accuracy)
結果
分類器 | スコア |
---|---|
ロジスティック回帰 | 93.33% |
SVM | 96.66% |
ランダムフォレスト | 93.33% |
何もチューニングしていない状態だと SVM > ロジスティック回帰 = ランダムフォレスト となりました。
ロジスティック回帰は線形分類器なのに対し、SVM・ランダムフォレストは非線形データも分類できるので、
ロジスティック回帰とランダムフォレストが同じ結果になったのが意外でした。
とはいえ十分な精度は出ているので、データ量が増えると変わるのか、それともチューニングで変わるのか・・・
経験則がないのでこのあたりの判断ができませんね。
次回はチューニングについてもう少し調べてみたいと思います。