Python と Scikit-Learn PlatoBlockchain Data Intelligence を使用したランダム フォレスト アルゴリズムの決定版ガイド。垂直検索。あい。

Python と Scikit-Learn を使用したランダム フォレスト アルゴリズムの決定版ガイド

概要

ランダム フォレスト アルゴリズムは、最も柔軟で強力な、広く使用されているアルゴリズムの XNUMX つです。 分類と回帰、として構築 決定木の集合.

これらに慣れていない場合でも、心配はいりません。これらの概念はすべて説明します。

この詳細なハンズオン ガイドでは、 直感 エンドツーエンドのミニプロジェクトを通じて、決定木の仕組み、アンサンブルが個々の分類器とリグレッサーを強化する方法、ランダム フォレストとは何か、Python と Scikit-Learn を使用してランダム フォレストの分類器とリグレッサーを構築し、研究課題に答えます。

あなたは現在、女性に関するデータを分析している研究グループの一員であると考えてください。 このグループは 100 のデータ レコードを収集しており、これらの初期レコードを、女性を妊娠しているかどうか、農村部または都市部に住んでいるかなどのカテゴリに分類して整理できるようにしたいと考えています。 研究者は、各カテゴリーに女性が何人いるかを理解したいと考えています。

まさにそれを行う計算構造があります。 ツリー 構造。 ツリー構造を使用することで、各カテゴリのさまざまな区分を表すことができます。

決定木

ツリーのノードをどのように設定しますか? ここが 決定木 焦点を合わせます。

まず、記録を妊娠ごとに分けて、次に都市部か地方に住んでいるかによって分けることができます。 これを別の順序で行うことができることに注意してください。最初に女性が住んでいる地域で分割し、次に妊娠状況で分割します。 このことから、ツリーには固有の階層があることがわかります。 情報を整理するだけでなく、ツリーは階層的な方法で情報を整理します。情報が表示される順序が重要であり、結果としてさまざまなツリーにつながります。

以下は、説明されているツリーの例です。

ツリーの画像には 7 つの四角形があり、一番上の四角形は合計 100 人の女性を占めています。この一番上の四角形は下の 78 つの四角形と接続されており、22 人の妊娠していない女性と 45 人の妊娠した女性の数に基づいて女性を分割しています。前の両方の正方形から 33 つの正方形があります。 上の各正方形に接続された 14 つは、女性を地域に基づいて分割します。妊娠していない女性は 8 人が都市部に、XNUMX 人が農村部に、妊娠中は XNUMX 人が農村部に、XNUMX 人が都市部に住んでいます。 ツリーを見るだけで、これらの分割を簡単に理解し、各「レイヤー」が前のレイヤーからどのように派生するかを確認できます。これらのレイヤーはツリーです レベル、レベルは 深さ ツリーの:

Python と Scikit-Learn PlatoBlockchain Data Intelligence を使用したランダム フォレスト アルゴリズムの決定版ガイド。垂直検索。あい。

上の画像で、最初のツリー レベルが レベル0 正方形が XNUMX つしかなく、その後に レベル1 ここに XNUMX つの正方形があり、 レベル2 XNUMXつの正方形がある場所。 これは 深さ2 ツリー。

レベル 0 では、最初の XNUMX つと呼ばれるツリーを生成する正方形があります。 ルートノード、このルートには XNUMX つの 子ノード レベル 1 では、つまり 親ノード レベル 2 の XNUMX つのノードに接続します。これまで言及してきた「正方形」が実際に ノード; また、前の各ノードは、その子である次のノードの親です。 同じ親を持つ各レベルの子ノードが呼び出されます 兄弟、次の画像に見られるように:

Python と Scikit-Learn PlatoBlockchain Data Intelligence を使用したランダム フォレスト アルゴリズムの決定版ガイド。垂直検索。あい。

前の画像では、レベル 1 も 内部ノード、ルートと最後のノードの間にあると、 葉ノード. 葉の節は木の最後の部分です。最初の 100 人の女性から何人が妊娠して農村地域に住んでいるかを言うなら、葉を見ることでこれを知ることができます。 したがって、葉の数字が最初の研究課題に答えます。

女性の新しい記録があり、以前は女性を分類するために使用されていたツリーが、女性が研究に参加できるかどうかを決定するために使用された場合、それはまだ機能しますか? ツリーは同じ基準を使用し、妊娠していて農村地域に住んでいる女性は参加できません。

Python と Scikit-Learn PlatoBlockchain Data Intelligence を使用したランダム フォレスト アルゴリズムの決定版ガイド。垂直検索。あい。

上の画像を見ると、各ツリー ノードの質問 (「彼女は参加者ですか?」、「彼女は妊娠していますか?」、「彼女は地方に住んでいますか?」) に対する答えが「はい」であることがわかります。はい、そうです。この場合、木は女性が研究に参加できるという決定につながると考えられるようです。

これは エッセンス 手動で行われる決定木。 機械学習を使用して、最終決定の精度を最大化するような方法で、このツリーを自動的に構築するモデルを構築できます。

注: コンピュータ サイエンスには、バイナリ ツリー、一般ツリー、AVL ツリー、スプレー ツリー、レッド ブラック ツリー、B ツリーなど、いくつかの種類のツリーがあります。 . それがaの答えに依存する場合 はい or いいえ 各ノードの質問、したがって各ノードは せいぜい二人の子供、「小さい」ノードが左側になるようにソートすると、決定木は次のように分類されます。 二分木.

