Python-機械学習こんにちは。takapy(@takapy0210)です。最後にはじめにランダムフォレストは機械学習を勉強したことのある人であれば一度は見聞きしたことのある手法でしょう。回帰でもクラス分類でもランダムフォレストが広く使われており、多くの場合パラメータチューニングをせずに使えるし、データのスケール変換も必要ないので、とても手軽に使うことができます。名前からも想像できるように、ランダムフォレストとはいくつもの異なる決定木を作りそれらをアンサンブルして予測するモデルです。「いくつもの異なる決定木とは、具体的にどうやって生成しているのか」それをまとめた記事です。ランダムフォレストとは繰り返しになりますが、ランダムフォレストとは、決定木の問題点であった「訓練データに対する過剰適合」に対応する方法の1つであり、少しずつ異なる決定木をたくさん集めたものでアンサンブル学習します。ランダムフォレストは個々の決定木は比較的うまく予測できているが、一部のデータに対して過剰適合してしまっているという考えに基づいています。それぞれ異なった方向に過剰適合した決定木をたくさん作れば、その結果の平均を取ることで過剰適合の度合いを減らすことができる、という訳です。この戦略を実装にするには、たくさんの決定木を作成するだけでなく、個々の決定木はある程度ターゲットを予測でき、かつお互いに違っていなければなりません。このお互い違うという部分を実現するために、決定木の構築過程で乱数を導入しています。この乱数の導入方法には以下の2つがあります。ブーストラップサンプリング(決定木を作るためのデータを選択する方法)特徴量選択(分岐テストに用いる特徴を選択する方法)この2点について解説した後に、pythonで実装してみます。以下に説明する「ブーストラップサンプリング」と「特徴量選択」により、ランダムフォレスト中の決定木が、それぞれ異なるものになります。ブーストラップサンプリングランダムフォレストが決定木を作るときに、まずデータからブーストラップサンプリングと呼ばれる手法でデータを抽出を行います。これは、n_samples個のデータから重複を許可した状態でデータをランダムにn_samples回選択するという手法です。(復元抽出)これによって、もとのデータセットと同じ大きさだが、データの一部(だいたい3分の1)が欠け、一部が何度か現れるデータセットを得ることができます。'a']などを得ることができます。ここで得ることのできた新しいデータセットで決定木を作っていきます。決定木の個々のノードは全ての特徴量を用いて最適なテストを選んで作成されています。ランダムフォレストが作る決定木は最適なテストを選ぶのではなく、特徴量のサブセットをランダムに選択し、その特徴量を使うものの中から最適なテストを選びます。これはパラメータmax_featuresで指定することができます。max_featuresの値に元々の特徴量と同じ数値を設定すると、特徴量選択時の乱数生は無くなります。max_featuresを1に設定すると、分岐時に使う特徴量選択にはまったく選択肢がないことになります。したがって、max_featuresを大きくするとランダムフォレスト中の決定木が似たようなものになり、max_featuresを小さくするとランダムフォレスト中の決定木は相互に大幅に異なるものになります。この特徴量選択によって、決定木の個々のノードが異なる特徴量のサブセットを使って決定を行うようになります。下記のようなデータセットを想定し、性別のクラス分類をしたいと想定します。データセットブーストラップサンプリングでは、生成する決定木の数だけ下記のように新しいデータセットを生成します。ブーストラップサンプリング特徴量選択では、ある決定木のあるノードを生成する際に使う特徴量を限定します。あった特徴量は身長、体重、年齢でしたが、下記は、それぞれの決定木のそれぞれのノードを生成する際に使用する特徴量をランダムで2つ選択した例です。特徴量選択pythonで実装&可視化make_moonsデータセットを用いてランダムフォレストモデルを生成し、どのようなクラス分類しているかを可視化してみます。y_train)決定木の数=5決定木の数を増やすと、境界線も滑らかになることが分かります。y_train)決定木の数=8最後に上記でも見てきましたが、ランダムフォレストで優先して調整するべきパラメータとしては、n_estimators、max_features、max_depthなどの事前枝刈パラメータです。n_estimatorsは大きければ大きいほど良いとされていますが、大きくすることによる利益は徐々に減りますし、メモリの量も訓練にかかる時間も増大します。基準としては時間とメモリのある限り大きくするというものを設けておくと良いかもしれません。max_featuresは基本的にはデフォルト値をそのまま使えば良い精度になる場合が多いです。追加でmax_leaf_nodesを追加すると性能が向上する可能性もあるため、その辺りはパラメータチューニングをやってみて決定していくと良いと思います。12:01ランダムフォレストはなぜ「ランダム」なのか関連記事2019-12-14データ分析コンペで使っているワイの学習・推論パイプラインを晒しますこんにちは!たかぱい(@takapy0210)です。...こんにちは!たかぱい(@takapy0210)です。線形サポートベクタマシン)こんばんは。toC企業でMLエンジニアとして働いています。ブログでは主に機械学習界隈の話ができればと思っています。(1)月別アーカイブリンクプライバシーポリシ。