デシジョン ツリーとランダム フォレストの理論、実装、ハイパーパラメータ調整

王林
リリース: 2023-04-15 17:16:03
転載
1441 人が閲覧しました

この記事では、デシジョン ツリーとランダム フォレスト モデルについて詳しく紹介します。さらに、デシジョン ツリーとランダム フォレストのどのハイパーパラメータがパフォーマンスに大きな影響を与えるかを示し、過小適合と過適合の間の最適な解決策を見つけることができます。デシジョン ツリーとランダム フォレストの背後にある理論を理解した後。 、Scikit-Learnを使用して実装していきます。

1. デシジョン ツリー

デシジョン ツリーは、機械学習の予測モデリングにとって重要なアルゴリズムです。古典的なデシジョン ツリー アルゴリズムは何十年も前から存在しており、ランダム フォレストなどの最新のアルゴリズムは利用可能な最も強力な手法の 1 つです。

通常、このようなアルゴリズムは「デシジョン ツリー」と呼ばれますが、R などの一部のプラットフォームでは CART と呼ばれます。 CART アルゴリズムは、バギング デシジョン ツリー、ランダム フォレスト、ブースティング デシジョン ツリーなどの重要なアルゴリズムの基礎を提供します。

線形モデルとは異なり、デシジョン ツリーはノンパラメトリック モデルです。数学的な決定関数によって制御されず、最適化する重みや切片がありません。実際、デシジョン ツリーは特徴を考慮して空間を分割します。

CART モデル表現

CART モデルの表現はバイナリ ツリーです。これはアルゴリズムとデータ構造からなるバイナリ ツリーです。各ルート ノードは、入力変数 (x) とその変数の分割点を表します (変数が数値であると仮定します)。

ツリーのリーフ ノードには、予測を行うために使用される出力変数 (y) が含まれています。新しい入力が与えられると、ツリーのルート ノードから開始して特定の入力を計算することによってツリーが走査されます。

デシジョン ツリーの利点は次のとおりです。

  • 理解と解釈が簡単です。樹木を視覚化することができます。
  • データの準備はほとんど必要ありません。
  • 数値データとカテゴリデータを処理する能力。
  • 統計テストを使用してモデルを検証できます。
  • データを生成した実際のモデルがある程度の想定に反している場合でも、良好なパフォーマンスを発揮します。

デシジョン ツリーの欠点は次のとおりです:

  • 過学習。この問題を回避するには、枝刈り、リーフ ノードに必要なサンプルの最小数の設定、ツリーの最大深さの設定などのメカニズムが必要です。
  • デシジョン ツリーは不安定になる可能性があります。決定木はアンサンブルで使用できます。
  • グローバル最適決定木が返されるという保証はありません。 1 つのアンサンブル学習器で複数のツリーをトレーニングできます。
  • デシジョン ツリー学習器は、特定のカテゴリが優勢な場合に偏ったツリーを作成します。推奨事項: フィッティング前にデータセットのバランスをとります

2. ランダム フォレスト

ランダム フォレストは、最も人気があり強力な機械学習アルゴリズムの 1 つです。これは、ブートストラップ集約またはバギングと呼ばれる統合機械学習アルゴリズムです。

デシジョン ツリーのパフォーマンスを向上させるために、ランダムな特徴サンプルを含む多数のツリーを使用できます。

3.Python でのデシジョン ツリーとランダム フォレストの実装

デシジョン ツリーとランダム フォレストを使用して、貴重な従業員の損失を予測します

import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
import seaborn as sns
%matplotlib inline


sns.set_style("whitegrid")
plt.style.use("fivethirtyeight")
df = pd.read_csv("WA_Fn-UseC_-HR-Employee-Attrition.csv")
ログイン後にコピー
4. データ処理

from sklearn.preprocessing import LabelEncoder
from sklearn.model_selection import train_test_split




df.drop(['EmployeeCount', 'EmployeeNumber', 'Over18', 'StandardHours'], axis="columns", inplace=True)


categorical_col = []
for column in df.columns:
if df[column].dtype == object and len(df[column].unique()) 50:
categorical_col.append(column)
df['Attrition'] = df.Attrition.astype("category").cat.codes


categorical_col.remove('Attrition')


label = LabelEncoder()
for column in categorical_col:
df[column] = label.fit_transform(df[column])


X = df.drop('Attrition', axis=1)
y = df.Attrition


X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.3, random_state=42)
ログイン後にコピー

5. アプリケーション ツリーとランダム フォレスト アルゴリズム

