[SkLearn分類、回帰アルゴリズム] DecisionTreeClassifier分類ツリー



DecisionTreeClassifier分類ツリー

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, min_impurity_split=None,
class_weight=None, presort=False)

①重要なパラメータ:基準不純物の計算

♦基本的な概念

テーブルをツリーに変換するために、決定木は最適なノードと最適な分岐方法を見つける必要があります。分類ツリーの場合、この「最良」の尺度は「不純物」と呼ばれます。一般的に不纯度越低,决策树对训练集的拟合越好言えば、現在使用されているディシジョンツリーアルゴリズムの分岐方法の中核は、主に特定の不純物関連インデックスの最適化に関するものです。

不純物はノードに基づいて計算されます。ツリー内の各ノードには不純物があり、子ノードの不純物は親ノードの不純物よりも低くなければなりません。つまり、同じ決定木では、リーフノードの不純物はbeは最低です。

Criterion参数不純物を測定するための計算方法です。sklearnには2つのオプションがあります。

  • entropy」と入力し信息熵(Entropy)
  • gini」と入力し基尼系数(Gini Impurity)
    ここに画像の説明を挿入

tが特定のノードを表す場合、iはラベルの分類を表します。p(i∣t)p(i | t)pはI |トンノードTのラベルカテゴリiの割合を表しています。

注:情報エントロピーを使用する場合、sklearnは実際には情報エントロピーに基づいて情報ゲイン(情報ゲイン)を計算します父节点的信息熵和子节点的信息熵之差ジニ信息熵对不纯度更加敏感,对不纯度的惩罚最强係数しかし、実際の使用では、情報エントロピーとジニ係数の影響は基本的に同じです。ジニ係数の計算には対数が含まれないため、情報エントロピービキニ係数の計算は遅くなります。さらに、情報エントロピーは信息熵作为指标时,决策树的生长会更加“精细”,因此对于高维数据或者噪音很多的数据,信息熵很容易过拟合不純物に対してより敏感であるため、この場合、ジニ係数の方が優れていることがよくあります。

情報エントロピーの理解については、ブログ投稿を参照してください〜

トップに戻る


♦選択方法

ここに画像の説明を挿入

トップに戻る


♦基本的な計算プロセス

ここに画像の説明を挿入

  • 直到没有更多的特征可用,或整体的不纯度指标已经最优,决策树就会停止生长。

トップに戻る


♦ケース

import pandas  as  pd
from sklearn import tree
from sklearn.datasets import load_wine
from sklearn.model_selection import train_test_split
from sklearn.tree import DecisionTreeClassifier

# 获取数据集
wine_data = load_wine()
x = pd.DataFrame(wine_data.data)
y = wine_data.target
feature = wine_data.feature_names
x.columns = feature

# 划分测试集、训练集
xtrain, xtest, ytrain, ytest = train_test_split(x, y, test_size=0.3, random_state=420)

# 建模
clf = DecisionTreeClassifier(criterion="entropy").fit(xtrain, ytrain)
# 返回预测的准确度 accuracy
score = clf.score(xtest, ytest)  # 0.9629629629629629

feature_name = ['酒精','苹果酸','灰','灰的碱性','镁','总酚','类黄酮','非黄烷类酚类','花青素','颜色强度','色调','od280/od315稀释葡萄酒','脯氨酸']
import graphviz
dot_data = tree.export_graphviz(clf
                                ,feature_names= feature_name
                                ,class_names=["琴酒","雪莉","贝尔摩德"]
                                ,filled=True
                                ,rounded=True
                                )
graph = graphviz.Source(dot_data)
print(graph)
  • filled=True カテゴリに応じて色を記入してください

  • rounded=True 表示されたボックスの角が丸いかどうか

  • 描かれた決定木モデルを通して、それentropyが前述の情報エントロピー不純物計算方法の結果であることわかります。値が小さいほど、検証は次のようになります。不纯度基于节点来计算,树中的每个节点都会有一个不纯度,并且子节点的不纯度一定是低于父节点的
    ここに画像の説明を挿入

  • 機能の重要性を確認し、それらを一致させます。(回帰モデルの回帰係数と同様)

#特征重要性
feature_im = clf.feature_importances_
match = [*zip(feature_name,clf.feature_importances_)]

ここに画像の説明を挿入
トップに戻る


②重要なパラメータ:random_state&splitter

random_state用来设置分枝中的随机模式的参数、デフォルトはNoneで、高次元データではランダム性がより明確になり、低次元データ(アイリスデータセットなど)のランダム性はほとんど現れません。任意の整数を入力すると、モデルを安定させるために同じツリーが常に成長します。