前の例で、ツリーが次のいずれかを行う方法を観察します。 分類する 参加者または非参加者としての新しいデータ、または質問を「参加者は何人ですか?」、「妊娠している人は何人ですか?」、「農村地域に住んでいる人は何人ですか?」に変更することもできます。 農村地域に住む妊娠中の参加者の。

データが分類されるとき、これはツリーが実行していることを意味します 分類 タスク、およびデータの量が見つかると、ツリーは実行しています 回帰 仕事。 これは、決定木が分類と回帰の両方のタスクに使用できることを意味します。

ディシジョン ツリーとは何か、どのように使用できるか、それを記述するためにどのような命名法が使用されているかを理解したところで、その限界について考えることができます。

ランダム フォレストについて

一部の参加者が都市部と農村部の境界に住んでいる場合、決定はどうなりますか? ツリーは、このレコードを農村部または都市部に追加しますか? このデータはかなり明確であるため、現在の構造に適合させるのは難しいようです。

また、ボートに住む女性が研究に参加した場合、それは田舎と見なされますか、それとも都会と見なされますか? 前のケースと同様に、ツリーで使用可能なオプションを考慮して分類するのは困難なデータ ポイントです。

デシジョン ツリーの例についてもう少し考えてみると、新しいデータが既にツリーにあるパターンに従っていることを考慮して、新しいデータを正しく分類できることがわかります。ただし、ツリーを定義した最初のデータとは異なるレコードがある場合、ツリー構造が固定的すぎて、レコードを分類できません。

これは、決定木が厳密であり、その可能性が制限されている可能性があることを意味します。 理想的な意思決定ツリーは、より柔軟で、より微妙な目に見えないデータに対応できるものです。

解決法: 「XNUMX 組の目は XNUMX 組よりもよく見える」のと同様に、通常、XNUMX つのモデルは XNUMX つよりも正確な答えを導き出します。 (ツリー構造にエンコードされた) 知識表現の多様性を考慮すると、XNUMX つのツリーの欠点を別のツリーで「補う」ことができるため、複数の類似したツリー間でわずかに異なる構造の硬直性はもはや制限的ではありません。 たくさん組み合わせることで 一緒に、私たちは 森林.

最初の質問に対する答えに関しては、それがツリーの葉にエンコードされることは既にわかっていますが、XNUMX つではなく多くのツリーがある場合、何が変わるのでしょうか?

分類のためにツリーが結合される場合、結果は回答の大部分によって定義されます。これは、 多数決; 回帰の場合、フォレスト内の各ツリーによって与えられる数は次のようになります。 平均した.

アンサンブル学習とモデル アンサンブル

この方法は次のように知られています。 アンサンブル学習. アンサンブル学習を使用する場合、出力を解析して他の出力と組み合わせることができる限り (手動または既存のライブラリを使用して)、任意のアルゴリズムを組み合わせることができます。 通常、複数のデシジョン ツリーなど、同じタイプの複数のモデルを一緒にアンサンブルしますが、同じモデル タイプのアンサンブルを結合するだけに限定されません。

アンサンブルは、問題をより適切に一般化し、パフォーマンスをわずかに向上させるための、実質的に保証された方法です。 場合によっては、モデルのアンサンブルにより、 重要 予測力が向上し、時にはほんのわずかです。 これは、トレーニングおよび評価しているデータセットと、モデル自体によって異なります。

決定木を結合すると、 重要 個々のツリーに圧縮されたパフォーマンスの向上。 このアプローチは、研究および応用機械学習コミュニティで普及し、非常に一般的だったため、決定木の集合体は口語的に 森林、および作成されていた一般的なタイプのフォレスト (フィーチャのランダムなサブセットに関する決定木のフォレスト) がその名前を広めました。 ランダムな森.

幅広い用途を考慮して、Scikit-Learn などのライブラリはラッパーを実装しています。 RandomForestRegressorRandomForestClassifier独自のデシジョン ツリー実装の上に構築され、研究者が独自のアンサンブルを構築することを回避できるようにします。

ランダムフォレストに飛び込もう!

ランダム フォレスト アルゴリズムのしくみ

以下は、ランダム フォレスト アルゴリズムを実行する際の基本的な手順です。

  1. データセットから 4、20、76、150、さらには 2.000 など、任意の数のランダム レコードを選択します ( N 記録)。 数値はデータセットの幅に依存し、幅が広いほど大きくなります N することができます。 これは、 ランダム アルゴリズムの名前の一部に由来します!
  2. それらに基づいて決定木を構築する N ランダムレコード;
  3. アルゴリズムに定義されたツリーの数、またはフォレスト内のツリーの数に従って、手順 1 と 2 を繰り返します。これにより、一連のランダム データ レコードからさらに多くのツリーが生成されます。
  4. ステップ 3 の後は、結果を予測する最終ステップです。
    • 分類の場合: フォレスト内の各ツリーは、新しいレコードが属するカテゴリを予測します。 その後、多数決を獲得したカテゴリに新しいレコードが割り当てられます。
    • 回帰の場合: フォレスト内の各ツリーは新しいレコードの値を予測し、最終的な予測値は、フォレスト内のすべてのツリーによって予測されたすべての値の平均をとることによって計算されます。

特徴のランダムなサブセットに適合する各ツリーは、計算コストを低く抑えながら、アンサンブルによって修正される他のいくつかの特徴の知識を必ずしも持っていません。

