#はじめに
こんばんは、supercellです。ここでは、機械学習ライブラリの一つであるscikit-learnの使用例を解説していきます。
※ここで紹介するコードは以下のリンクから参照することができます。
python-machine-learning-book-2nd-edition
#scikit-learnとは?
scikit-learnは機械学習のライブラリの一つで、様々なアルゴリズムのほかに、データの前処理や、モデルの調整や評価を行うための便利な関数を取り揃えています。
#実装例
今回は、パーセプトロンのモデルを用います。データセットは、Irisデータセットの特徴量を2つ使用します。Irisデータセットは、scikit-learnにすでに用意されているため、簡単に取り込むことができます。
では、実装していきます。
from sklearn import as datesets
import numpy as np
#Irisデータセットをロード
iris = datasets.load_iris()
#3,4列目の特徴量を抽出
X = iris.data[:, [2,3]]
#クラスラベルを取得
y = iris.target
#一意なクラスラベルを出力
print('Class labels:', np.unique(y))
Irisデータセットをダウンロードした後、特徴行列Xに代入し、ベクトルyにクラスラベルを代入しています。
np.unique(y)によって一意なクラスラベルを返しています。ここでは、Iris-setosa、Iris-versicolor、Iris-virginicaがすでに整数(0,1,2)として収納されていることがわかります。
from sklearn.model_selection import train_test_split
#トレーニングデータとテストデータに分割
#全体の30%をテストデータにする
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.3,
random_state=1, stratify=y)
train_test_split関数を用いて、X配列とy配列の30%のテストデータと70%のトレーニングデータに分割しています。また、ランダムなクラスラベルに分割するために、データはシャッフルされます。
stratify=yを指定することで、トレーニングデータとテストデータのクラスラベルの比率を等しくすることができます。比率を確認するには、Numpyのbincount関数を用います。
>>>print('Labels counts in y:', np.bincount(y))
Labels counts in y: [50, 50,50]
機械学習では、最適化の際、標準化という特徴量のスケーリングを行う。scikit-learnのStandardScalerクラスを使って特徴量の標準化をおこなうことができる。
from sklearn.preprocessing import StandardScaler
sc = StandardScaler()
#トレーニングデータの平均と標準偏差を計算
sc.fit(X_train)
#平均と標準偏差を用いて標準化
X_train_std = sc.transform(X_train)
X_test_std = sc.transform(X_test)
テストデータの標準化の際に、トレーニングデータの標準偏差と平均を用いていることに注意です。これは、トレーニングデータとテストデータの値を比較することができるようにするためです。
scikit-learnのほとんどのアルゴリズムは一対他手法が使用されるため、3つ以上のクラスラベルを比較することができます。実際にパーセプトロンのモデルをトレーニングしてみましょう。
from sklearn.linear_model import Perceptron
#エポック数40、学習率0.1でパーセプトロンのインスタンスを生成
ppn = Perceptron(n_iter=40, eta0=0.1, random_state=1)
#トレーニングデータをモデルに適合させる
ppn.fit(X_train_std, y_train)
前回パーセプトロンを学習させた際の変数の定義と同じです。
次に、トレーニングの後に予測を行うことができます。
y_pred = ppn.predict(X_test_std)
#誤分類のサンプルの個数を表示
print('Misclassified samples: %d' % (y_test != y_pred).sum())
このコードにより、誤分類する確率を出すことができます。
また、scikit-learnでは、性能指標を計算する機能も備えています。具体的に、正解率をみてみます。
>>>from sklearn.metrics import accuracy_score
>>>#分類の正解率を表示
>>>print('Accuracy: %.2f' % accuracy_score(y_test, y_pred))
Accuracy: 0.93
以上がscikit-learnの実装例となります。
#おわりに
scikit-learnを用いると、はるかに楽にモデルを作成することができることがわかりました。
次回は、ロジスティック回帰について説明する予定です。お楽しみに。
#参考文献
Python機械学習プログラミング