著者:chen_h
マイクロ・シグナル&QQ:862251340
マイクロチャネル公共数:coderpai
(C)Pythonのランダムフォレストアルゴリズムとの取引を
(IV)の実装とPythonでランダムな森林の解釈
シングルユースから決定木を構築することにより、およびランダムフォレストを理解します
幸いなことに、同じようなライブラリのScikit-学び、今ではPythonで機械学習アルゴリズムの数百を実装することは容易です。それは簡単です、私たちは通常モデルはそれを使用するためにどのように動作するかのいずれかの知識は必要ありません。すべての詳細を知っているが、機械学習モデルの仕事は非常に有用であり続けている方法を理解する必要はないが。これは、パフォーマンスの低下、またはどのように我々は我々のモデルを信じるように他人を説得したい場合、これは必要不可欠である、意思決定を行うためにモデルを解釈することです私たちはモデルのパラメータを変更することができます。
この記事では、Pythonでランダムフォレストを構築し、使用する方法について説明します。コードを見ていることに加えて、我々はどのようにこのモデルを理解しようとします。ランダムフォレストツリーは、多くの構成なので、我々は最初の単一の決定木は、簡単な質問を分類する方法を理解する必要があります。その後、我々は、科学的データの実世界の問題を解決するために、ランダムな森林を使用しようとします。
決定木を理解します
ビルディングブロックは、ランダムフォレストツリーで非常に直感的なモデルです。私たちのために決定木のシリーズは、データ分類発行/かどうかであると私たちは見ることができます。我々は(理想的な世界で)決定を下す前に、我々は、利用可能なデータに対するクエリの一連の、または一連の機能を要求されます:私たちが行うようにそれを分類することができますので、これは解釈モデルです。
CARTアルゴリズムにおいて、決定木を構築する(ノードの分割と呼ばれる)特性を決定することにより前記決意はジニ指数によって実行後の時点でのノード。私たちは、高いレベルでそれを理解できるように、後に詳細にジニ係数の詳細を議論するが、まず、レッツ・ビルド決定木ます。
簡単な問題に関する決定木
我々は非常に単純なバイナリの分類から始めましょう、次のように始まりました:
我々のデータのみ、X1及びX2を備え、図6つのデータサンプル、0と1は、2枚のラベルに分割されます。この問題は非常に簡単ですが、それは、直線的に不可分であるが、これは我々が分類データにデータを通る直線を引くことができないことを意味します。
しかし、我々はノードを呼び出すフレーム、複数に、データ点を一連の線を描くことができます。実際には、これはトレーニング中に行う意思決定ツリーの動作です。簡単に言えば、決定木は、線形境界構造の多くを構築することにより、非線形モデルです。
決定木を作成し、学習データにするために、我々はにsklearnを使用しています。
from sklearn.tree import DecisionTreeClassifier
# Make a decision tree and train
tree = DecisionTreeClassifier(random_state=RSEED)
tree.fit(X, y)
それは特性や分類に応じて勉強できるように、トレーニング中に、我々は機能とモデル・ラベルを提供します。その後、我々はテストのための学習データに我々のモデルに直面することができます。PS:私たちはデータをテストしていないため。
print(f'Model Accuracy: {tree.score(X, y)}')
Model Accuracy: 1.0
我々は、これは我々がそれをトレーニングデータを与えたので、私たちが期待したものであり、木の深さを制限しない、100%の精度を得る参照してください。事実が証明しているように完全に、それは我々が後で議論するオーバーフィッティング、につながる可能性があるため、不利決定木かもしれトレーニングデータを学習する機能。
可視化ツリー
我々は決定木を訓練するときに、実際には変化が起こるものの一部ですか?その決定木の可視化を理解するための方法を私達見つけ、我々はscikit-学ぶことができ、次のように、機能:
リーフノードに加えて、すべてのノードが5つの部分を持っています:
- フィーチャベースのクエリ、各分割ノードは、ツリーを下に移動し、回答に基づいて、データポイントを真の答えまたはfalseを与えるだろう。
- ジニ:ジニインデックスノード。我々は下方に移動すると、加重平均ジニ係数は減少します。
- サンプル:観測ノードの数。
- 値:各クラス内のサンプルの数。例えば、最上位ノードは、クラス0に2つのサンプルクラス内の4個の1のサンプルがあります。
- クラス:中間ノードの分類のほとんど。サンプル中のすべてのノードのために予想されるリーフノードに、
これらはどこ最終的な予測であるため、リーフノードを理解するために、何の問題もありません。クラスはリーフノードに到達すると予測されるまで、新しいデータポイントを分類するために、我々は、ライン上の下のデータポイントに回答質問への利用の特徴点を必要としています。
別の方法でツリーを見るために、我々は、元のデータ上に構築されたスプリットデシジョンツリーを描くことができます。
各行は、ノードに分割されたデータ点の特性値に応じて、分割されています。この簡単な質問のために、我々は最大の深さを制限するものではありませんが、パーティションは、同じクラスの時点で、各ノードのポイントに配置されます。それはオーバーフィットにつながる可能性があるため、その後、私たちは、私たちが望むものではないかもしれないトレーニングデータのように完璧な区分が表示されます。
ジニ不純物
このセクションでは、我々はジニ純度の概念を理解することはありません。ジニはない純度ノードノードは、実際には、試料中のノードの分布がある場合、ランダムに選択されたサンプルが間違ったマークされている確率があります。例えば、最上位ノードは、ジニ不純物は44.4%でした。私たちは、次の式を使用して、この値に来ます:
ジニ不純物ノードは、nは1マイナス各クラスの確率の平方の和です。私たちは、ルートの例をしなければならないので、これは、混乱少し聞こえることがあります。
、機能ツリーにそれによってジニ不純物を最小限に抑えるために、各ノードで分解。
それは最大深さに到達するか、各ノードからのサンプルのみが1つのクラスを含有するまで、それは、貪欲再帰的プロセスを分割するために、この手順を繰り返します。各総ジニ不純物木に重み付けを低減しなければなりません。ツリーの第二の層で、0.333ジニ不純物の合計加重値。
最後に、総重量ジニ不純物の最後の層は、各ノードが純粋ではなく、誤って分類ランダムに選択されたノードの観点からであることを意味し、0になります。これは、ノードがビルドにのみ利用できるトレーニングデータであるため、モデルは、オーバーフィッティングことが非常に良いことのようですが、この意味しています。
過剰適合すること:なぜ木の森よりも優れています
決定木を使用していないなぜあなたは尋ねるかもしれませんか?それはどんなミスをしていないので、完璧な分類子のようです!ない間違ったデータポイント。しかし、覚えておくべき重要な点は、この木は、トレーニングデータの間違いをしないようにということです。対象機械学習モデルは、それが前に見たことがなかった新しいデータの良い概要です。
我々は非常に柔軟なモデル(高容量のモデル)を持っている場合、それは基本的にモデルを生成するためのトレーニングデータが密着することですので、それは、過剰適合発生する可能性があります。問題は、モデルがトレーニングデータの実際の関係を学習しているだけでなく、任意のノイズ存在を学習するということです。高分散による柔軟なモデル、トレーニングデータと(そのような決定ツリー構造など)学習パラメータが大幅に変更されますので。
それはトレーニングデータ(たとえば傾向にあるデータのアイデアを。事前に練ら)という仮定を作るので、一方、柔軟なモデルは、高バイアスを持っているとは考えられない、線形分類器は、データが線形であると仮定し、持っていません非直線的な関係に適応するための柔軟性を提供します。柔軟なモデルは、モデルがうまく新しいデータに拡張することができない、高分散と高偏差、両方のケースでは、トレーニングデータに適応できないことがありません。
決定木は、それが唯一のカテゴリがあり、それはリーフノードになるまで、それは、無限の成長を維持することができることを意味し、無制限の柔軟性を持っているので、オーバーフィットすることは非常に容易であるため、ときに我々は完全にこれらのすべてを実施し、最大の深さを制限するものではありません。分類。あなたは決定木と最大画像の深さに戻った場合は2(スプリット回のみ)に制限され、分類はもはや100%正しいではありません。私たちは、分散決定木を減少させたが、増加した偏差のコストで。
私たちは、木の深さを制限するため、決定木は、我々は、単一と呼ばれるランダムな森林に統合モデルの広いセットを適用することができます。これは、分散(良い)を低減し、偏差(差)を増加します。
ランダムフォレスト
ランダムフォレストモデルは、多くの決定木で構成されています。このモデルは、単純に(私たちは「森」と呼ぶかもしれないもの)の木の平均予想ではなく、二つの重要な概念の使用は、それがランダムな名前です。
- ツリーを構築する際のデータポイントを訓練のランダムサンプル
- 分割ノード考慮すべき機能のランダムなサブセット
トレーニングデータのランダムなサンプル
訓練すると、ランダムフォレストは、各ツリーは、データポイントのランダムなサンプルから学ぶことができます。サンプルのいくつかは、ツリー内で複数回使用されることを意味し、ブートストラップと呼ばれる代替サンプリング、とサンプル。各ツリーのためのトレーニングデータの特定のセットに関して非常に異なっていますが、フォレスト全体の一般的に言えば、小さな変動が、増加しませんが、アイデアは、各ツリーの異なるサンプルを訓練することです価格の偏差。
テストする場合は、各決定木の平均予測を予測します。プロセスの異なるサブ平均予測の各学習データにそのようなトレーニングセット次に、袋詰めと呼ばれ、それはバギングの略語です。
ノードを分割するために使用される機能のランダムなサブセット
各決定木のための各分割ノードのすべての機能のサブセットのみを考慮ランダムフォレストのもう一つの主要な概念、。典型的には、これは、分類のためSQRT(n_features)、16がある場合、前記各ツリー内の各ノードは、4つのランダム分割ノードの機能だけを考慮することを意味するに設定されています。(ランダムフォレストはまた、一般的に、回帰に使用される各ノードの機能の全てを企図。これらのオプションは、ランダムフォレストの実装をScikit・ラーン制御することができます)。
あなたのアイデアを袋詰め、決定木を理解し、機能のランダムなサブセットすることができます場合は、ランダムな森林に取り組むの理解は良いがあります。
わずかに異なるトレーニングにランダムフォレストツリー一緒に数百または数千には、機能の限られた数、ツリー内の各分割ノード与えられ、各トレーニング決定木を設定します。ランダムフォレスト、最終的な予測は、各ツリーで平均予想を作ることです。
あなたはテスラの株価が上昇するかどうかを決定する必要があり、あなたはアナリストの事前知識を持っていない会社のダースを訪問することができます:より良い単一のツリーよりも、なぜランダムフォレストを理解するには、次のシナリオを想像してみてください。彼らはいずれかの仮定、データを持っていないとの報道から学ぶに集中することができますので、それぞれのアナリストは、下のバイアスを持っています。
これは理想的な状況のようですが、問題は、ノイズ含まれていてもよい、実際の信号に加えて報告されています。アナリストは、完全にデータに基づいて予測を行うので - 彼らは無関係に振り回されるかもしれない情報 - 彼らは高度な柔軟性を持っています。アナリストは、別の予測に焦点を当てることができ、同じデータから来ます。レポートは異なるトレーニングセット指定された場合に加えて、個々のアナリストは非常に異なっており、前方に非常に異なる予測を入れます。
ソリューションは、任意の一人ではなく、各アナリストのために一緒に投票結果をもたらすことに依存していません。各アナリストの報告書の一部のみのアクセス、およびサンプリングしてノイズ情報の影響を相殺するために願いをできるように、ランダムな森のような、また。実際の生活の中でアイデアは、我々はそのため、決定木だけでなく、直感的でなく、彼らは同様に一緒にフィット森の中にランダムにある、(アマゾンの独立したレビューを信じていない)、さまざまなソースに依存しています。
ランダムフォレスト・プラクティス
次に、我々はPythonでランダムな森林利用を構築するためにScikit-学びます。私たちは、むしろ簡単な質問を学ぶよりも、実際のデータ・セットのトレーニングとテストセットに使用されます。我々はまた、私たちはモデルをオーバーフィッティングの程度を決定することを可能にする新しいデータの実装としてテストセットを推定するモデルを使用します。
データセット
私たちは、問題は、バイナリ分類タスクで解決したい、目標は、個人の健康状態を予測することです。これらの機能は、個人の社会経済及び生活様式の特性、体調不良のラベルは0、1つの健康状態です。ここで使用可能な疾病管理予防センターが収集したデータセット、(https://www.kaggle.com/cdc/behavioral-risk-factor-surveillance-system)。
一般的に、機能の時間のためのデータ科学プロジェクトの80%は、探査と生産データをクリーンアップします。しかし、この記事のために、私たちは、ダイレクトモデリングを使用します。精度は、適切な指標ではないので、この不均衡は、分類問題です。代わりに、我々は0(最悪)1を測定することから(最高)ROC AUCを用いて評価し、0.5のランダムな推測スコア。また、モデルを評価するためのROC曲線を描くことができます。
次のようにその後、我々は、ランダムフォレストコードを学ぶために開始しました:
from sklearn.ensemble import RandomForestClassifier
# Create the model with 100 trees
model = RandomForestClassifier(n_estimators=100,
bootstrap = True,
max_features = 'sqrt')
# Fit on training data
model.fit(train, train_labels)
トレーニングの数分後、モデルは次のようにテストデータを予測する準備ができています:
# Actual class predictions
rf_predictions = model.predict(test)
# Probabilities for each class
rf_probs = model.predict_proba(test)[:, 1]
私たちはクラス予測とROC AUCを計算する予測確率(predict_proba)。我々は予測することがテストした後、我々はROC AUCを計算することができます。
from sklearn.metrics import roc_auc_score
# Calculate roc auc
roc_value = roc_auc_score(test_labels, rf_probs)
結果
ランダムフォレスト最終テストROC AUCは0.87で、最大の単一の決定木は、無制限の深最終テスト0.67のROC AUCを持っています。私たちは訓練のポイントを見てみると、2つのモデルが、我々はこれらのモデルは、トレーニングラベルを提供与えるので、各ツリーの最大の深さを制限するものではありませんが、期待され、ROC AUC 1.0に達しています。
ランダムフォレストは、(テストデータのトレーニングデータのより良い)、オーバーフィット、それは単一のツリーよりも、テストデータを促進するために、より良いですが。ランダムフォレスト同じ低バイアス決定木を(も非常に良い)を維持しながら、より低い分散(良い)を有します。
また、ROC曲線の木(上)とランダムフォレスト(下)をプロットすることができます。上部と左カーブで、より良いモデルです。
上記は、ROCの決定木であります
図は、ROCランダム森林であります
我々が使用できる別の評価モデル、混同行列:
モデルが正しく左右のコーナーと左下と右上の予測のモデル誤差で予測することをこれは示しています。我々は我々のモデルを診断するためにこれらの数字を使用し、それが生産に入るために十分に行っているかどうかを判断することができます。
機能の重要性
それは、スプリット機能のすべてのノードの合計でランダムフォレストジニ不純物の低減が重要であることを表します。私たちは、機能の最も重要な予測因子としてランダムフォレストを見つけることを試みるためにこれらを使用することができます。次のようにそれはそれは、パンダボックス訓練を受けた林ランダム重要なデータの特徴やプットから抽出することができます。
import pandas as pd
# Extract feature importances
fi = pd.DataFrame({'feature': list(train.columns),
'importance': model.feature_importances_}).\
sort_values('importance', ascending = False)
# Display
fi.head()
feature importance
DIFFWALK 0.036200
QLACTLM2 0.030694
EMPLOY1 0.024156
DIFFALON 0.022699
USEEQUIP 0.016922
それは私たちが問題を理解することができ、私たちのクラス間で最も差別を特徴と特性の重要性を教えてください。例えば、どこ患者のDIFFWALKの歩行困難の特性かどうかの表示が最大の特徴です。
分析の最も重要な機能を構築することによって、私たちは学習に重要度の高い機能を使用して、機能の低い重要性を削除することができます。
可視化ランダムフォレスト
最後に、私たちは森の中で単一のツリーを可視化することができます。今回は、木の深さを制限しなければならない、またはそれを画像に変換するには大きすぎるだろう。以下の図を得るために、私は、私たちは完全に木を解決することはまだ不可能である最大深度6に制限されます!しかし、決定木の私達の深い研究を考えると、我々は、モデルの動作原理を持っています。