アドバイス: ランダム フォレストはデシジョン ツリーをベースとして使用するため、デシジョン ツリーがどのように機能するかを理解し、それらを個別に練習して構造を直感的に構築することは非常に役立ちます。 ランダム フォレストを構成するときは、ツリーの最大深度、リーフ ノードに必要なサンプルの最小数、内部分割を決定する賭けの基準などの値を設定して、アンサンブルがより適切に適合するようにします。データセットを作成し、新しいポイントに一般化します。 実際には、通常、ランダム フォレスト、勾配ブースティング、極端な勾配ブースティング、またはその他のツリー ベースの手法を使用することになるため、単一の決定木のハイパーパラメーターを十分に把握することは、アンサンブルを調整するための強力な直感を構築するのに役立ちます。

ツリーがどのように機能するかについての直感とランダム フォレストの理解があれば、残っているのは、データを使用して構築、トレーニング、チューニングを練習することだけです!

Scikit-Learn を使用したランダム フォレスト モデルの構築とトレーニング

これまでの例が妊娠、居住地、女性に関係するのには理由がありました。

2020 年、バングラデシュの研究者は、特に農村部に住む妊婦を考慮すると、妊婦の死亡率が依然として非常に高いことに気付きました。 そのため、彼らは IOT 監視システムを使用して 母体の健康リスクを分析する. IOT システムは、バングラデシュの農村地域のさまざまな病院、コミュニティ クリニック、母子保健ケアからデータを収集しました。

収集されたデータは、カンマ区切り値 (csv) ファイルに整理され、にアップロードされました。 UCI の機械学習リポジトリ.

これは、妊娠中の女性に心筋梗塞があるかどうかを理解しようとするために使用するデータです。 低いです, ミディアム or 高いです 死亡のリスク。

Note: データセットをダウンロードできます こちら.

分類にランダム フォレストを使用する

女性が持っているかどうかを知りたいので 低いです, ミディアム or 高いです これは、XNUMX つのクラスで分類を実行することを意味します。 問題に XNUMX つ以上のクラスがある場合、それは a と呼ばれます。 マルチクラス 問題、とは対照的に バイナリ 問題 (通常、XNUMX つのクラスから選択する場合) 0 & 1).

この最初の例では、ランダム フォレスト分類器と Python の Scikit-Learn を使用してマルチクラス分類モデルを実装します。

この問題を解決するために、通常の機械学習の手順に従います。つまり、ライブラリをロードし、データを読み取り、要約統計を調べ、データを視覚化して理解を深めます。 次に、データの前処理と分割に続いて、モデルの生成、トレーニング、評価を行います。

ライブラリのインポート

Pandas を使用してデータを読み取り、Seaborn と Matplotlib を使用して視覚化し、NumPy を優れたユーティリティ メソッドとして使用します。

import pandas as pd
import numpy as np
import seaborn as sns
import matplotlib.pyplot as plt
データセットのインポート

次のコードは、データセットをインポートして Python にロードします。 DataFrame:

dataset = pd.read_csv("../../datasets/random-forest/maternal_health_risk.csv")

データの最初の XNUMX 行を確認するには、次のコマンドを実行します。 head() コマンド:

dataset.head()

これは出力します:

    Age SystolicBP  DiastolicBP BS      BodyTemp    HeartRate   RiskLevel
0   25  130         80          15.0    98.0        86          high risk
1   35  140         90          13.0    98.0        70          high risk
2   29  90          70          8.0     100.0       80          high risk
3   30  140         85          7.0     98.0        70          high risk
4   35  120         60          6.1     98.0        76          low risk

ここでは、調査中に収集されたすべての属性を確認できます。

  • 年齢: 年齢。
  • SystolicBP: 血圧の上限値 (mmHg)。妊娠中の重要な属性。
  • 拡張期血圧: 妊娠中のもう XNUMX つの重要な属性である mmHg での血圧の低い値。
  • BS: モル濃度で表した血糖値、mmol/L。
  • HeartRate: 安静時心拍数 (拍/分)。
  • RiskLevel: 妊娠中のリスクレベル。
  • BodyTemp: 体温。

測定対象について理解が深まったところで、次のようにしてデータの種類を確認できます。 info():

dataset.info()

この結果:


RangeIndex: 1014 entries, 0 to 1013
Data columns (total 7 columns):
 #   Column       Non-Null Count  Dtype  
---  ------       --------------  -----  
 0   Age          1014 non-null   int64  
 1   SystolicBP   1014 non-null   int64  
 2   DiastolicBP  1014 non-null   int64  
 3   BS           1014 non-null   float64
 4   BodyTemp     1014 non-null   float64
 5   HeartRate    1014 non-null   int64  
 6   RiskLevel    1014 non-null   object 
dtypes: float64(2), int64(4), object(1)
memory usage: 55.6+ KB

見てから RangeIndex 行、1014 レコード、および列があることがわかります。 Non-Null Count データに欠損値がないことを通知します。 つまり、欠損データを処理する必要はありません。

Dtype 列で、各変数のタイプを確認できます。 現在、 float64 列など BS & BodyTemp 15.0、15.51、15.76、17.28 など、任意の範囲で変化する可能性のある数値を持ち、 数値的に連続 (いつでも浮動小数点数に 0 を追加できます。無限大です)。 一方、次のような変数 Age, SystolicBP, DiastolicBP, HeartRate タイプです int64、これは、数値が 11、12、13、14 などの単位でのみ変化することを意味します。心拍数は 77.78 ではなく、77 または 78 のいずれかです。これらは 数値的に離散 値。 また、 RiskLevel また、 object タイプ、これは通常、変数がテキストであることを示しており、おそらく数値に変換する必要があります。 リスク レベルが低から高に成長するため、カテゴリには暗黙の順序があり、これはそれがリスクであることを示しています。 カテゴリ的に序数 変数に保存します.

