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

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

ただいまの
回答率

90.85%

  • Python

    6325questions

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

  • Python 3.x

    4811questions

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

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

解決済

回答 1

投稿 編集

  • 評価
  • クリップ 0
  • VIEW 333

A.Kobayashi

score 7

前提・実現したいこと

ランダムフォレストでは一般的にオリジナルのサンプルから約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が出力されるのが確認できると思います。

該当のソースコード

from sklearn.ensemble import RandomForestClassifier
import pydotplus as pdp
from sklearn.datasets import load_iris
from sklearn import tree


# irisデータの読み込み
iris = load_iris()


# ランダムフォレスト設定
rf = RandomForestClassifier()
rf.fit(iris.data, iris.target)

# フォレスト視覚化
estimators = rf.estimators_
file_name = "./tree_visualization.png"
dot_data = tree.export_graphviz(estimators[0], # 決定木オブジェクトを一つ指定する
                                out_file=None, # ファイルは介さずにGraphvizにdot言語データを渡すのでNone
                                filled=True, # Trueにすると、分岐の際にどちらのノードに多く分類されたのか色で示してくれる
                                rounded=True, # Trueにすると、ノードの角を丸く描画する。
                                feature_names=iris.feature_names, # これを指定しないとチャート上で特徴量の名前が表示されない
                                class_names=iris.target_names,# これを指定しないとチャート上で分類名が表示されない
                                special_characters=True # 特殊文字を扱えるようにする
                                )
graph = pdp.graph_from_dot_data(dot_data)
graph.write_png(file_name)


```

補足情報(言語/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倍くらいで試す方法などがあればと思っています。

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

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

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

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

回答 1

checkベストアンサー

+1

手元にあるこちらの本(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 17:37

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

    キャンセル

  • 2017/12/15 17:42

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

    キャンセル

  • 2017/12/15 17:42

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

    キャンセル

  • 2017/12/15 17:46

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

    キャンセル

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

  • ただいまの回答率 90.85%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

関連した質問

同じタグがついた質問を見る

  • Python

    6325questions

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

  • Python 3.x

    4811questions

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