パンダの休日

雑多な書き残し

上記の広告は1ヶ月以上更新のないブログに表示されています。
新しい記事を書く事で広告が消せます。
rfg1_4_51.png


今流行のディープラーニング乗り損ね組ですこんばんは。
ディープラーニングは色々調べたのですがどうにも1から書くには数学力が足りないようなのでコスパ最高と名高いランダムフォレストをPythonで書いてみました。
主たる部分の行数が100行と少し。流石コスパ最高。
後から読んで何も分からないような汚いコードを書いてしまったので、ググってもあまり出なかったポイントの独自解釈を載せます。
(この解釈で結果はそこそこ正確でしたがランダムフォレストとして正しいかは分かりません。)


1.入力データ
分類の場合
[float(入力1), float(入力2), float(入力3), ... , str(出力)]
入力は数学関数に使うのでそれに合うもの、出力の型は==で一致が確認できるものならなんでも。
回帰の場合
[float(入力1), float(入力2), float(入力3), ... , float(出力)]
出力は平均をとる必要があるのでintかfloatを。
入力は何元でも良いが出力に2元以上が使えるかは不明。恐らく不可。

2.分岐関数
豆腐に包丁を入れるようにn元空間を平面でひたすら切って細かい空間にするための関数。
  例 : f(x, y) = ax + by + c (2元1次の関数)
2次以上の関数で空間を切る意味がないので1次関数(平面)を使う。
入力次元の平方根の元数を使うのが良いらしい。
傾きや切片を細かくして精度が上がるような仕組みではないので荒くても良い。(傾き10種類で18度ずつ等)
分類の場合は切った左右でエントロピーを計算して重み付けした和が最も小さくなる関数を用いる。
回帰の場合は左右それぞれに「各データの平均からの差の2乗」の和を計算し、左右の値の和が最も小さくなる関数を用いる。

3.データのランダム選択と量
手続:
渡されたデータを重複を許しランダムに7割ほど選ぶ。
→選ばれた7割を上手く分割する関数を探す。
元のデータをその関数で分ける。
分けたデータをそれぞれに同じ関数に再帰的に渡す。
1分岐ごとに半分になるので1木あたり5*2^分岐深度ほどの量が必要。
データの選択は重複を許すがデータ2個で同じものを拾うと分岐が上手くいかずエラーになる可能性がある。

4.木の構成
def 木を作る(データ, 深度):
if 渡されたデータが1種類か深度達成:
return(そのデータの出力値)
else:
ほげほげ
return([条件, 木を作る(真データ, 深度+1), 木を作る(偽データ, 深度+1)])
のようにしておくと
while True:
if type(tree) != type([]):
return tree
if 条件:
tree = tree[1]
else:
tree = tree[2]
のようにして拾いやすい。

5.木の重み付け
データの数がしょぼいと過学習に陥っているように感じる。
(しなくてもいい気がする・・・)

6.判定
分類は単純多数決。100本なら100本の木全てに分類させたいデータを渡して分類させ、最も多いものが判定結果となる。
回帰は上と同様にして得た値の平均が判定結果となる。


上記画像はある点からの距離を回帰でランダムフォレストに判定させたものをリニアングラフをお借りしてグラフ化したもの。
粗い方が趣があるので木50本深さ4。
スポンサーサイト

shader

Author:shader
多趣味飽き性に振り回されて色々やってます。

直接連絡したい方は御気軽にメールしてください。 3日以内には返信させて頂きます。

名前:
メール:
件名:
本文:

上記広告は1ヶ月以上更新のないブログに表示されています。新しい記事を書くことで広告を消せます。