3
Help us understand the problem. What are the problem?

More than 3 years have passed since last update.

posted at

scikit-learnの使用例

はじめに

こんばんは、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機械学習プログラミング

Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
Sign upLogin
3
Help us understand the problem. What are the problem?