splitter也是用来控制决策树中的随机选项的,有两种输入值输入”best"木の枝には、ランダムなものの、それでも、M.のより重要な特徴(重要性がプロパティfeature_importances_を通して見ることができる)を好む输入“random"、決定これは、過剰適合を防ぐ方法でもあります。モデルが過剰適合すると予測する場合は、これら2つのパラメーターを使用して、ツリーの構築後に過剰適合する可能性を減らします。もちろん、ツリーが構築された後も、過剰適合を防ぐために剪定パラメーターを使用します。

clf = tree.DecisionTreeClassifier(criterion="entropy"
                                 ,random_state=30
                                 ,splitter="random"
                                 )
clf = clf.fit(Xtrain, Ytrain)
score = clf.score(Xtest, Ytest)
score
import graphviz
dot_data = tree.export_graphviz(clf
                               ,feature_names= feature_name
                               ,class_names=["琴酒","雪莉","贝尔摩德"]
                               ,filled=True
                               ,rounded=True
                               )  
graph = graphviz.Source(dot_data)
graph
  • 明らかに、スプリッターパラメータがランダムに設定されている場合、フィットされたツリーモデルの深さは最良よりも深くなります(画像が大きいため、切片は完全ではありません)。
    ここに画像の説明を挿入
    トップに戻る

③剪定パラメータ

