SlideShare a Scribd company logo
scikit-learnで始める機械学習
2013/7/16@はじパタLT
理論を勉強したら、やっぱり実践したい
理想
0から自分で実装したプログラムで課題を解決していく
現実
パッケージをつなぎ合わせて問題に取り組む
汎用性や処理速度を気にすると、パッケージを使うのが
現実的
→パッケージを使った機械学習の方法を紹介
何の話?
twitterID:wwacky
6月末で会社を辞めて無職生活中
8月からまたサラリーマンになります
最近Python、Hadoopを勉強中
今まではJava、Rがメイン
ゲーム・登山をやってます
登山はまだにわかですが
自己紹介
機械学習のパッケージ
R勢
 e1071(SVM、クラスタリングとか)
 gbm(AdaBoost+回帰など)
 kernlab(SVM、カーネル主成分とか)
 mboost(boosting)
 nnet(ニューラルネットワーク)
 randomForest
 rpart
etc.
定番
 LIBSVM
その他
 weka (Java)
 nltk (Python)
新興勢力
 Apache Mahout
 Jubatus
 scikit-learn
という勝手な印象
機械学習のパッケージ
R勢
 e1071(SVM、クラスタリングとか)
 gbm(AdaBoost+回帰など)
 kernlab(SVM、カーネル主成分とか)
 mboost(boosting)
 nnet(ニューラルネットワーク)
 randomForest
 rpart
etc.
定番
 LIBSVM
その他
 weka (Java)
 nltk (Python)
新興勢力
 Apache Mahout
 Jubatus
 scikit-learn
という勝手な印象
今日話すのはこいつ
python用の機械学習ライブラリ(モジュール)
シンプルかつ効率的な多目的ツール(らしい)
pythonでデータ分析をする人の必須ツール(って聞いた)
ということで、気になってたので使ってみた
scikit-learnって何?
教師なし学習
 混合ガウスモデル
 主成分分析(9章)
 因子分析
 独立成分分析
 クラスタリング(10章)
 隠れマルコフモデル
etc.
教師あり学習
 最近傍法(5章)
 一般化線形モデル(6章)
 線形判別分析(6章)
 SVM(8章)
 決定木(11章)
 ランダムフォレスト(11章)
 Naïve Bayes
etc.
scikit-learnで何ができるの(抜粋)
周辺ツール
 特徴抽出・作成
 クロスバリデーション(2章)
 グリッドサーチ
 AUC、ROC描画(3章)
 Accuracy、Recall、F値算出(3章)
()内の章は、はじめてのパターン認識で登場する章
教師なし学習
 混合ガウスモデル
 主成分分析(9章)
 因子分析
 独立成分分析
 クラスタリング(10章)
 隠れマルコフモデル
etc.
教師あり学習
 最近傍法(5章)
 一般化線形モデル(6章)
 線形判別分析(6章)
 SVM(8章)
 決定木(11章)
 ランダムフォレスト(11章)
 Naïve Bayes
etc.
scikit-learnで何ができるの(抜粋)
周辺ツール
 特徴抽出・作成
 クロスバリデーション(2章)
 グリッドサーチ
 AUC、ROC描画(3章)
 Accuracy、Recall、F値算出(3章)