Note: 各データのタイプを見て、そのコンテキストに従って意味があるかどうかを確認することが重要です。 たとえば、心拍数単位の半分を使用しても意味がないため、離散値には整数型が適切であることを意味します。 そうでない場合は、Pandas のデータ型を変更できます。 astype() プロパティ – df['column_name'].astype('type').

データ型を見た後、使用できます describe() 各列の平均値、標準偏差、分位点、最小および最大データ値など、いくつかの記述統計でピークを取得します。

dataset.describe().T 

上記のコードは次を表示します。

            count   mean        std         min     25%     50%     75%     max
Age         1014.0  29.871795   13.474386   10.0    19.0    26.0    39.0    70.0
SystolicBP  1014.0  113.198225  18.403913   70.0    100.0   120.0   120.0   160.0
DiastolicBP 1014.0  76.460552   13.885796   49.0    65.0    80.0    90.0    100.0
BS          1014.0  8.725986    3.293532    6.0     6.9     7.5     8.0     19.0
BodyTemp    1014.0  98.665089   1.371384    98.0    98.0    98.0    98.0    103.0
HeartRate   1014.0  74.301775   8.088702    7.0     70.0    76.0    80.0    90.0
RiskLevel   1014.0  0.867850    0.807353    0.0     0.0     1.0     2.0     2.0

ほとんどの列で、 意味する 値は 標準偏差 (std) – これは、データが必ずしも適切な統計分布に従っているとは限らないことを示しています。 もしそうなら、モデルがリスクを予測するのに役立ちました。 ここでできることは、データを前処理して、あたかも全世界の人口からのデータであるかのように、より代表的なものにすることです。 正規化. ただし、ランダムフォレストモデルを使用する場合の利点 分類、それは、固有のツリー構造が、正規化されていないデータを、各変数の各ツリーレベルの値で分割すると、うまく処理できることです。

また、ツリーを使用しており、結果のクラスは投票によって取得されるため、本質的に異なる値を比較するのではなく、同じタイプの値のみを比較するため、この場合、フィーチャを同じスケールに調整する必要はありません。 . これは、ランダム フォレスト分類モデルが スケール不変であり、特徴のスケーリングを実行する必要はありません。

この場合、実行できるデータ前処理のステップは、カテゴリカルを変換することです。 RiskLevel 列を数値にします。

データの視覚化

変身前 RiskLevel、散布図を使用してフィーチャの各ペアのポイントの組み合わせを調べ、ヒストグラム曲線を視覚化してポイントがどのように分布しているかを見て、データをすばやく視覚化しましょう。 そのために、Seaborn の pairplot() 両方のプロットを組み合わせます。 機能の組み合わせごとに両方のプロットを生成し、リスク レベルに応じて色分けされたポイントを表示します。 hue プロパティ:

g = sns.pairplot(dataset, hue='RiskLevel')
g.fig.suptitle("Scatterplot and histogram of pairs of variables color coded by risk level", 
               fontsize = 14, 
               y=1.05); 

上記のコードは以下を生成します。

Python と Scikit-Learn PlatoBlockchain Data Intelligence を使用したランダム フォレスト アルゴリズムの決定版ガイド。垂直検索。あい。

プロットを見ると、理想的な状況は、曲線と点を明確に区別することです。 ご覧のとおり、XNUMX 種類のリスク クラスはほとんど混同されています。木はポイント間のスペースを区切るときに内部的に線を引くため、フォレスト内のより多くの木がより多くのスペースを制限し、ポイントをより適切に分類できる可能性があるという仮説を立てることができます。

基本的な探索的データ分析が完了したら、 RiskLevel コラム。

分類のためのデータ前処理

の XNUMX つのクラスしかないことを確認するには RiskLevel 私たちのデータでは、他の値が誤って追加されていないことを確認するには、使用できます unique() 列の一意の値を表示するには:

dataset['RiskLevel'].unique()

これは出力します:

array(['high risk', 'low risk', 'mid risk'], dtype=object)

クラスがチェックされたら、次のステップは各値を数値に変換することです。 分類には順序があるため、値 0、1、および 2 を使用して、 低いです, ミディアム & 高いです リスク。 列の値を変更する方法は多数あり、Python の シンプルは複雑よりも優れている をモットーに、 .replace() メソッドを使用して、それらを整数表現に置き換えるだけです。

dataset['RiskLevel'] = dataset['RiskLevel'].replace('low risk', 0).replace('mid risk', 1).replace('high risk', 2)

値を置き換えた後、データをモデルのトレーニングに使用するものに分割できます。 機能を使用 or X、そして私たちが予測したいことは、 ラベル or y:

y = dataset['RiskLevel']
X = dataset.drop(['RiskLevel'], axis=1)

一度 X & y セットの準備ができたので、Scikit-Learn を使用できます train_test_split() それらをトレーニングセットとテストセットにさらに分割する方法:

from sklearn.model_selection import train_test_split

SEED = 42
X_train, X_test, y_train, y_test = train_test_split(X, y, 
                                                    test_size=0.2, 
                                                    random_state=SEED)

アドバイス: 結果を再現可能にしたい場合は、ランダムな状態シードを使用することを忘れないでください。 ガイドと同じ結果を再現できるように、ランダムな状態シードを使用しました。

ここでは、データの 20% をテストに使用し、80% をトレーニングに使用しています。

RandomForestClassifier のトレーニング

ベストプラクティス、業界で認められた標準、および含まれているチートシートを含む、Gitを学習するための実践的で実用的なガイドを確認してください。 グーグルGitコマンドを停止し、実際に 学ぶ それ!

