ZAORIKU's blog

NLPとかプログラム関連のメモを書いていこうかな

scikit-learnで機械学習を試す(win7_py2.7_32)

@wwackyさんの資料や以下のサイトを参照しました。
http://www.slideshare.net/slideshow/embed_code/24320773?startSlide=1#
python機械学習ライブラリscikit-learnの紹介
http://sucrose.hatenablog.com/entry/2013/05/25/133021
以下からscikit-learnをダウンロードする。
http://www.lfd.uci.edu/~gohlke/pythonlibs/

学習データと正解データ

正解データの作り方に注意、縦に作る。学習データはカンマ区切り
 - Gdata.csv 学習データ 横11縦44
 - Glabel.csv 正解データ 横1縦44
 - Gtest.csv テストデータ 横11縦17
 - Gtestlabel.csv テストの正解データ 横1縦17

学習データはガンコミの評価(11変数44サンプル)、評価はオレ評価only w

サンプル例(44):
 ギレン暗殺計画、ジョニーライデンの帰還、蒼穹の勇者たち、ミノフスキー博士物語など...
 僕的にガンダムとしては、最悪なんだけど漫画としては面白いクロスボーンガンダム
 入っているため、学習に混乱を来たすはずw

説明変数(11):0~10段階評価
 構成的描写力、キャラ表現力、メカ的表現力、表現のリアリティ、設定のバランス、
 キャラ設定、MS設定、設定のリアリティ、ストーリー、Gとしてのありなし度、ギャグ度

正解(2値):
 0 :面白くない(24サンプル)
 1 :面白い (20サンプル)


テストデータ・サンプル例(17:正例10、負例7)
 テストデータG系の映像作品とSF調やらのコミック作品を適当に拾った。
 (ガンコミ以外でも使えるのかちょっと見たかったため)
 ガンダム映画作品、ファイブスターストーリーズ、惑星をつぐ者など

機械学習による2値分類を行う
 - clf:SVMのパラメータ調整(c=10,γ=0.001,rbfカーネル)
 - clf2:k-nn 最近傍(k=5)
 - clf3:RandomForest

比較はconfusion_matrix
 テストの正解と比較
 0->0、 0->1、 1->0、 1->1に落ちた数を表示するマトリックス


結果
グリッドサーチでパラメータ調整したSVMとRandamForestがいい。
RFは常に良い感じだった。
RFでよく外す品は、昔ジャンプでやっていた”惑星をつぐ者”
打ち切り作品w確かに僕の中で評価難しい感じだった。

knnはk=1の方がよさげだけど、強く負に引っ張られる感じ。
負例が多いからかも(結果は略)

僕は、ガンダムとしてありなのかどうかを重視する傾向があるのだけど
別にこのデータが無くても判別できるサンプルと説明変数を拾っていたようだ^^;

学習データもテストデータも僕だけの評価であいまいなんだけど
結構、学習してくれて嬉しかったり^^

confusion_matrix
svm(c=10,γ=0.001,rbf)
[[5 2]
[1 9]]

5-nn
[[5 2]
[6 4]]

RF
[[ 6 1]
[ 0 10]]


以下コード

# -*- coding: utf-8 -*-
import numpy as np
from sklearn import svm
from sklearn import neighbors
from sklearn.metrics import confusion_matrix 
from sklearn.ensemble import RandomForestClassifier
from sklearn import cross_validation
import csv # CSVファイルを扱うためのモジュールのインポート
from sklearn.grid_search import GridSearchCV

trainFeature = np.genfromtxt(open('Gdata.csv', 'r'), delimiter = ',')
trainLabel = np.genfromtxt(open('Glabel.csv', 'r'), delimiter = ',')
testFeature = np.genfromtxt(open('Gtest.csv', 'r'), delimiter = ',')
testLabel = np.genfromtxt(open('Gtestlabel.csv', 'r'), delimiter = ',')

#パラメータのグリッドサーチ
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) #設定 n_jobs = -1 全CPU使用
clf.fit(trainFeature, trainLabel, cv=5) #グリッドサーチに使うデータの入力
print clf.best_estimator_ #パラメータが一番よかったモデルを表示

#SVM ガウスカーネル
#clf = svm.SVC(kernel='rbf', C=1)
#clf.fit(trainFeature, trainLabel)

#交差検定
# cross_validation.creoss_val.score():
#     estimator, data, target, K-Foldsイテレータ, n_jobs
#     n_jobs=使用するCPU数。-1なら全CPU。
scores = cross_validation.cross_val_score(clf, trainFeature, trainLabel, cv=4, n_jobs=1)#n_jobs=-1
print scores
#clf.fit(trainFeature, trainLabel)

#K-nn
clf2 = neighbors.KNeighborsClassifier(n_neighbors=5, warn_on_equidistant=False)#, weights="uniform"
clf2.fit(trainFeature, trainLabel)

#RandomForest
clf3 = RandomForestClassifier()
clf3.fit(trainFeature, trainLabel)

#テスト
result = clf.predict(testFeature)
result2 = clf2.predict(testFeature)
result3 = clf3.predict(testFeature)

#データの大きさを確認
print len(trainFeature)
print len(trainLabel)
print len(testFeature)
print len(result)
print len(result2)
print len(result3)

print confusion_matrix(testLabel, result)#label_test, label_predict
print confusion_matrix(testLabel, result2)#label_test, label_predict
print confusion_matrix(testLabel, result3)#label_test, label_predict

 
#filename = "table.csv"

#sample01_writer = csv.writer(open(filename,'w'),lineterminator='\n')
#sample01_writer.writerow(result)
#sample01_writer.writerow(row) # "row" is a list_object .

#for label in result: print label

後で良く読む
Pythonのscikit-learnでRandomForest vs SVMを比較してみた
http://d.hatena.ne.jp/yutakikuchi/20121012/1349997641