湯豆腐

個人用の落書きです

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", "+"])

f:id:zoo_200:20180322151054p:plain

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
)

基本的な使い方は下記です。

  1. 分類器のインスタンスを作成
  2. fitで訓練データを当てはめ
  3. predictでテストデータの予測
  4. 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・ランダムフォレストは非線形データも分類できるので、
ロジスティック回帰とランダムフォレストが同じ結果になったのが意外でした。

とはいえ十分な精度は出ているので、データ量が増えると変わるのか、それともチューニングで変わるのか・・・
経験則がないのでこのあたりの判断ができませんね。
次回はチューニングについてもう少し調べてみたいと思います。