Scikit-Learn で実装されたアンサンブルは、 sklearn.ensemble モジュール。 多数決が取られる分類に使用される決定木の集合体は、 RandomForestClassifier.

トレーニング セットとテスト セットがあれば、インポートできます。 RandomForestClassifier クラス化してモデルを作成します。 まず、次のように設定して、XNUMX 本の木があるフォレストを作成しましょう。 n_estimators パラメータを 3 として、各ツリーに XNUMX つのレベルを設定すると、 max_depth2へ:

from sklearn.ensemble import RandomForestClassifier

rfc = RandomForestClassifier(n_estimators=3, 
                             max_depth=2,
                             random_state=SEED)

注: のデフォルト値 n_estimators is 100. これにより、アンサンブルの予測力と一般化が向上しますが、視覚化と検査を容易にするために、より小さなものを作成しています。 わずか 3 本のツリーで、それらを視覚化して検査できます 手動で 個々の木とそれらの共依存の両方に対する私たちの直感をさらに構築します。 同じことが当てはまります max_depthボタンの隣にある None、つまり、必要に応じてデータに合わせてツリーを深くすることができます。

モデルをデータに適合させるために、 fit() メソッド、トレーニング機能とラベルを渡します。


rfc.fit(X_train, y_train)

y_pred = rfc.predict(X_test)

これで、予測されたラベルを実際のラベルと比較して、モデルがどれだけうまく機能したかを評価できます! モデルを評価する前に、アンサンブルを見てみましょう。

モデルをもう少し深く見るために、各ツリーと、それらがどのようにデータを分割しているかを視覚化できます。 これは、 tree モジュールを Scikit-Learn に組み込み、アンサンブル内の各推定器をループします。


from sklearn import tree

features = X.columns.values 
classes = ['0', '1', '2'] 



for estimator in rfc.estimators_:
    print(estimator)
    plt.figure(figsize=(12,6))
    tree.plot_tree(estimator,
                   feature_names=features,
                   class_names=classes,
                   fontsize=8, 
                   filled=True, 
                   rounded=True)
    plt.show()

上記のコードは、ツリー プロットを表示します。

Python と Scikit-Learn PlatoBlockchain Data Intelligence を使用したランダム フォレスト アルゴリズムの決定版ガイド。垂直検索。あい。
Python と Scikit-Learn PlatoBlockchain Data Intelligence を使用したランダム フォレスト アルゴリズムの決定版ガイド。垂直検索。あい。
Python と Scikit-Learn PlatoBlockchain Data Intelligence を使用したランダム フォレスト アルゴリズムの決定版ガイド。垂直検索。あい。

XNUMX つのツリーの違いに注意してください。 最初のものは BS 機能、XNUMX 番目の機能 DiastolicBP、および XNUMX 番目の BS また。 XNUMX番目は異なる数のサンプルを見ていますが。 右の分岐では、最初の XNUMX つのツリーも使用を決定します。 Age リーフ レベルで、XNUMX 番目のツリーは BS 特徴。 わずか XNUMX つの推定器を使用することで、スケールアップによって豊富で多様な知識を表現し、それを非常に正確なモデルにうまく組み込むことができることは明らかです。

森の中の木が多ければ多いほど、モデルはより多様になります。 ただし、収穫逓減のポイントがあります。多くのツリーがフィーチャのランダムなサブセットに適合するため、アンサンブルであまり多様性を提供しない類似のツリーがかなりの量存在し、それらが持つようになります。 議決権が多すぎる アンサンブルを歪めてトレーニング データセットに過剰適合させ、検証セットへの一般化を妨げます。

より多くの木を持つこと、およびそれがモデルの結果をどのように改善できるかについて、以前に仮説が立てられました。 結果を見て、新しいモデルを生成し、仮説が成り立つかどうか見てみましょう!

RandomForestClassifier の評価

Scikit-Learn を使用すると、ベースラインを簡単に作成できます。 DummyClassifier、予測を出力します 入力機能を使用せずに (完全にランダムな出力)。 あなたのモデルが DummyClassifier, 一部 学習が行われています! 学習を最大化するために、さまざまなハイパーパラメータを自動的にテストできます。 RandomizedSearchCV or GridSearchCV. ベースラインを設定するだけでなく、いくつかのメトリックのレンズからモデルのパフォーマンスを評価できます。

アルゴリズムの評価に使用できる従来の分類指標には、精度、再現率、f1 スコア、精度、混同行列などがあります。 それぞれの簡単な説明は次のとおりです。

  1. 精度: 分類器によってどの正しい予測値が正しいと見なされたかを理解することが目的の場合。 精度は、これらの真の陽性値を、陽性と予測されたサンプルで割ります。

$$
精度 = frac{text{真陽性}}{text{真陽性} + text{偽陽性}}
$$

  1. リコール: 通常、分類器によって識別された真陽性の数を理解するために、精度とともに計算されます。 再現率は、真の陽性を、陽性と予測されるはずだったもので割ることによって計算されます。

$$
リコール = frac{text{真陽性}}{text{真陽性} + text{偽陰性}}
$$

  1. F1スコア: バランスの取れたまたは 調和平均 精度と再現率。 最小値は 0 で、最大値は 1 です。 f1-score が 1 の場合、すべてのクラスが正しく予測されたことを意味します。これは、実際のデータで取得するのが非常に難しいスコアです (例外はほとんど常に存在します)。