()内の章は、はじめてのパターン認識で登場する章
Webで検索してください(汗
まあ、そんなに説明することもないかと
Windows版
インストーラをダウンロードして実行するだけ
Mac版
MacPortsだとデフォルトでインストールされているPythonにイ
ンストールされるみたい
別にPythonをインストールしているならeasy_installかpipの方
がいいと思う
インストールするには?
何はともあれデータセットがないと始まらない
データを準備する
Kaggleにscikit-learnのコンペがあったので、ここからデータをもらうことに
ここから
Download
ページに行ける
データの中身
0.29940251144353242,-1.2266241875260637,・・・
-1.1741758544222554,0.33215734209952552,・・・
1.1922220828945145,-0.41437073477092423,・・・
1.573270119628208,-0.58031780024933788,・・・
-0.61307141665395515,-0.64420413382117836,・・・
:
1
0
0
1
0
:
ラベル
1000サンプル
特徴量
1000サンプル×40変数
Kaggleにデータの説明がないのが残念(本当は背景情報も欲しいところ)
1000行
40変数
Rと同じぐらいのコード量で動かせる
とりあえず動かす
import numpy as np
from sklearn import svm
trainFeature = np.genfromtxt(open(train.csv', 'r'), delimiter = ',')
trainLabel = np.genfromtxt(open(trainLabels.csv', 'r'), delimiter = ',')
clf = svm.SVC(kernel='rbf', C=1)
clf.fit(trainFeature, trainLabel)
testFeature = np.genfromtxt(open('test.csv', 'r'), delimiter = ',')
result = clf.predict(testFeature)
Rと同じぐらいのコード量で動かせる
とりあえず動かす
import numpy as np
from sklearn import svm
trainFeature = np.genfromtxt(open(train.csv', 'r'), delimiter = ',')
trainLabel = np.genfromtxt(open(trainLabels.csv', 'r'), delimiter = ',')
clf = svm.SVC(kernel='rbf', C=1)
clf.fit(trainFeature, trainLabel)
testFeature = np.genfromtxt(open('test.csv', 'r'), delimiter = ',')
result = clf.predict(testFeature)
ライブラリの読み込み
Rと同じぐらいのコード量で動かせる
とりあえず動かす
import numpy as np
from sklearn import svm
trainFeature = np.genfromtxt(open(train.csv', 'r'), delimiter = ',')
trainLabel = np.genfromtxt(open(trainLabels.csv', 'r'), delimiter = ',')
clf = svm.SVC(kernel='rbf', C=1)
clf.fit(trainFeature, trainLabel)
testFeature = np.genfromtxt(open('test.csv', 'r'), delimiter = ',')
result = clf.predict(testFeature)
ファイルからデータを読み込む。
numpyのデータ形式に変換。
Rと同じぐらいのコード量で動かせる
とりあえず動かす
import numpy as np
from sklearn import svm
trainFeature = np.genfromtxt(open(train.csv', 'r'), delimiter = ',')
trainLabel = np.genfromtxt(open(trainLabels.csv', 'r'), delimiter = ',')
clf = svm.SVC(kernel='rbf', C=1)
clf.fit(trainFeature, trainLabel)
testFeature = np.genfromtxt(open('test.csv', 'r'), delimiter = ',')
result = clf.predict(testFeature)
モデルを定義(ここではSupport Vector Classifier)
fit関数を使って教師データからパラメータを推定
Rと同じぐらいのコード量で動かせる
とりあえず動かす
import numpy as np
from sklearn import svm
trainFeature = np.genfromtxt(open(train.csv', 'r'), delimiter = ',')
trainLabel = np.genfromtxt(open(trainLabels.csv', 'r'), delimiter = ',')
clf = svm.SVC(kernel='rbf', C=1)
clf.fit(trainFeature, trainLabel)
testFeature = np.genfromtxt(open('test.csv', 'r'), delimiter = ',')
result = clf.predict(testFeature) 判別したいデータの特徴量を読み込んで、
predict関数を使って判別
モデルを変える時は、定義部分を変更するだけ。後は一緒。
全モデル同じ方法かは調べてませんが・・・。
scikit-learnのいいところ①
from sklearn import svm
:
clf = svm.SVC()
clf.fit(trainFeature, trainLabel)
:
from sklearn import neighbors
:
clf = neighbors.KNeighborsClassifier()
clf.fit(trainFeature, trainLabel)
:
from sklearn.ensemble import RandomForestClassifier
:
clf = RandomForestClassifier()
clf.fit(trainFeature, trainLabel)
:
SVMの時
k近傍法の時
RandomForestの時
まあ、パラメータは把握した方がいいですが
クロスバリデーション、パラメータのグリッドサーチも簡単
scikit-learnのいいところ②
from sklearn import cross_validation
clf = svm.SVC()
scores = cross_validation.cross_val_score(clf, trainFeature, trainLabel, cv=5, n_jobs=-1)
print scores #結果表示
from sklearn.grid_search import GridSearchCV
tuned_parameters = [ #グリッドサーチの探索範囲設定
{'C': [1, 10, 100, 1000], 'kernel': ['linear']},
{'C': [1, 10, 100, 1000], 'gamma': [0.001, 0.0001], 'kernel': ['rbf']},
]
clf = GridSearchCV(svm.SVC(C=1), tuned_parameters, n_jobs = -1) #設定
clf.fit(trainFeature, trainLabel, cv=5) #グリッドサーチに使うデータの入力
print clf.best_estimator_ #パラメータが一番よかったモデルを表示
パラメータのグリッドサーチ
クロスバリデーション
クロスバリデーション、グリッドサーチは特徴量とラベルをnumpyの配列にしておかないとエラーになるので注意
0:00:00
0:01:26
0:02:53
0:04:19
0:05:46
0:07:12
0:08:38
指定なし 1 2 3 4 -1
処理時間[hh:mm:ss]
n_jobs
n_jobsを指定するだけで並列計算できるようになる
クロスバリデーション、グリッドサーチ以外にもランダムフォレ
ストにも使える優れもの
-1だとPCのコア数が自動設定される
並列計算も簡単、そうscikit-learnならね
4コアのMac Book Proで計測
Kaggleにsubmitしてみた
∧,,∧
(;´・ω ・) うーん・・・ まだまだ修行が必要
/ ∽ /
しー-J
ひみつ

More Related Content

2013.07.15 はじパタlt scikit-learnで始める機械学習