決定木 [機械学習メモの簡単なまとめ]

デシジョンツリーは、特徴とラベルを含む一連のデータから決定ルールを要約し、これらのルールを樹状図構造で提示して、分類と回帰の問題を解決できるノンパラメトリック教師あり学習方法です。決定木アルゴリズムは、理解しやすく、さまざまなデータに適用でき、さまざまな問題解決に優れた性能を発揮し、特にツリーモデルを核としたさまざまな統合アルゴリズムは、さまざまな業界や分野で広く利用されています。

分類基準

情報獲得

1948 年、シャノンは情報エントロピー(エントロピー) の概念を提案しました。
イベント A の分類が (A1, A2,...,An) であり、各部分の発生確率が (p1, p2,..., pn) である場合、情報エントロピーは次の式で定義されます。 (log は底 2、lg (底 10)
ここに画像の説明を挿入します1 です。エントロピーは
、オブジェクトの秩序度を測定するために使用されます。
システムがより秩序正しくなればなるほど、エントロピー値は低くなり、システムがより混沌または分散するほど、エントロピー値は高くなります。エントロピー値。
2. 情報エントロピー
●情報の完全性から説明:
システムの秩序状態が一定である場合、データが集中しているところはエントロピー値が小さくなり、データが分散しているところはエントロピー値が大きくなります。
●情報の秩序性からの説明:
データ量が一定の場合、秩序性が高い系ほどエントロピー値は低くなり、系が無秩序または分散しているほどエントロピー値は高くなります。
情報ゲイン:データセットを特定の特徴で分割する前後のエントロピーの差。エントロピーはサンプルセットの不確実性を表すことができ、エントロピーが大きいほどサンプルの不確実性も大きくなります。したがって、分割前後のセットのエントロピーの差を使用して、サンプル セットDの分割に対する現在の特徴の使用の効果を測定できます。
情報ゲイン = エントロイ (前) - エントロイ (後)
トレーニング データ セット D 上の特徴 A の情報ゲイン g(D,A)。セット D の情報エントロピー H(D) と与えられた条件下での D の情報として定義されます。特徴 A の条件付きエントロピー H(D|A) の差、つまり式は次のとおりです:
g ( D , A ) = H ( D ) − H ( D ∣ A ) g(D,A)=H(D )-H(D|A )g ( D ,=H ( D )H ( D A )
式の詳細な説明:
ここに画像の説明を挿入します
ケース:
左に示すように、最初の列はフォーラム番号、2 列目は性別、3 列目はアクティビティ、最後の列はユーザ​​ーが道に迷ったかどうかを示します。 。
私たちは問題を解決する必要があります。性別とアクティビティの 2 つの特性のうち、どちらがユーザーの離脱に大きな影響を与えますか?
ここに画像の説明を挿入します
この問題は情報利得を計算することで解決できます。右の表の情報がカウントされます。Positive
は陽性サンプル (失われた)、Negative は陰性サンプル (失われていない) であり、以下の値が対応していますさまざまな部門に属する人の数。
3 つのエントロピーが取得できます。
全体エントロピー:
ここに画像の説明を挿入します
性別エントロピー:
ここに画像の説明を挿入します
性別情報利得:
ここに画像の説明を挿入します
活動エントロピー:
ここに画像の説明を挿入します
活動情報利得:
ここに画像の説明を挿入します活動の情報利得は性別の情報利得よりも大きい、つまり、ユーザー損失に対する活動の影響は次のとおりです。ジェンダービッグよりも大きい。

特徴の選択やデータ分析を行うときは、アクティビティ指標に焦点を当てる必要があります。

情報獲得率

**利得率: **利得比の尺度は、前の利得尺度 Gain(S,A) と分離された情報尺度 SplitInformation (上記の例では性別、アクティビティなど) の比率によって共同で定義されます。
ここに画像の説明を挿入します
ケース:
以下の表に示すとおり: ゴルフをプレイする前に満たさなければならない条件は何ですか?
ここに画像の説明を挿入します
全体の情報エントロピー: H ( Y ) = − 5 14 log ⁡ 2 ( 5 14 ) − 9 14 log ⁡ 2 ( 9 14 ) = 0.9403 H(Y)=-\frac{5}{14}\log_2(\frac {5}{14})-\frac{9}{14}\log_2(\frac{9}{14})=0.9403H ( Y )=1 45ログ_2(1 45)1 49ログ_2(1 49)=0 9 4 0 3

ランダムに気象データを取得し、ゴルフをするかどうかを予測し、それを確率変数 Y として設定します。
天気 (Outlook) が晴れ (sunny)、曇り (overcast)、雨 (rain) のいずれかの気象データをランダムに取得し、それを確率変数 X として設定します。
天気データが入ってきて晴れの場合はイベント x1 に設定し、
天気データが入ってきて曇りの場合はイベント x2 に設定し、
気象データが入ってきて雨が降っている場合はイベント x2 に設定します、それをイベント x3 として設定します。
確率変数 X の確率空間は次のとおりです。
ここに画像の説明を挿入します

(1) 晴天時のエントロピー: H ( Y ∣ \frac{3}{8}\log_2(\frac{3}{8})-\frac{5}{8}\log_2(\frac{5} {8})=0.9544H ( Y X=バツ1)=83ログ_2(83)85ログ_2(85)=0 9 5 4 4

(2) 曇りの気象条件のエントロピー: H ( Y ∣ X = x 2 ) = − 4 4 log ⁡ 2 ( 4 4 ) − 0 4 log ⁡ 2 ( 0 4 ) = 0 H(Y| \frac{4}{ 4}\log_2(\frac{4}{4})-\frac{0}{4}\log_2(\frac{0}{4})=0H ( Y X=バツ2)=44ログ_2(44)40ログ_2(40)=0

(3) 雨天条件のエントロピー: H ( Y ∣ -\frac{2}{2}\log_2(\frac{2}{2})-\frac{0}{2}\log_2(\frac{0 {2})=0H ( Y X=バツ3)=22ログ_2(22)20ログ_2(20)=0

(4) 気象条件のエントロピー: H ( Y ∣ X ) = ∑ x ∈ X p ( x ) H ( Y ∣ X ) H(Y|X)=\displaystyle\sum_{x\in (Y|X)H ( Y X )=x Xp ( x ) H ( Y X ) = p ( x 1 ) H ( Y ∣ X = x 1 ) + p ( x 2 ) H ( Y ∣ X = x 2 ) + p ( x 3 ) H ( Y ∣ X = x 3 ) = 8 14 × 0.9544 + 4 14 × 0 + 2 14 × 0 = 0.5454 =p(x_1)H(Y|X=x_1)+p(x_2)H(Y|X=x_2)+p (x_3)H(Y|X=x_3)=\frac{8}{14}×0.9544+\frac{4}{14}×0+\frac{2}{14}×0=0.5454=p ( x1) H ( Y X=バツ1)+p ( x2) H ( Y X=バツ2)+p ( x3) H ( Y X=バツ3)=1 48×0 9 5 4 4+1 44×0+1 42×0=0 5 4 5 4

(5) 気象情報ゲイン: g ( Y , X ) = H ( Y ) − H ( Y |g ( Y ,× )=H ( Y )H ( Y X )=0 3 9 4 9

情報獲得率

(1) Day date の内部情報: I nt I ( D , Day ) = 14 × ( − 1 14 × log ⁡ 2 ( 1 14 ) ) = 3.8074 IntI(D,Day)=14×(-\frac{ 1}{14}×\log_2(\frac{1}{14}))=3.8074I n t I ( D ,) _ _=1 4×( 1 41×ログ_2(1 41) )=8 0 7 4

(2) 展望天気の内部情報:I nt I ( D , O Outlook ) = − 8 14 log ⁡ 2 ( 8 14 ) − 4 14 log ⁡ 2 ( 4 14 ) − 2 14 log ⁡ 2 ( 2 14 ) = 1.3788 IntI(D,Outlook)=-\frac{8}{14}\log_2(\frac{8}{14})-\frac{4}{14}\log_2(\frac{4}{14}) -\frac{2}{14}\log_2(\frac{2}{14})=1.3788I n t I ( D ,わかりまし) _ _ _ _=1 48ログ_2(1 48)1 44ログ_2(1 44)1 42ログ_2(1 42)=1 . 3 7 8 8

(3) Day 日付情報の利得率: g ( D ∣ Day ) = g ( D , Day ) I nt I ( D , Day ) = 0.9403 3.8074 = 0.247 g(D|Day)=\frac{g (D,日)}{IntI(D,日)}=\frac{0.9403}{3.8074}=0.247g ( D a y )=I n t I ( D Day ) _ _g ( D ,) _ _=8 0 7 40 9 4 0 3=0 2 4 7

(4)Outlook は従属変数です: g ( D ∣ O Outlook ) = g ( D , O Outlook ) I nt I ( D , O Outlook ) = 0.3949 1.3788 = 0.2864 g(D|Outlook)=\frac{g ( D,Outlook)}{IntI(D,Outlook)}=\frac{0.3949}{1.3788}=0.2864g ( D アウトルック) _ _ _ _ _ _=I n t I ( D アウトルック) _ _ _ _ _ _g ( D ,アウトルック) _ _ _ _ _ _=1 . 3 7 8 80 3 9 4 9=0 2 8 6 4

ジニ値とジニ指数

**ジニ値 Gini(D):** データセット D からランダムに 2 つのサンプルを抽出します。これは、クラス ラベルが一致しない確率です。したがって、Gini (D) の値が小さいほど、データセット D の純度は高くなります。
ここに画像の説明を挿入します
**ジニ指数 Gini_index (D): **一般的には、除算後のジニ係数が最小となる属性を最適な属性として選択します。
ここに画像の説明を挿入します
事例
下図のリストとジニ指数の分割基準に従って決定木を作成してください。
ここに画像の説明を挿入します
1. データセットの非クラスラベル属性 {住宅所有の有無、婚姻状況、年収} のそれぞれのジニ係数ゲインを計算し、ジニ係数ゲイン値が最も大きい属性をルート ノード属性として取得します。デシジョンツリー。
2. ルートノードのジニ係数は次のとおりです。
ここに画像の説明を挿入します
3. 家の有無に応じて分割した場合、ジニ係数ゲインの計算プロセスは次のようになります。 4.
ここに画像の説明を挿入します
婚姻状況属性に応じて分割した場合、婚姻状況属性は 3 つの値を取り得る{既婚者、独身者、離婚者} は、それぞれ分割されたジニ係数ゲインを計算します。
{既婚} | {シングル,離婚}
{シングル} | {既婚,離婚}
{離婚} |
{シングル,既婚} は {既婚} | 離婚} にグループ化されます
ここに画像の説明を挿入します:
ここに画像の説明を挿入します
グループが {離婚} | {シングル, 既婚} の場合:
ここに画像の説明を挿入します
計算結果を比較し、婚姻状況属性に応じてルート ノードを分割するときに、ジニ係数ゲインが最も大きいグループを分割結果として取得します。つまり、{既婚} | {独身、離婚}

5. 年収ジニも同様に求めることができます。
年収属性が数値属性の場合は、まずデータを昇順に並べ替え、次に、年収ジニの中央の値を使用してサンプルを小さいグループから大きいグループまで 2 つのグループに分割する必要があります。隣接する値を分離として使用します。たとえば、年収60と70の2つの値があったとき、真ん中の値が65であると計算しました。中央の値 65 を分割点として使用して、ジニ係数ゲインを見つけます。
ここに画像の説明を挿入します
ゲインを最大化することは、子ノードの不純物測度 (ジニ係数) の加重平均を最小化することと同じです。ここで、ジニ係数のゲインを最大化したいと考えます。計算によると、ルートノードを分割する 3 つの属性のうち、最もゲインが大きいのは年収属性と婚姻状況の 2 つであり、どちらもゲインは 0.12 です。このとき、最初に出現した属性が最初の部門として選択されます。

6. 次に、同様の方法で残りの属性をそれぞれ計算すると、ルートノードのジニ係数は(この時点でローン滞納の有無のレコードは3件あります)となります
ここに画像の説明を挿入します
。住宅の場合、次のものが得られます。
ここに画像の説明を挿入します
8. 年収の属性は次のとおりです。
ここに画像の説明を挿入します
ここに画像の説明を挿入します

まとめ

1. 情報ゲイン
情報ゲイン = エントリ (前) - エントリ (後)
注: 情報ゲインが大きいほど、この属性を優先して計算します。情報
ゲインは、最初に分割するカテゴリが多い属性を選択します
。ゲイン レートは
、この分離情報メトリックを分母として使用して、分離情報メトリックを維持します。制限
3. ジニ ゲイン
●. ジニ値:データ セット D から 2 つのサンプルがランダムに選択されるほど、
カテゴリの
確率ジニ (D) 値が小さくなります。ラベルが矛盾している場合、データセットD の純度が高くなります。
ジニ指数:
除算後のジニ係数が最も小さい属性を最適な属性として選択します
。 ジニ ゲイン:
ジニ ゲインが最も大きい点を選択して最適な除算を行います。

対応する 3 つのアルゴリズム

ここに画像の説明を挿入します

ID3アルゴリズム

既存の欠点
(1) ID3 アルゴリズムは、ルート ノードおよび各内部ノードの分岐属性を選択する際の評価基準として情報利得を使用します情報取得の欠点は、より多くの値を持つ属性が選択される傾向があり、場合によっては、そのような属性があまり価値のある情報を提供しない可能性があることです。

(2) ID3 アルゴリズムは、記述属性が離散属性であるデータセットの決定木のみを構築できます

C4.5アルゴリズム

改善点(C4.5を使用した方が良い理由)
(1) 情報獲得率を使用して属性を選択する
(2) 連続した数値属性を扱える
(3) ポストプルーニング手法を採用する
(4)
欠損値を処理するC4.5 アルゴリズムの
利点:
生成された分類ルールは理解しやすく、精度が高くなります。

短所:
ツリーを構築する過程で、データセットを複数回スキャンして並べ替える必要があるため、アルゴリズムが非効率になります。

さらに、C4.5 はメモリに常駐できるデータ セットにのみ適しており、トレーニング セットが大きすぎてメモリに収まらない場合、プログラムは実行できません。

CARTアルゴリズム

C4.5 アルゴリズムの分類方法と比較して、CART アルゴリズムは単純化された二分木モデルを使用し、特徴の選択には近似ジニ係数を使用して計算を簡素化します。

C4.5 は必ずしもバイナリ ツリーである必要はありませんが、CART はバイナリ ツリーでなければなりません。

同時に、ID3、C4.5、または CART のいずれであっても、特徴選択を行う際には、分類決定を行うために最適な特徴が選択されますが、ほとんどの分類決定は特定の特徴によって決定されるべきではなく、特定の特徴によって決定される必要があります。特性のセット。**このような決定によって得られる決定木はより正確です。この決定木は多変量決定木と呼ばれます。最適な特徴を選択するとき、多変数決定木は特定の最適な特徴を選択するのではなく、特徴の最適な線形結合を選択して決定を行います。このアルゴリズムの代表的なものは OC1 ですが、ここでは紹介しません。

サンプルがわずかでも変化すると、ツリー構造が大幅に変化します。これは、アンサンブル学習におけるランダム フォレストなどの方法で解決できます。

分類ツリー アルゴリズム API

API公式サイトリンク

class sklearn.tree.DecisionTreeClassifier(*, criterion='gini', splitter='best', max_depth=None, min_samples_split=2, min_samples_leaf=1, min_weight_fraction_leaf=0.0, max_features=None, random_state=None, max_leaf_nodes=None, min_impurity_decrease=0.0, class_weight=None, ccp_alpha=0.0)

パラメータ:
基準不純物の計算方法
「エントロピー」を入力、情報エントロピー (Entropy) を使用して
「ジニ」を入力、ジニ係数 (Gini Impurity) を使用

ジニ係数と比較して、情報エントロピーは不純物の影響を受けやすく、不純物に対するペナルティが最も強くなります。ただし、実際の使用においては、情報エントロピーとジニ係数の影響は基本的に同じですジニ係数の計算には対数が含まれないため、情報エントロピーとビキニ係数の計算は遅くなります。また、情報エントロピーは不純物に対してより敏感であるため、情報エントロピーを指標として使用すると、決定木の成長がより「細かく」なります。そのため、高次元データやノイズの多いデータの場合、情報エントロピーはは過学習しやすく、ジニ係数は にあります。この場合、効果はより優れていることがよくあります。モデルの適合が不十分な場合、つまり、トレーニング セットとテスト セットの両方でモデルのパフォーマンスが低い場合、情報エントロピーが使用されます。もちろん、これらは絶対的なものではありません。

パラメータ 基準
それはモデルにどのような影響を与えますか? 最適なノードと最適な分岐を見つけるために不純物の計算方法を決定します。不純物が低いほど、決定木はトレーニング セットに適合します。
パラメータはどのように選択すればよいですか? 通常
、データの、ノイズが非常に大きい
場合には、次元が低い場合にはジニ係数が使用されます。データが比較的鮮明な場合には、情報エントロピーとジニ係数に差はありません決定木の適合
が十分でない場合は、情報エントロピー
2 を使用し、両方を試してダメな場合は、別の情報エントロピーに切り替えます。

✸random_state & spitter乱数シード
random_state乱数シードは、高次元では乱数性がより顕著になりますが、低次元データ(虹彩データセットなど)では乱数性はほとんど現れません。

スプリッターは、デシジョン ツリーのランダム オプションを制御するためにも使用されます。入力値は 2 つあります。「best」と入力してください。デシジョン ツリーは分岐時にランダムですが、分岐に関してより重要な特徴が優先されます (重要度は、属性 feature_importances_view) が渡されるので、「random」と入力すると、分岐時のデシジョン ツリーはよりランダムになります。ツリーにはより多くの不必要な情報が含まれるため、ツリーはより深く大きくなり、これらの不必要な情報によりトレーニング セットのフィッティングが減少します。 . . これは過学習を防ぐ方法でもあります。モデルがオーバーフィットすると予測する場合は、これら 2 つのパラメーターを使用すると、ツリーの構築後にオーバーフィットが発生する可能性を減らすことができます。もちろん、ツリーが構築された後も、過剰適合を防ぐために枝刈りパラメーターを使用します。

max_ Depthは、デシジョン ツリーの最大の深さです。設定された深さを超えるすべてのブランチは枝刈りされます。
デシジョン ツリーがさらに 1 層成長すると、サンプル サイズの需要が 2 倍になるため、ツリーの深さを制限することで、効果的に過学習を制限できます。アンサンブル アルゴリズムでも非常に役立ちます。実際に使用する場合は、=3 から試してフィッティング効果を確認してから、設定深さを増やすかどうかを決定することをお勧めします。

min_samples_leaf & min_samples_splitリーフノードの最小サンプル数と内部ノードの再分割に必要な最小サンプル数
min_samples_split この値はサブツリー分割を継続する条件を制限します ノードのサンプル数が min_samples_split 未満の場合、分類する最適な特性を選択する試みは続行されません。デフォルトは 2 です。サンプル サイズが大きくない場合、この値を制御する必要はありません。サンプル サイズが非常に大きい場合は、この値を増やすことをお勧めします。以前のプロジェクトの例には約 100,000 のサンプルがあり、デシジョン ツリーを構築するときに min_samples_split=10 を選択しました。参考として使用できます。

min_samples_leaf の値は、リーフ ノードの最小サンプル数を制限します。リーフ ノードの数がサンプル数よりも小さい場合、その兄弟ノードとともに枝刈りされます。デフォルトは 1 です。最小サンプル数の整数を入力することも、サンプルの総数に対する割合として最小サンプル数を入力することもできます。サンプルサイズが大きくない場合は、この値を気にする必要はありません。サンプル サイズが非常に大きい場合は、この値を増やすことをお勧めします。以前の 100,000 サンプル プロジェクトでは、参照のみのために min_samples_leaf 値 5 を使用しました。

max_features と min_impurity_decrease は
通常、ツリーを「洗練」するために max_ Depth とともに使用されます

max_features は、分岐時に考慮される機能の数を制限します。制限を超える機能は破棄されます。max_features は max_ Depth と同様、高次元データの過学習を制限するために使用される枝刈りパラメータですが、その手法はより暴力的であり、使用できる特徴量の数を直接制限し、決定木を強制的に停止するパラメータです。決定木を知らない場合、 の各特徴の重要度の場合、このパラメータを無理に設定するとモデルの学習が不十分になる可能性があります。次元削減による過学習を防止したい場合は、特徴選択モジュールで PCA、ICA、または次元削減アルゴリズムを使用することをお勧めします。

min_impurity_decrease は情報ゲインのサイズを制限し、設定値未満の情報ゲインでの分岐は発生しません。これは、バージョン 0.19 min_impurity_split が使用される前のバージョン 0.19 で更新された機能です。

class_weight & min_weight_fraction_leafターゲット重みパラメータ
属性は、モデルのトレーニング後に呼び出して表示できるモデルのさまざまなプロパティです。デシジョン ツリーの場合、最も重要なものは feature_importances_ です。これにより、モデルに対する各特徴の重要性を確認できます。デシジョン ツリーに最も一般的に使用されるインターフェイスは、apply とpredict です。apply の入力テスト セットは、各テスト サンプルが配置されているリーフ ノードのインデックスを返し、predict の入力テスト セットは、各テスト サンプルのラベルを返します。

X_trainおよびX_testの入力を必要とするすべてのインターフェイスでは、入力特徴行列は少なくとも 2 次元行列である必要があります。sklearn は、1 次元行列を特徴行列として入力として受け入れませんデータに特徴が 1 つしかない場合は、**reshape(-1,1)** を使用して行列に次元を追加する必要があります。データに特徴が 1 つとサンプルが 1 つしかない場合は、reshape(1,-1) を使用してデータに次元を追加します。

分類ツリー属性リスト
ここに画像の説明を挿入します
分類ツリー インターフェイス リスト
ここに画像の説明を挿入します
の概要:
決定木の基本プロセス、分類ツリーの 8 つのパラメーター、1 つの属性、4 つのインターフェイス、および描画に使用されるコード。
8 つのパラメーター: Criterion、2 つのランダム性関連パラメーター (random_state、splitter)、5 つの枝刈りパラメーター (max_ Depth、min_samples_split、min_samples_leaf、max_feature、min_impurity_decrease) 1 つの属性: feature_importances_ 4 つのインターフェイス: fit、score、apply

predict

赤ワインデータセットのケース

from sklearn import tree
from sklearn.datasets import load_wine
from sklearn.model_selection import train_test_split
import  matplotlib.pyplot as plt
import graphviz# 需要提前安装graphviz
wine = load_wine()
X_train, X_test, Y_train, Y_test = train_test_split(wine.data,wine.target,test_size=0.3)
clf = tree.DecisionTreeClassifier(criterion="entropy")
clf = clf.fit(X_train, Y_train)
score = clf.score(X_test, Y_test) #返回预测的准确度accuracy
print(score)
print(wine.feature_names)
print(wine.target_names)

feature_name = ['酒精','苹果酸','灰','灰的碱性','镁','总酚','类黄酮','非黄烷类酚类','花青素','颜色强度','色调','od280/od315稀释葡萄酒','脯氨酸']

dot_data = tree.export_graphviz(clf
                                ,feature_names = feature_name  # 特征名
                                ,class_names=["琴酒","雪莉","贝尔摩德"] #标签的名称,这里是自定义的
                                ,filled=True  # 颜色填充
                                ,rounded=True # 圆角边框
                               ) 
graph = graphviz.Source(dot_data)
graph

ここに画像の説明を挿入します

# random_state & splitter
clf = tree.DecisionTreeClassifier(criterion="entropy"
                                  ,random_state=30
                                  ,splitter="random"
                                 )
clf = clf.fit(X_train, Y_train)
score = clf.score(X_test, Y_test)
print(score)
#剪枝参数
clf = tree.DecisionTreeClassifier(criterion="entropy"
                                  ,random_state=30
                                  ,splitter="random"
                                  ,max_depth=3
                                  ,min_samples_leaf=10 # 将样本数量小于10的叶子节点剪掉
                                  ,min_samples_split=10 # 将中间节点样本数量小于10的剪掉
                                 )
clf = clf.fit(X_train, Y_train)
dot_data = tree.export_graphviz(clf
                                ,feature_names = feature_name 
                                ,class_names=["琴酒","雪莉","贝尔摩德"]
                                ,filled=True
                                ,rounded=True
                               ) 
graph = graphviz.Source(dot_data)
graph

ここに画像の説明を挿入します

# 确认最优参数,画学习曲线
deths_rt = []

for dep in range(1, 10):
    clf = tree.DecisionTreeClassifier(criterion="entropy"
                                      ,max_depth = dep
                                      ,random_state=30
                                      ,splitter="random"
                                      
                                     )
    clf = clf.fit(X_train, Y_train)
    score = clf.score(X_test, Y_test)  # 返回准确度
    deths_rt.append(score)
plt.plot(range(1, 10), deths_rt)

ここに画像の説明を挿入します

# 将特征名称与重要性对应
dict(zip(wine.feature_names, clf.feature_importances_))  
# 返回样本所在叶子节点的索引
clf.apply(X_test)

回帰木アルゴリズム API

class sklearn.tree.DecisionTreeRegressor(*, criterion='squared_error', splitter='best', max_depth=None, min_samples_split=2, min_samples_leaf=1, min_weight_fraction_leaf=0.0, max_features=None, random_state=None, max_leaf_nodes=None, min_impurity_decrease=0.0, ccp_alpha=0.0)

回帰ツリーでは、ラベルの分布が均衡しているかどうかは問題ではないため、class_weight などのパラメーターはありません。

パラメータの説明:
回帰木は、枝の品質を測定するための指標です。サポートされている標準は 3 つあります:
1) 「mse」と入力し、平均二乗誤差 (MSE) を使用します。親ノードとノード間の平均二乗誤差の差。リーフ ノードは特徴選択の基準として使用されます。この方法では、リーフ ノードの平均値を使用して L2 損失を最小限に抑えます。

2) フェルドマン平均二乗誤差を使用するには、「friedman_mse」と入力します。このメトリクスは、潜在的な分岐の問題に対してフリードマンの修正平均二乗誤差を使用します。

3) 絶対平均誤差 MAE (平均絶対誤差) を使用するには、「mae」を入力します。このインジケーターは、リーフ ノードの中央値を使用して、L1 損失を最小限に抑えます。最も重要な属性は依然として feature_importances_ であり、インターフェイスは引き続き適用されます。
フィット、予測、スコア、コア。

回帰ツリー インターフェイス スコアは、MSE ではなく R 二乗を返します。

デシジョン ツリーの長所と短所

デシジョンツリーの利点

  1. 木が描けて見えるので分かりやすく説明しやすい

  2. データの準備はほとんど必要ありません。他の多くのアルゴリズムでは、ダミー変数の作成や null 値の削除などのデータ正規化が必要になることがよくあります。ただし、sklearn のデシジョン ツリー モジュールは欠損値の処理をサポートしていないことに注意してください。

  3. ツリーを使用するコスト (データを予測する場合など) は、ツリーのトレーニングに使用されるデータ ポイント数の対数であり、他のアルゴリズムと比較して非常に低コストです。

  4. 数値データとカテゴリデータの両方を処理でき、回帰と分類の両方を実行できます。他の手法は、多くの場合、変数タイプが 1 つだけのデータ セットの分析に特化しています。

  5. 複数出力の問題、つまり複数のラベルを含む問題を処理できますが、1 つのラベルに複数のラベル分類を含む問題とは区別されることに注意してください。

  6. これはホワイト ボックス モデルであり、結果は簡単に解釈できます。モデル内で特定の状況が観察できる場合、その状況はブール論理によって簡単に説明できます。対照的に、ブラックボックス モデル (人工ニューラル ネットワークなど) では、結果の解釈がより困難になる可能性があります。

  7. モデルは統計的検定を使用して検証でき、これによりモデルの信頼性を検討できます。

  8. たとえその仮定がデータを生成した実際のモデルにある程度違反している場合でも、適切なパフォーマンスを発揮できます。

デシジョンツリーの欠点

  1. デシジョン ツリー学習者は、データに対して適切に一般化できない過度に複雑なツリーを作成する場合があります。これを過学習といいます。この問題を回避するには、枝刈り、リーフ ノードに必要なサンプルの最小数の設定、ツリーの最大深さの設定などのメカニズムが必要ですが、これらのパラメータの統合と調整は初心者にとって比較的わかりにくいものになります。

  2. デシジョン ツリーは不安定になる可能性があり、データの小さな変更によりまったく異なるツリーが生成される可能性があるため、この問題はアンサンブル アルゴリズムによって解決する必要があります。

  3. 決定木の学習は、局所最適 (各ノードの最適) を最適化することで全体の最適を達成しようとする貪欲アルゴリズムに基づいていますが、このアプローチは大域最適の決定木に戻ることを保証できません。この問題は、アンサンブル アルゴリズムによっても解決できます。ランダム フォレストでは、分岐プロセス中に特徴とサンプルがランダムにサンプリングされます。

  4. XOR、パリティ、マルチプレクサ問題など、一部の概念はデシジョン ツリーで簡単に表現できないため、学習が困難です。

  5. ラベル内の特定のクラスが支配的な場合、決定木学習器は支配的なクラスに偏ったツリーを作成します。したがって、デシジョン ツリーを当てはめる前にデータ セットのバランスをとることをお勧めします。

練習する

タイタニック号の乗客生存予測

タイタニックおよびタイタニック 2 データ フレームは、タイタニック号の個々の乗客の生存状況を記述します。ここで使用されるデータセットは、さまざまな研究者によって開始されました。これらには、多数の研究者によって作成され、マイケル A. フィンドレーによって編集された乗客リストが含まれます。抽出したデータセットの特徴は、チケット カテゴリ、生存、乗車クラス、年齢、着陸、自宅.目的地、部屋、チケット、ボート、性別です。

データ: http://biostat.mc.vanderbilt.edu/wiki/pub/Main/DataSets/titanic.txt

データを観察すると、次のことがわかります。
1. 乗客クラスは、社会経済的クラスの代表である乗客クラス (1、2、3) を指します。
2 年齢データが欠落しています。

import pandas as pd
import numpy as np
from sklearn import tree
from sklearn.feature_extraction import DictVectorizer
from sklearn.model_selection import train_test_split
from sklearn.tree import DecisionTreeClassifier, export_graphviz

# 1、获取数据
titan = pd.read_csv("titanic.csv")

#2、数据基本处理
#2.1 确定特征值,目标值
x = titan[["pclass", "age", "sex"]]
y = titan["survived"]

#2.2 缺失值处理
x['age'].fillna(x['age'].mean(), inplace=True)

#2.3 数据集划分
x_train, x_test, y_train, y_test = train_test_split(x, y, random_state=22)


#3.特征工程(字典特征抽取)
# 对于x转换成字典数据x.to_dict(orient="records")
# [{"pclass": "1st", "age": 29.00, "sex": "female"}, {}]
transfer = DictVectorizer(sparse=False)
x_train = transfer.fit_transform(x_train.to_dict(orient="records"))
x_test = transfer.fit_transform(x_test.to_dict(orient="records"))


# 4.机器学习(决策树)
estimator = DecisionTreeClassifier(criterion="entropy", max_depth=5)
estimator.fit(x_train, y_train)


# 5.模型评估
estimator.score(x_test, y_test)

estimator.predict(x_test)

おすすめ

転載: blog.csdn.net/qq_45694768/article/details/120754428