$$
text{f1-score} = 2* frac{text{precision} * text{recall}}{text{precision} + text{recall}}
$$

  1. 混乱マトリックス: どれだけのサンプル数が正解または不正解だったかを知る必要がある場合 各クラス. 正しく、正しく予測された値が呼び出されます 真陽性、陽性として予測されたが陽性ではなかったものは呼び出されます 偽陽性. の同じ命名法 真のネガティブ & 偽陰性 負の値に使用されます。

  2. 正確さ: 分類子が何回予測を正しく行ったかを示します。 精度の最低値は 0 で、最高値は 1 です。通常、その値に 100 を掛けてパーセンテージを求めます。

$$
精度 = frac{text{正しい予測の数}}{text{予測の総数}}
$$

注: 機械学習を適用する実際のデータで 100% の精度を得ることは事実上不可能です。 100% の精度の分類器、または 100% に近い結果が表示された場合は、懐疑的になり、評価を実行してください。 これらの問題の一般的な原因は、データ漏えい (トレーニング テストの一部がテスト セットに直接的または間接的に漏えいすること) です。 主にデータに依存するため、「優れた精度」とは何かについてのコンセンサスはありません。70% の精度が高くなる場合もあります。 場合によっては、精度が非常に低くなることがあります。 一般的に言えば、多くのモデルでは 70% 以上で十分ですが、これはドメイン研究者が決定することです。

次のスクリプトを実行して、必要なライブラリをインポートし、結果を確認できます。

from sklearn.metrics import classification_report, confusion_matrix

cm = confusion_matrix(y_test, y_pred)
sns.heatmap(cm, annot=True, fmt='d').set_title('Maternal risks confusion matrix (0 = low risk, 1 = medium risk, 2 = high risk)')

print(classification_report(y_test,y_pred))

出力は次のようになります。

                precision    recall  f1-score   support

           0       0.53      0.89      0.66        80
           1       0.57      0.17      0.26        76
           2       0.74      0.72      0.73        47

    accuracy                           0.58       203
   macro avg       0.61      0.59      0.55       203
weighted avg       0.59      0.58      0.53       203

Python と Scikit-Learn PlatoBlockchain Data Intelligence を使用したランダム フォレスト アルゴリズムの決定版ガイド。垂直検索。あい。

分類レポートでは、再現率が高く、クラス 0.89 で 0、精度と再現率の両方がクラス 2 で高く、0.74、0.72 であり、クラス 1 では再現率が低く、特に再現率が 0.17 で精度が 0.57 であることがわかります。 . XNUMX つのクラスすべての個別の再現率と適合率の関係は、 F1 スコア、これは再現率と適合率の間の調和平均です – モデルは次のことを行っています オーケー クラス 0 ではかなり悪く、クラス 1 ではかなり悪く、クラス 2 ではまずまずです。

モデルは、識別に非常に苦労しています。 中リスクのケース.

3 本の木のみを使用したランダム フォレスト分類器によって達成される精度は、次のとおりです。 0.58 (58%) – これは、結果の半分以上が正しいことを意味します。 これは精度が低く、ツリーを追加することで改善される可能性があります。

混同マトリックスを見ると、中リスクの 52 件のレコードを低リスクに分類する際にほとんどの間違いが発生していることがわかります。これにより、クラス 1 の再現率が低いことがさらにわかります。中リスクの患者を低リスクに分類する方向に偏っています。危険な患者。

さらに洞察を得るためにチェックできるもう XNUMX つのことは、予測時に分類子によってどの機能が最も考慮されるかです。 これは取るべき重要なステップです 説明可能な機械学習システム、モデルの偏りを特定して軽減するのに役立ちます。

それを確認するには、 feature_importances_ 分類子のプロパティ。 これによりパーセンテージのリストが表示されるので、 feature_names_in_ プロパティを使用して各機能の名前を取得し、それらをデータフレームに整理し、それらを上位から下位に並べ替え、結果をプロットします。


features_df = pd.DataFrame({'features': rfc.feature_names_in_, 'importances': rfc.feature_importances_ })


features_df_sorted = features_df.sort_values(by='importances', ascending=False)


g = sns.barplot(data=features_df_sorted, x='importances', y ='features', palette="rocket")
sns.despine(bottom = True, left = True)
g.set_title('Feature importances')
g.set(xlabel=None)
g.set(ylabel=None)
g.set(xticks=[])
for value in g.containers:
    g.bar_label(value, padding=2)

Python と Scikit-Learn PlatoBlockchain Data Intelligence を使用したランダム フォレスト アルゴリズムの決定版ガイド。垂直検索。あい。

分類子が主にどのように考慮しているかに注目してください。 血糖、次に、拡張期血圧、体温、および決定を下すためのほんの少しの年齢です。これは、クラス 1 の再現率が低いことにも関係している可能性があります。おそらく、中リスクのデータは、モデルによって十分に考慮されます。 これを調査するために機能の重要度をさらに試してみて、モデルの変更が使用されている機能に影響するかどうか、また一部の機能と予測されたクラスの間に重要な関係があるかどうかを確認できます。

いよいよ、より多くのツリーを含む新しいモデルを生成して、結果にどのように影響するかを確認します。 を作成しましょう rfc_ 900 本の木、8 つのレベル、同じ種の森。 結果は改善しますか?

rfc_ = RandomForestClassifier(n_estimators=900, 
                             max_depth=7,
                             random_state=SEED)
rfc_.fit(X_train, y_train)
y_pred = rfc_.predict(X_test)

メトリックの計算と表示:

cm_ = confusion_matrix(y_test, y_pred)
sns.heatmap(cm_, annot=True, fmt='d').set_title('Maternal risks confusion matrix (0 = low risk, 1 = medium risk, 2 = high risk) for 900 trees with 8 levels')

print(classification_report(y_test,y_pred))

