質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.50%
Python 3.x

Python 3はPythonプログラミング言語の最新バージョンであり、2008年12月3日にリリースされました。

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

Q&A

解決済

1回答

4500閲覧

ランダムフォレスト内で決定木に使われるサンプル数とオリジナルのサンプル数について

A.Kobayashi

総合スコア13

Python 3.x

Python 3はPythonプログラミング言語の最新バージョンであり、2008年12月3日にリリースされました。

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

0グッド

0クリップ

投稿2017/12/15 07:24

編集2017/12/15 07:59

###前提・実現したいこと
ランダムフォレストでは一般的にオリジナルのサンプルから約0.632倍したデータ数を決定木のサンプルとして抽出し、
スコア平均をとって算出していると理解しているのですが、この0.632倍の値を他の値に変えることはできますでしょうか。

0.632倍に関する資料
https://modeling.uconn.edu/wp-content/uploads/sites/1188/2016/05/Optimizing-Random-Forests-propensity-score.pdf

異常検知で外れ値が少ないため、全体的にサンプル数の割合を増やしたランダムフォレストをつくりたいと考えています。

データをirisに置き換えたコードを以下に載せておきます。
コードを動かすとsamplesが150ではなくなり100くらいに、valueもそれぞれ50ぴったりでない状態pngが出力されるのが確認できると思います。

###該当のソースコード

python3.6

1from sklearn.ensemble import RandomForestClassifier 2import pydotplus as pdp 3from sklearn.datasets import load_iris 4from sklearn import tree 5 6 7# irisデータの読み込み 8iris = load_iris() 9 10 11# ランダムフォレスト設定 12rf = RandomForestClassifier() 13rf.fit(iris.data, iris.target) 14 15# フォレスト視覚化 16estimators = rf.estimators_ 17file_name = "./tree_visualization.png" 18dot_data = tree.export_graphviz(estimators[0], # 決定木オブジェクトを一つ指定する 19 out_file=None, # ファイルは介さずにGraphvizにdot言語データを渡すのでNone 20 filled=True, # Trueにすると、分岐の際にどちらのノードに多く分類されたのか色で示してくれる 21 rounded=True, # Trueにすると、ノードの角を丸く描画する。 22 feature_names=iris.feature_names, # これを指定しないとチャート上で特徴量の名前が表示されない 23 class_names=iris.target_names,# これを指定しないとチャート上で分類名が表示されない 24 special_characters=True # 特殊文字を扱えるようにする 25 ) 26graph = pdp.graph_from_dot_data(dot_data) 27graph.write_png(file_name) 28
###補足情報(言語/FW/ツール等のバージョンなど) Python3.6 ライブラリ:sklearn 0.19.1 http://scikit-learn.org/stable/modules/generated/sklearn.ensemble.RandomForestClassifier.html 乏しい英語力で読んで、色々試したものの分からず… 可視化ツール:Graphviz Graphviz導入時に参考にしたサイト http://own-search-and-study.xyz/2016/08/16/python3%e3%81%a7scikit-learn%e3%81%ae%e6%b1%ba%e5%ae%9a%e6%9c%a8%e3%82%92%e6%97%a5%e6%9c%ac%e8%aa%9e%e3%83%95%e3%82%a9%e3%83%b3%e3%83%88%e3%81%a7%e7%94%bb%e5%83%8f%e5%87%ba%e5%8a%9b%e3%81%99%e3%82%8b/ できるならライブラリを使ったやり方で解決したいです… また直接的な解決策でなくても、関連する知見や情報でも助かります。 よろしくお願いいたします。 追記 sklearnのbootstrap=Noneにすることでサンプル数=オリジナルのサンプル数となることまでは試していて、まあ結果も悪くは見えないので十分なのかもしれませんが、0.8倍くらいで試す方法などがあればと思っています。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

ベストアンサー

手元にあるこちらの本(p87)を参照しましたが、sklearnのRandomForestでは各木の学習時のサンプル数は教師データと同じ数を使っているようです。ただ、Bootstrapを使っていて、サンプルを選ぶ際に重複を許します。
https://www.amazon.co.jp/dp/B01HGIPIAK/ref=dp-kindle-redirect?_encoding=UTF8&btkr=1
https://qiita.com/mshinoda88/items/8bfe0b540b35437296bd

インスタンス化する際に以下のオプションをFalseにすると全データが使われると考えられます。
bootstrap : boolean, optional (default=True)
サンプルに対するランダム性がなくなります。

https://stackoverflow.com/questions/35827446/how-can-scikit-learn-random-forest-sub-sample-size-may-be-equal-to-original-trai


追記:
bootstrapはもうお試しなのですね…

それならライブラリがそのまま提供しているところではできることは少ないかもしれません。
8割のサンプルがbootstrapに選ばれるような乱数シードを見つけるのは、…現実的ではないですね。

ソースコードをダイレクトに書き換えることは可能です。
https://github.com/scikit-learn/scikit-learn/blob/master/sklearn/ensemble/forest.py#L103
移植性は減りますが…

投稿2017/12/15 08:26

編集2017/12/15 08:38
mkgrei

総合スコア8560

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

A.Kobayashi

2017/12/15 08:37

追記で書いたように、私もマニュアル読んでbootstrapをいじることまではしていたのですが、0.632~1の任意の値を指定するのはsklearnでは難しそうですかね Python機械学習プログラミングのいい噂はかねがね聞いていたのですが、まだ入手してなかったので今度買って勉強したいと思います。
A.Kobayashi

2017/12/15 08:42

まあ細かすぎて本当にやるならダイレクトに書き換えるしかないですよね... とても参考になりました、ありがとうございました。
mkgrei

2017/12/15 08:42

サクッと実践できる簡単なアイデアとして、 異常値が少ないのなら、fitする際に異常値のsample_weightを増やすのはどうでしょうか。
A.Kobayashi

2017/12/15 08:46

確かに手軽で上より実用的な感じがしますね また色々試してみたいと思います、本当にありがとうございます。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.50%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問