from sklearn.metrics import accuracy_score, confusion_matrix, classification_report


def print_score(clf, X_train, y_train, X_test, y_test, train=True):
if train:
pred = clf.predict(X_train)
print("Train Result:n================================================")
print(f"Accuracy Score: {accuracy_score(y_train, pred) * 100:.2f}%")
print("_______________________________________________")
print(f"Confusion Matrix: n {confusion_matrix(y_train, pred)}n")
elif train==False:
pred = clf.predict(X_test)
print("Test Result:n================================================")
print(f"Accuracy Score: {accuracy_score(y_test, pred) * 100:.2f}%")
print("_______________________________________________")
print(f"Confusion Matrix: n {confusion_matrix(y_test, pred)}n")
ログイン後にコピー

5.1 デシジョン ツリー分類器

デシジョン ツリー パラメーター:

    基準: スプリットの品質を測定します。サポートされている基準は、不純度の「ジニ」と情報利得の「エントロピー」です。
  • splitter: 各ノードでスプリットを選択するために使用される戦略。サポートされている戦略は、最適な分割を選択する「ベスト」とランダムな分割を選択する「ランダム」です。
  • max_ Depth: ツリーの最大の深さ。 None の場合、すべてのリーフ ノードが含まれるか、すべてのリーフに含まれるサンプルが min_samples_split 未満になるまでノードを展開します。
  • min_samples_split: 内部ノードを分割するために必要なサンプルの最小数。
  • min_samples_leaf: リーフ ノードに必要なサンプルの最小数。
  • min_weight_fraction_leaf: リーフ ノードに必要な合計重みの最小重み付き部分。 Sample_weight が指定されていない場合、サンプルの重みは同じになります。
  • max_features: 最適な分割を見つけるときに考慮する特徴の数。
  • max_leaf_nodesmax_leaf_nodes: max_leaf_nodes を使用して、最良優先の方法でツリーを形成します。最適なノードは、不純物の相対的な減少として定義されます。 None の場合、リーフ ノードの数は無制限になります。
  • min_impurity_decrease: 分割によって不純物がこの値以上減少した場合、ノードは分割されます。
  • min_impurity_split: 早期停止のしきい値。ノードの不純物がしきい値を超えている場合、ノードは分割され、そうでない場合はリーフになります。
from sklearn.tree import DecisionTreeClassifier


tree_clf = DecisionTreeClassifier(random_state=42)
tree_clf.fit(X_train, y_train)


print_score(tree_clf, X_train, y_train, X_test, y_test, train=True)
print_score(tree_clf, X_train, y_train, X_test, y_test, train=False)
ログイン後にコピー
5.2 デシジョン ツリー分類子のハイパーパラメーターの調整

ハイパーパラメーター max_ Depth は、デシジョン ツリー全体の複雑さを制御します。このハイパーパラメータにより、デシジョン ツリーの過小適合と過適合の間のトレードオフが可能になります。分類と回帰のために浅いツリーを構築してから、パラメータの影響を理解するために深いツリーを構築しましょう。

ハイパーパラメータ min_samples_leaf、min_samples_split、max_leaf_nodes、または min_implitity_reduce を使用すると、リーフまたはノード レベルで制約を適用できます。ハイパーパラメータ min_samples_leaf は、リーフに許可されるサンプルの最小数です。それ以外の場合、それ以上の分割は検索されません。これらのハイパーパラメータは、max_ Depth ハイパーパラメータの補足として使用できます。

from sklearn.tree import DecisionTreeClassifier
from sklearn.model_selection import GridSearchCV


params = {
"criterion":("gini", "entropy"),
"splitter":("best", "random"),
"max_depth":(list(range(1, 20))),
"min_samples_split":[2, 3, 4],
"min_samples_leaf":list(range(1, 20)),
}


tree_clf = DecisionTreeClassifier(random_state=42)
tree_cv = GridSearchCV(tree_clf, params, scoring="accuracy", n_jobs=-1, verbose=1, cv=3)
tree_cv.fit(X_train, y_train)
best_params = tree_cv.best_params_
print(f"Best paramters: {best_params})")


tree_clf = DecisionTreeClassifier(**best_params)
tree_clf.fit(X_train, y_train)
print_score(tree_clf, X_train, y_train, X_test, y_test, train=True)
print_score(tree_clf, X_train, y_train, X_test, y_test, train=False)
ログイン後にコピー

5.3树的可视化

from IPython.display import Image
from six import StringIO
from sklearn.tree import export_graphviz
import pydot