これは出力します:

                precision    recall  f1-score   support

           0       0.68      0.86      0.76        80
           1       0.75      0.58      0.65        76
           2       0.90      0.81      0.85        47

    accuracy                           0.74       203
   macro avg       0.78      0.75      0.75       203
weighted avg       0.76      0.74      0.74       203

Python と Scikit-Learn PlatoBlockchain Data Intelligence を使用したランダム フォレスト アルゴリズムの決定版ガイド。垂直検索。あい。

これは、より多くのツリーを追加し、より専門的なツリー (より高いレベル) を追加することで、メトリックがどのように改善されたかを示しています。 クラス 1 の再現率はまだ低いですが、精度は現在 74% です。 高リスク ケースを分類する際の F1 スコアは 0.85 です。これは、以前のモデルの 0.73 と比較して、高リスク ケースがより簡単に識別されることを意味します。

日常のプロジェクトでは、リスクの高いケースを特定することがより重要になる場合があります。 感度 統計で。 モデル パラメーターのいくつかを微調整して、結果を観察します。

ここまでで、ランダム フォレストを使用してデータを分類する方法について全体的な理解が得られました。次のセクションでは、同じデータセットを別の方法で使用して、同じモデルが回帰で値を予測する方法を確認できます。

回帰にランダム フォレストを使用する

このセクションでは、ランダム フォレスト アルゴリズムを使用して、Scikit-Learn を使用して回帰問題を解決する方法について説明します。 このアルゴリズムを実装するための手順は、モデルの種類と予測データの種類 (現在は連続値になります) を除けば、分類で実行される手順とほぼ同じです。データの準備には XNUMX つの違いがあります。

に対して回帰が行われるため、 数値 – データセットから数値を選びましょう。 分類において血糖値が重要であることがわかったので、他の特徴に基づいて予測可能である必要があります (ある特徴と相関する場合、その特徴もそれと相関するため)。

分類のために行ったことに従って、まずライブラリと同じデータセットをインポートしましょう。 分類モデルに対して既にこれを行っている場合は、この部分をスキップして、トレーニング用のデータの準備に直接進むことができます。

ライブラリとデータのインポート
import pandas as pd
import numpy as np
import maplotlib.pyplot as plt
import seaborn as sns

dataset = pd.read_csv("../../datasets/random-forest/maternal_health_risk.csv")
回帰のためのデータの前処理

これは回帰タスクであるため、クラスを予測する代わりに、データセットの数値列の XNUMX つを予測できます。 この例では、 BS 列が予測されます。 これは、 y データが含まれます 血糖データ, X データには、血糖値以外のすべての機能が含まれます。 を切り離した後、 X & y データ、トレーニング セットとテスト セットを分割できます。

from sklearn.model_selection import train_test_split

SEED = 42

y = dataset['BS']
X = dataset.drop(['BS'], axis=1) 

X_train, X_test, y_train, y_test = train_test_split(X, y, 
                                                    test_size=0.2, 
                                                    random_state=SEED)
RandomForestRegressor のトレーニング

データセットのスケーリングが完了したので、アルゴリズムをトレーニングしてこの回帰問題を解決し、少し変更します。森に 20 本の木があり、それぞれに 4 つのレベルがあるモデルを作成します。 これを行うには、次のコードを実行できます。

from sklearn.ensemble import RandomForestRegressor

rfr = RandomForestRegressor(n_estimators=20, 
                            max_depth=3, 
                            random_state=SEED)

rfr.fit(X_train, y_train)
y_pred = rfr.predict(X_test)

のすべてのパラメータの詳細を見つけることができます RandomForestRegressor 公式ドキュメントで.

20 本の木をプロットして見るには、ある程度の時間と労力が必要になるため、最初の XNUMX 本だけをプロットして、分類木との違いを確認できます。

from sklearn import tree

features = X.columns

first_tree = rfr.estimators_[0]

plt.figure(figsize=(15,6))
tree.plot_tree(first_tree,
               feature_names=features,
               fontsize=8, 
               filled=True, 
               rounded=True);

Python と Scikit-Learn PlatoBlockchain Data Intelligence を使用したランダム フォレスト アルゴリズムの決定版ガイド。垂直検索。あい。

回帰ツリーには、各ノードに該当するデータに割り当てられた値が既にあることに注意してください。 これらは、20 本の木を組み合わせるときに平均化される値です。 分類で行ったことに続いて、機能の重要度をプロットして、値を計算するときに回帰モデルがどの変数をより考慮しているかを確認することもできます。

機械学習の問題を解決し、アルゴリズムのパフォーマンスを評価する最後のステップに進みましょう。

RandomForestRegressor の評価

回帰問題の場合、アルゴリズムの評価に使用されるメトリクスは、平均絶対誤差 (MAE)、平均二乗誤差 (MSE)、二乗平均平方根誤差 (RMSE) です。

  1. 平均絶対誤差(MAE): 実際の値から予測値を差し引いて誤差を取得し、それらの誤差の絶対値を合計して平均値を取得します。 このメトリックは、モデルの各予測の全体的なエラーの概念を示します。小さいほど (0 に近いほど) 優れています。

$$
mae =(frac {1} {n})sum_ {i = 1}^{n}左| 実際–予測される権利|
$$

注: あなたも遭遇するかもしれません y & ŷ 方程式の表記。 The y 実際の値を参照し、 ŷ 予測値に。

  1. 平均二乗誤差(MSE): MAE メトリックに似ていますが、誤差の絶対値を 0 乗します。 また、MAE と同様に、小さいほど、または XNUMX に近いほど良いです。 MSE 値は、大きな誤差がさらに大きくなるように XNUMX 乗されます。 細心の注意を払うべきことの XNUMX つは、値のサイズと、データの同じスケールにないという事実のために、通常、解釈するのが難しいメトリックであるということです。

