Wekaを使って決定木を作っていたのですが,データをarffにするのがめんどくさくて
Pythonの機械学習ライブラリscikit-learnで決定木を作成してみました.
使ってみたかったし
scikit-learnのインストールは他のWebで丁寧に教えてくれます
決定木のオブジェクト自体は結構簡単にできます.
Graphvizはbrewでinstallしましょう(Mac)
pyparsing と呼ばれるライブラリが新しくなってしまっているので
描画したいときは
sudo pip install -U pydot pyparsing==1.5.7
で,ダウングレードしてください
Windowsはわからない(小声)
#-*-coding:utf-8 -*-
# Null値は使えない → どうしよう?
# yes,noは1,-1
# 文字は使えない
from sklearn import tree
from sklearn.externals.six import StringIO
import pydot
if __name__ == '__main__':
X = [
[0,1],
[0,-1],
[1,1]
]
Y = [1,2,3] #上から順に対応している
clf = tree.DecisionTreeClassifier()
clf = clf.fit(X,Y) # これで決定木オブジェクト完成
#描画のためのおまじない
dot_data = StringIO()
tree.export_graphviz(clf,out_file = dot_data)
graph = pydot.graph_from_dot_data(dot_data.getvalue())
graph.write_pdf("tree_ex.pdf")
#pre = clf.predict([0,1])
#print pre #結果は1
X がデータで,Yが各データのラベルになっています.
fit関数でXとYをマッスルドッキングしてます(多分)
fit関数を適用した時点で,clfが決定木オブジェクト兼分類器になっているので
コメントアウトしてあるpredict関数で新しいデータがどのクラスに属するか分類できます.
あとはpydotを呼び出して描画するおまじない,,,のはず
上の描画結果はこんな感じ
Wekaの決定木が見づらくてPythonで決定木を作ろうとしたらこうなりました.
決定木作成自体はとても簡単です.
見やすくはあるのですが
・分岐条件が出てない(実力不足で出せない)
・1項目に1,2,3種類の解答があるアンケートは振り分けられない(yes,noは[1,-1]で実現可)
・Null値・文字列を受け付けない
など,今のところWekaのほうが使いやすい気がします.
引数のオプションつければよくなるんでしょうか...