features = list(df.columns)
features.remove("Attrition")
dot_data = StringIO()
export_graphviz(tree_clf, out_file=dot_data, feature_names=features, filled=True)
graph = pydot.graph_from_dot_data(dot_data.getvalue())
Image(graph[0].create_png())
ログイン後にコピー

デシジョン ツリーとランダム フォレストの理論、実装、ハイパーパラメータ調整

5.4随机森林

随机森林是一种元估计器,它将多个决策树分类器对数据集的不同子样本进行拟合,并使用均值来提高预测准确度和控制过拟合。

随机森林算法参数:

  • n_estimators: 树的数量。
  • criterion: 衡量拆分质量的函数。支持的标准是gini和信息增益的“熵”。
  • max_depth:树的最大深度。如果为None,则展开节点,直到所有叶子都是纯的,或者直到所有叶子包含的样本少于min_samples_split。
  • min_samples_split:拆分内部节点所需的最小样本数。
  • min_samples_leaf:叶节点所需的最小样本数。min_samples_leaf只有在左右分支中的每个分支中至少留下训练样本时,才会考虑任何深度的分割点。这可能具有平滑模型的效果,尤其是在回归中。
  • min_weight_fraction_leaf:需要在叶节点处的总权重(所有输入样本的)的最小加权分数。当未提供 sample_weight 时,样本具有相同的权重。
  • max_features:寻找最佳分割时要考虑的特征数量。
  • max_leaf_nodesmax_leaf_nodes:以最佳优先方式种植一棵树。最佳节点定义为杂质的相对减少。如果 None 则无限数量的叶节点。
  • min_impurity_decrease:如果该分裂导致杂质减少大于或等于该值,则该节点将被分裂。
  • min_impurity_split: 树提前停止的阈值。如果一个节点的杂质高于阈值,则该节点将分裂,否则,它是一个叶子。
  • bootstrap:构建树时是否使用bootstrap样本。如果为 False,则使用整个数据集来构建每棵树。
  • oob_score:是否使用out-of-bag样本来估计泛化准确度。
from sklearn.ensemble import RandomForestClassifier


rf_clf = RandomForestClassifier(n_estimators=100)
rf_clf.fit(X_train, y_train)


print_score(rf_clf, X_train, y_train, X_test, y_test, train=True)
print_score(rf_clf, X_train, y_train, X_test, y_test, train=False)
ログイン後にコピー

5.5随机森林超参数调优

调优随机森林的主要参数是n_estimators参数。一般来说,森林中的树越多,泛化性能越好,但它会减慢拟合和预测的时间。

我们还可以调优控制森林中每棵树深度的参数。有两个参数非常重要:max_depth和max_leaf_nodes。实际上,max_depth将强制具有更对称的树,而max_leaf_nodes会限制最大叶节点数量。

n_estimators = [100, 500, 1000, 1500]
max_features = ['auto', 'sqrt']
max_depth = [2, 3, 5]
max_depth.append(None)
min_samples_split = [2, 5, 10]
min_samples_leaf = [1, 2, 4, 10]
bootstrap = [True, False]


params_grid = {'n_estimators': n_estimators, 'max_features': max_features,
'max_depth': max_depth, 'min_samples_split': min_samples_split,
'min_samples_leaf': min_samples_leaf, 'bootstrap': bootstrap}


rf_clf = RandomForestClassifier(random_state=42)


rf_cv = GridSearchCV(rf_clf, params_grid, scoring="f1", cv=3, verbose=2, n_jobs=-1)


rf_cv.fit(X_train, y_train)
best_params = rf_cv.best_params_
print(f"Best parameters: {best_params}")


rf_clf = RandomForestClassifier(**best_params)
rf_clf.fit(X_train, y_train)


print_score(rf_clf, X_train, y_train, X_test, y_test, train=True)
print_score(rf_clf, X_train, y_train, X_test, y_test, train=False)
ログイン後にコピー

最后

本文主要讲解了以下内容:

  • 决策树和随机森林算法以及每种算法的参数。
  • 如何调整决策树和随机森林的超参数。
  • 在训练之前需要平衡你的数据集。
  • 从每个类中抽取相同数量的样本。
  • 通过将每个类的样本权重(sample_weight)的和归一化为相同的值。

以上がデシジョン ツリーとランダム フォレストの理論、実装、ハイパーパラメータ調整の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

ソース:51cto.com
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
最新の問題
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート
私たちについて 免責事項 Sitemap
PHP中国語ウェブサイト:福祉オンライン PHP トレーニング,PHP 学習者の迅速な成長を支援します!