$$
mse = sum_ {i = 1} ^ {D}(実際–予測)^ 2
$$

  1. 二乗平均平方根誤差(RMSE): MSE で発生した解釈の問題を、最終値の平方根を取得して解決し、データの同じ単位にスケールバックしようとします。 エラーのあるデータの実際の値を表示または表示する必要がある場合は、解釈が簡単で適切です。 これはデータがどれだけ変化するかを示しているため、RMSE が 4.35 の場合、モデルは実際の値に 4.35 を追加したか、実際の値に到達するために 4.35 を必要としたため、エラーを起こす可能性があります。 0 に近いほど良好です。

$$
rmse = sqrt {sum_ {i = 1} ^ {D}(実際–予測)^ 2}
$$

これらのXNUMXつのメトリックのいずれかを使用して 比較します モデル(XNUMXつを選択する必要がある場合)。 また、同じ回帰モデルを異なる引数値または異なるデータと比較して、評価メトリックを検討することもできます。 これはとして知られています ハイパーパラメータ調整 –学習アルゴリズムに影響を与えるハイパーパラメーターを調整し、結果を観察します。

モデルを選択するときは、通常、エラーが最も少ないモデルの方がパフォーマンスが高くなります。 モデルを監視するときに、メトリックが悪化した場合は、モデルの以前のバージョンの方が優れていたか、モデルのパフォーマンスがパフォーマンスよりも大幅に低下したため、データに大幅な変更が加えられました。

次のコードを使用して、これらの値を見つけることができます。

from sklearn.metrics import mean_absolute_error, mean_squared_error

print('Mean Absolute Error:', mean_absolute_error(y_test, y_pred))
print('Mean Squared Error:', mean_squared_error(y_test, y_pred))
print('Root Mean Squared Error:', np.sqrt(mean_squared_error(y_test, y_pred)))

出力は次のようになります。

Mean Absolute Error: 1.127893702896059
Mean Squared Error: 3.0802988503933326
Root Mean Squared Error: 1.755078018320933

木の数が 20 の場合、二乗平均平方根誤差は 1.75 と低いですが、それでも、木の数を増やして他のパラメーターを試してみると、この誤差はさらに小さくなる可能性があります。

ランダム フォレストを使用する利点

他のアルゴリズムと同様に、使用には長所と短所があります。 次の XNUMX つのセクションでは、分類と回帰にランダム フォレストを使用することの長所と短所を見ていきます。

  1. ランダム フォレスト アルゴリズムは偏りがありません。複数のツリーがあり、各ツリーがデータのランダムなサブセットでトレーニングされるためです。 基本的に、ランダム フォレスト アルゴリズムは「群衆」の力に依存しています。 したがって、アルゴリズムの全体的な偏りの程度が減少します。
  2. このアルゴリズムは非常に安定しています。 データセットに新しいデータ ポイントが導入されたとしても、新しいデータが XNUMX つのツリーに影響を与える可能性があるため、アルゴリズム全体に大きな影響はありませんが、すべてのツリーに影響を与えることは非常に困難です。
  3. ランダム フォレスト アルゴリズムは、カテゴリと数値の両方の特徴がある場合にうまく機能します。
  4. ランダム フォレスト アルゴリズムは、データに欠損値がある場合や、スケーリングされていない場合にもうまく機能します。

ランダム フォレストを使用するデメリット

  1. ランダム フォレストの主な欠点は、その複雑さにあります。 大規模なアンサンブルをトレーニングする場合、多数の決定木が結合されるため、はるかに多くの計算リソースが必要になります。 ただし、最新のハードウェアでは、大規模なランダム フォレストのトレーニングでもそれほど時間はかかりません。

さらに進む – ハンドヘルド エンド ツー エンド プロジェクト

あなたの好奇心旺盛な性質は、さらに先へ進みたいと思わせますか? 私たちは私たちをチェックアウトすることをお勧めします ガイド付きプロジェクト: 「実践的な住宅価格予測–Pythonでの機械学習」.

Python と Scikit-Learn PlatoBlockchain Data Intelligence を使用したランダム フォレスト アルゴリズムの決定版ガイド。垂直検索。あい。

このガイド付きプロジェクトでは、強力な従来の機械学習モデルとディープ ラーニング モデルを構築し、Ensemble Learning を利用してメタ学習者をトレーニングし、Scikit-Learn および Keras モデルのバッグから住宅価格を予測する方法を学習します。

Tensorflow の上に構築された深層学習 API である Keras を使用して、アーキテクチャを実験し、積み重ねられたモデルのアンサンブルを構築し、 メタ学習者 家の価格を計算するためのニューラル ネットワーク (レベル 1 モデル)。

深層学習は素晴らしいですが、それに頼る前に、次のようなより単純な手法で問題を解決することもお勧めします。 浅い学び アルゴリズム。 私たちのベースラインパフォーマンスは、 ランダム フォレスト回帰 アルゴリズム。 さらに、次のような手法を使用して、Scikit-Learn を介してモデルのアンサンブルを作成することを検討します。 バギング & 投票.

これはエンド ツー エンドのプロジェクトであり、すべての機械学習プロジェクトと同様に、最初に – を使用します。 探索的データ分析、続いて データの前処理 そして最後に 建物の浅い & ディープラーニングモデル 以前に調査してクリーニングしたデータに合わせます。

タイムスタンプ:

より多くの スタックアバス