纏まった記事があまりなかったので、scikit-learnの使い方を纏めてみました。
scikit-learnはPythonで使える機械学習ライブラリで、読み方は「サイキットラーン」です。
本記事では教師あり学習を想定していますが、教師なし学習でも基本的には同じ流れになります。
また、scikit-learnやnumpyのインストールは既に済んでいるものとします。
データセットの用意
まずは、当たり前ですが、データセットを用意する必要があります。
書籍などではscikit-learn付属のデータセットを用いる場合が多いですが、日常の研究や業務では自分達で用意したCSVファイルを使うことが多いと思います。
その場合、numpyのloadtxt関数を使うと便利です。
例えば、1列目が目的変数、2列目以降が説明変数となる
1,1.2,12,...
1,2.0,5,...
1,1.5,3,...
2,1.8,1,...
2,0.5,10,...
2,1.0,8,...
というCSVファイルがあった場合、
import numpy as np
from sklearn import preprocessing
from sklearn.model_selection import train_test_split
data = np.loadtxt('foo.csv', delimiter=',', dtype=float)
labels = data[:, 0:1] # 目的変数を取り出す
features = preprocessing.minmax_scale(data[:, 1:]) # 説明変数を取り出した上でスケーリング
x_train, x_test, y_train, y_test = train_test_split(features, labels.ravel(), test_size=0.3) # トレーニングデータとテストデータに分割
と書くと、CSVファイルをnumpy形式で読み込んだ上でトレーニングデータとテストデータに分けることができます。
ここで忘れてはいけないのが、説明変数のスケーリングです。
説明変数毎にスケールが異なると正しく学習できないので、各変数のスケールを合わせておく必要があります。
今回はminmax_scale関数を使い、各変数を[0,1]の範囲にスケーリングしています。
また、train_test_split関数を利用してデータをトレーニングデータとテストデータに分割していますが、クロスバリデーションしても問題ありません。
モデルの選択
データを用意できれば、次にやることはモデルの選択です。
scikit-learnにはSVM、ニューラルネットワーク、ランダムフォレストなどの様々なアルゴリズムが用意されているので、好きなものを選びます。
例えば、SVMを使う場合、
from sklearn import svm
clf = svm.SVC(kernel='rbf', C=10, gamma=0.1) # clfはclassificationの略語
と書くだけです。
使用するkernelやパラメータは引数で指定できます。
指定可能は引数については公式ドキュメントに載っています。
また、ニューラルネットワークを使う場合、
from sklearn import neural_network
clf = neural_network.MLPClassifier(activation="relu", alpha=0.0001) # clfはclassificationの略語
と書くだけです。
SVMと同様、使用する活性化関数やパラメータは引数で指定できます。
こちらも、指定可能は引数については公式ドキュメントに載っています。
SVMやニューラルネットワーク以外のアルゴリズムでも基本的には書き方は全く同じです。
scikit-learnで使えるアルゴリズムは公式ドキュメントをご覧下さい。
学習
データセットを用意してモデルも選択できれば、次にやることはトレーニングデータを使った学習です。
clf.fit(x_train, y_train)
と書くだけです。
たった一行書くだけで学習ができます。
予測
最後はテストデータを使った予測です。
clf.predict(x_test)
と書くだけです。
学習フェーズと同様、たった一行書くだけで予測ができます。
正解率(accuracy)、適合率(precision)、再現率(recall)を出したい場合は、
from sklearn.metrics import accuracy_score, precision_score, recall_score
predict = clf.predict(x_test)
print(accuracy_score(y_test, predict), precision_score(y_test, predict), recall_score(y_test, predict))
のようにscikit-learnに用意されている関数を使えばすぐに出すことができます。