fc2ブログ
scikitlearnでRandom Forests
Random Forestsという機械学習の方法論があります。すこし前に興味があって、自分で実装してみたりしたのですが、scikit-learnを使えばPythonで簡単に実行できます。

from sklearn.ensemble import RandomForestClassifier
from sklearn.metrics import accuracy_score
clf = RandomForestClassifier(n_estimators=5000, #森の中の木の数
max_depth=None,
#最後サンプルのクラスが均一になるか、min_samples_split個になるまで分割
min_samples_split=2,
random_state=0,#乱数のseed?
criterion='entropy',#分割の方法、これかgini
verbose=1)#出力レベルの調整
forest = clf.fit(X, y) #Xは行がサンプルの2次元array、yはクラスを表現する1次元array
accuracy_score(y2,forest.predict(X2)) #X2は別のデータセット。その正解y2をどれくらい予測できるかが計算される。
#チュートリアルだと、以下のcross validationを利用
scores = cross_val_score(clf, X, y)
scores.mean()

実装するとアルゴリズムが完全に理解できるので良いですが、使いながら理解していくという方法もありかもしれません。
スポンサーサイト



【2014/08/29 16:26】 | Python | トラックバック(0) | コメント(0) | page top↑
Pandas.DataFrameでデータの標準化
データの標準化という言葉が正しいのかどうか、ちょっと不確かなんですが、時々、各データから、平均値を引いて、標準偏差で割りたいときがあります。DataFrameでそれを各行のデータについてやりたいときは、こうします。

d = pd.DataFrame({'a':[1,2,3],'b':[3,4,5]})
m = d.mean(1)
s = d.std(1)
nd = d.sub(m,axis=0).div(s,axis=0)

【2014/08/26 18:22】 | Python | トラックバック(0) | コメント(0) | page top↑
分類用の色付けを持ったヒートマップを描く
何らかの方法でクラスタリングして、その分類を示しつつ、もとのデータの状態をヒートマップで確認したいというような要望が良くあるような気がします。例えば、AffinityPropagation法を使ってデータをクラスタリングした場合はこんな感じです。

from sklearn.cluster import AffinityPropagation
from sklearn import metrics
from sklearn.datasets.samples_generator import make_blobs

# dataはいつものように、pandas.DataFrame(サンプルは列方向)
# 行方向にサンプルが並んでいるときはTいりません。
af = AffinityPropagation(preference=-2000).fit(data.T)
# サンプルをクラスターグループごとに並べます。
_idx = []
for i,c in enumerate(af.labels_):
_idx.append((c,data.columns[i]))
_idx.sort()
sorted_data = data[[v[1] for v in _idx ]]
# サイズはお好みで。
fig = pylab.figure(figsize=(16,9))
ax1 = fig.add_axes([0.07,0.2,0.85,.6])
im = ax1.matshow(sorted_data.ix[idx],vmin=0.0,vmax=1.0,aspect='auto',cmap = plt.get_cmap('Blues'))
ax1.set_axis_off()
axcolor = fig.add_axes([0.94,0.4,0.02,0.2])
pylab.colorbar(im, cax=axcolor)
# クラスター番号の並び配列を用意します。
import copy
c_data = copy.deepcopy(af.labels_)
c_data.sort()
cmap = plt.cm.jet
cmaplist = [cmap(i) for i in range(cmap.N)]
random.shuffle(cmaplist)
cmap = cmap.from_list('My cmap', cmaplist)
ax2 = fig.add_axes([0.07,0.17,0.85,0.02])
ax2.matshow([c_data], cmap=cmap, interpolation='nearest',aspect='auto')
ax2.set_axis_off()
fig.show()
fig.savefig('my_img.png')

出来上がりはこんな感じ。ちなみに、クラスターの色分けをrandom.shuffleしているのは、そのままだと隣り合った色がどうしても似てしまって分かりにくいから。しかし、これだと結果がその都度変わるなーと思ったり。
cls15.png
【2014/08/18 19:50】 | Python | トラックバック(0) | コメント(0) | page top↑
Pandas.read_csvのちょっとした話
Pandas.DataFrameをmatshowとかでとりあえず描画しようとしたら、「Image data can not convert to float」と言われて、エラーになりました。どう考えても中身はfloatだろうに、と思っていたら、軽い落とし穴が。
時々、ファイルの1行目がヘッダで、2行目にいならい説明が入っていたりします。
ID  sample0 sample1 sample2...
exp str0    str1   str2...
ID0 0.11    0.22   0.33...
みたいな感じです。
こんなファイルを一度全体を読み込んでから、expの1行削除すると、推定されたデータ型がObjectになってしまうので、読み込む時にスキップします。

pandas.read_csv('data_file', sep='\t', index_col=0,skiprows=[1,],na_values=(' ',' ','','NA')))

skiprowsのところです。0行目はヘッダ行なので、1行目を読みとばします。こうすると、Pandasがきちんとfloatだと推定してくれるので、助かります。
【2014/08/18 14:33】 | Python | トラックバック(0) | コメント(0) | page top↑
| ホーム |