制限なしで、決定木は、不純物の指標が最良になるまで、または利用可能な機能がなくなるまで成長します。このような決定木は過剰適合する傾向があります。つまり、トレーニングセットでは非常に良好に機能しますが、テストセットでは不十分になります。収集したサンプルデータは、全体的な状況と完全に一致するわけではないため、決定木がトレーニングデータに対して解釈可能性が高すぎる場合、決定木が検出するルールには、トレーニングサンプルにノイズが含まれ、未知のデータに十分に適合しないようにする必要があります。。(没有绝对的完美,就是说对于模型对于训练集的拟合越是完美,细节过于到位,其局限性就越高,或许拟合出来的模型对于新数据集的适应能力反而较差

デシジョンツリーの一般化を改善するには、デシジョンツリーを削除する必要があります。剪枝策略对决策树的影响巨大,正确的剪枝策略是优化决策树算法的核心sklearnは、さまざまな剪定戦略を提供します。

▶max_depth

max_depth限制树的最大深度、設定された深さを超えるすべてのブランチが切断されます。これは最も広く使用されている剪定パラメーターであり、高次元性と低サンプルサイズで非常に効果的です。デシジョンツリーがもう1つのレイヤーに成長すると、サンプルサイズの需要が倍増するため、ツリーの深さを制限すると、過剰適合を効果的に制限できます。また、統合アルゴリズムでも非常に役立ちます。実際の使用では、3から始めてフィッティングの効果を確認してから、設定深度を増やすかどうかを決定することをお勧めします。
ここに画像の説明を挿入

▶min_samples_leaf&min_samples_split

  • min_samples_leaf限定、分岐後のノードの各子ノードには、少なくともmin_samples_leafトレーニングサンプルが含まれている必要があります。そうでない場合、分岐は発生しないか、各子ノードにmin_samples_leafサンプルが含まれることを満足する方向に分岐が発生します。通常、max_depthとともに使用され、回帰ツリーに魔法の効果があり、モデルをよりスムーズにすることができます。このパラメーターの数を小さく設定しすぎると過剰適合が発生し、大きく設定しすぎるとモデルがデータを学習できなくなります。一般的に、5から始めることをお勧めします。リーフノードに含まれるサンプルサイズが大幅に変化する場合は、使用するサンプルサイズのパーセンテージとして浮動小数点数を入力することをお勧めします。同時に、このパラメーターは各リーフの最小サイズを保証し、回帰問題での低分散とリーフノードの過剰適合を回避できます。カテゴリが少ない分類問題の場合、通常は1が最適です。
    ここに画像の説明を挿入

  • min_samples_split限定、このノードを分岐できるようにするには、ノードに少なくともmin_samples_splitトレーニングサンプルが含まれている必要があります。含まれていない場合、分岐は発生しません。
    ここに画像の説明を挿入

▶max_features&min_impurity_decrease

  • 通常、max_depthは、ツリーを「調整」するために使用されます。
  • max_features分岐時に考慮される機能の数を制限すると、制限を超える機能は破棄されますmax_depthと同様に、max_featuresは、高次元データの過剰適合を制限するために使用されるプルーニングパラメーターですが、その方法はより暴力的です。使用できる機能の数を直接制限し、決定木のパラメーターを強制的に停止します。 。決定木がわからない場合各特徴の重要度が高い場合、このパラメータを無理に設定するとモデル学習が不十分になることがあります。次元削減による過剰適合を防ぎたい場合は、特徴選択モジュールでPCA、ICA、または次元削減アルゴリズムを使用することをお勧めします。
  • min_impurity_decrease情報ゲインのサイズを制限すると、情報ゲインが設定値未満の分岐は発生しません。sklearnが実際に計算するのは、情報エントロピーに基づく情報ゲインです父节点的信息熵和子节点的信息熵之差つまり、親ノードと子ノードの間のentroyの差が大きいほど、ツリー全体のフィッティング効果に対するこのレイヤーの寄与が大きくなります。

▶最適な剪定パラメータを確認します

  • では、各パラメーターの値をどのように決定しますか?このとき、曲線を使用してハイパーパラメータを決定し、判断を下し、
    トレーニングし決定木モデルclfを引き続き使用します超参数的学习曲线,是一条以超参数的取值为横坐标,模型的度量指标为纵坐标的曲 线,它是用来衡量不同超参数取值下模型的表现的线構築したデシジョンツリーでは、モデルメトリックはスコアです。
import matplotlib.pyplot as plt

scores = []
for i in range(10):
    clf = tree.DecisionTreeClassifier(criterion="entropy"
                                     ,random_state=30
                                     ,splitter="random"
                                     ,max_depth=i+1
                                     ).fit(xtrain, ytrain)
    score = clf.score(xtest, ytest)
    scores.append(score)
fig = plt.figure(figsize=(10,6))
plt.plot(range(1,11),scores)
plt.show()

ここでは、さまざまなmax_depthパラメーターを使用して学習曲線を描画します。画像から、木の深さが5の場合、モデルの精度が最大になり、6になると精度が低下し、その後変化しないことがわかります。 。これは、6以降のツリーの深さがモデルにほとんど影響を与えないことを示しています。
ここに画像の説明を挿入

▶ターゲットウェイトパラメータ:class_weight&min_weight_fraction_leaf

  • 完成样本标签平衡的参数サンプルの不均衡は、データセットのセットで、ラベルのカテゴリが自然に大きな割合を占めることを意味します。例えば、銀行では「クレジットカードを持っている人がデフォルトするかどうか」、つまり「はい」と「いいえ」の比率(1%:99%)を判断する必要があります。この分類状況では、モデルが何もせず、結果を「いいえ」と予測した場合でも、正解率は99%になる可能性があります。したがって、class_weightパラメーターを使用して、サンプルラベルのバランスをある程度取り、少数のラベルにより多くの重みを与え、モデルを少数派クラスに偏らせ、少数派クラスをキャプチャする方向にモデル化する必要があります。该参数默认None,此模式表示自动给与数据集中的所有标签相同的权重

  • 重みを使用すると、サンプルサイズは単にレコードの数ではなく、入力の重みの影響を受けます。したがって、この時点で、重みベースのプルーニングパラメーターmin_weight_fraction_leafを使用してプルーニングを使用する必要があります。また、重みベースのプルーニングパラメーター(min_weight_fraction_leafなど)は、サンプルの重みを知らない基準(min_samples_leafなど)よりも支配階級へのバイアスが少ないことにも注意してください。サンプルに重みが付けられている場合、重みベースの事前プルーニング基準を使用してツリー構造を最適化する方が簡単です。これにより、リーフノードにサンプルの重みの合計の少なくとも小さな部分が含まれるようになります。

トップに戻る


④重要な属性とインターフェース

属性は、モデルのトレーニング後に呼び出すことができるモデルのさまざまなプロパティです。对决策树来说,最重要的是feature_importances_,能够查看各个特征对模型的重要性多くのインターフェースのsklearnアルゴリズムは類似しています。たとえば、以前に使用fitしたscoreことがあり、ほとんどの場合、各アルゴリズムに使用できます。これらの2つのインターフェースに加えて、決定木に最も一般的に使用されるインターフェースはapplysumpredictです。apply中输入测试集返回每个测试样本所在的叶子节点的索引predict输入测试集返回每个测试样本的标签
ここに画像の説明を挿入
トップに戻る


総括する

7つのパラメーター:

  • Criterion 不純物の計算
  • 2つのランダムに関連するパラメーター(random_statesplitter
  • 四つプルーニングパラメータ(max_depthmin_sample_leafmax_featuremin_impurity_decrease

属性:feature_importances_

四つのfitインターフェイス:scoreapply、、predict


おすすめ

転載: blog.csdn.net/qq_45797116/article/details/113352201