Financial Scoring Card Project—4。消耗の早期警告モデルにおけるGBDTモデルの適用

1.GBDTモデルの概要

  勾配ブースティングツリーは、分類、回帰、および並べ替えに使用できるアンサンブルモデルです。GBDTの中核は、すべてのツリーの結果を最終結果として蓄積することです。GBDTは分類に使用でき、すべての分類ツリーを蓄積した結果であることを意味するものではありません。GBDTのツリーは、分類ツリーではなく、回帰ツリー(二乗誤差最小化基準、特徴選択、およびバイナリツリーの生成を使用)です。これは、GBDTを理解するために非常に重要です。
  勾配ブースティングツリー。損失関数が二乗損失の場合、次のツリーフィッティングは、前のツリーの残差値(実際の値から予測値を引いたもの)です。損失関数が非二乗損失の場合、損失関数の負の勾配値が適合されます。

簡単な例:
Aの実際の年齢は18歳ですが、最初の木の予測年齢は12歳で、6年遅れています。つまり、残余は6歳です。次に、2番目のツリーでAの年齢を6歳に設定して学習します.2番目のツリーが実際にAを6歳のリーフノードに分割できる場合、2つのツリーを追加するという結論はAの真の年齢です。 2番目のツリーの結論は5歳ですが、Aにはまだ1年の残差があり、3番目のツリーのAの年齢は1歳になるので、学習を続けます。

  損失関数が二乗差損失である場合、残余はグローバル最適の絶対方向として使用され、勾配はそれを解決する必要はありません。ただし、損失関数には多くの種類があります。損失関数が非二乗損失の場合、機械学習の大物であるFreidmanは、勾配ブーストアルゴリズムを提案しました。つまり、最速の降下近似法を使用します。つまり、回帰としての現在のモデルの損失関数の負の勾配問題のリフティングツリーアルゴリズムの残余の近似値は、回帰ツリーに適合されます。
ここに画像の説明を挿入します

特徴:

  • 単純な回帰決定木に基づく組み合わせモデル

    デシジョンツリーの利点:

    強力な説明、
    変数の
    交互作用を可能にし、外れ値、欠測値、および共線性に鈍感

    デシジョンツリーのデメリット:

    精度が十分に高くなく、
    過剰適合しやすく、
    大量の計算

  • 最急降下法の方向にブースト

  • 数値の連続変数のみを受け入れる-特徴変換が必要です(カテゴリ変数を離散変数に変換します)

利点:

  • 高精度
  • オーバーフィットするのは簡単ではありません

1.ケースのGBDT構造

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

2.GBDTの一般的に使用されるパラメーター

パラメータ分析の詳細については、sklearn公式ウェブサイトGBDTフレームワークの共通パラメータを参照して
ください。

n_estimators:分類木の数K

Learning_rate:各弱い学習者の減量係数vvv、ステップサイズとも呼ばれます。小さいvvvは、弱い学習者の反復がさらに必要であることを意味します。
パラメータn_estimatorsとlearning_rateは一緒に調整する必要があります。小さいvvから開始できますvパラメーターの調整を開始します。デフォルトは1です。これら2つのパラメーター間の関係は逆で、一方は大きく、もう一方は小さくなります。

サブサンプル:(置換されない)サンプリングレート、[0.5、0.8]の間で推奨、デフォルトは1.0、つまり、サブサンプリングは使用されません

init:初期化中の弱い学習者。通常、データの先験的な知識がある場合、または以前に何らかのフィッティングが行われた場合に使用されます。

損失:GBDTアルゴリズムの損失関数

max_features:{'auto'、 'sqrt'、 'log2'}、intまたはfloat、default = None
寻找最佳分割時需要
考虑的有効整数intの場合、各分割でmax_features機能を検討します。
floatの場合、max_featuresは分数であり、int(max_features * n_features)機能が各分割で考慮されます。
'auto'の場合、max_features = sqrt(n_features)。
'sqrt'の場合、max_features = sqrt(n_features)。
'log2'の場合、max_features = log2(n_features)。
Noneの場合、max_features = n_features。

弱い分類ツリーのパラメーター:

max_features:分割時に考慮される特徴の最大数

max_depth:デシジョンツリーの最大深度

min_samples_split:内部ノードを細分化するために必要なサンプルの最小数。デフォルトは2です。サンプルサイズが大きくない場合は、この値を気にする必要はありません。サンプルサイズが非常に大きい場合は、この値を増やすことをお勧めします

min_samples_leaf:リーフノードのサンプルの最小数

min_weight_fraction_leaf:リーフノードの最小サンプル重み。デフォルトは0です。つまり、重みの問題は考慮されません。一般的に、欠測値のあるサンプル多い場合や、分類ツリーサンプルの分布カテゴリの偏差が大きい場合は、サンプルの重みが導入されます。このとき、この値に注意する必要があります。

max_leaf_nodes:リーフノードの最大数リーフノードの最大数を制限することにより、過剰適合を防ぐことができます

min_impurity_split:ノード分割の最小不純物

2.分類子パフォーマンスインデックス-AUC

  AUC曲線とROC曲線を理解したい場合は、混同行列の概念を完全に理解する必要があります
混同行列には、正、負、偽、真の概念があります。

  • 予測されるカテゴリ0は負であり、予測されるカテゴリ1は正です。
  • 予測が間違っている場合、それはFalse(false)であり、予測が正しい場合はTrue(true)です。

上記の概念を組み合わせると、混同行列ができます。
ここに画像の説明を挿入します
ここに画像の説明を挿入します
ここに画像の説明を挿入します
ここに画像の説明を挿入します
ここに画像の説明を挿入します
ROC計算プロセスはこのブログを参照してください

3.消耗の早期警告モデルにおけるGBDTの適用

1.チューニングプロセス

モジュールのインポート、データセットのロード、データセットの分割

# 导入模块
import pandas as pd
import numpy as np
from sklearn.ensemble import GradientBoostingClassifier
from sklearn.model_selection import train_test_split, KFold, GridSearchCV
from sklearn import ensemble, metrics

# 读取预处理后的数据集
modelData = pd.read_csv('data/modelData.csv', header=0)
allFeatures = list(modelData.columns)
# 移除CUST_ID与CHURN_CUST_IND列
allFeatures.remove('CUST_ID')
allFeatures.remove('CHURN_CUST_IND')

# 切割数据集
x_train, x_test, y_train, y_test = train_test_split(modelData[allFeatures], modelData['CHURN_CUST_IND'], test_size=0.3,
                                                    shuffle=True)
print(y_train.value_counts())
print(y_test.value_counts())

デフォルトで設定されているGBDT

# 1.使用默认模型参数
gbdt_0 = GradientBoostingClassifier(random_state=10)
gbdt_0.fit(x_train, y_train)
y_pred = gbdt_0.predict(x_test)
# predict_proba生成一个n行k列的数组,其中n为样本数据量,k为标签个数,
# 每一行为某个样本属于某个标签的概率,每行概率和为1
y_pred_prob = gbdt_0.predict_proba(x_test)[:, 1]
# %g 浮点数字(根据值的大小采用%e或%f)
print('Accuracy : %.4g' % metrics.accuracy_score(y_test, y_pred))
print('AUC(Testing) : %f' % metrics.roc_auc_score(y_test, y_pred_prob))

# 训练集上的accuracy、auc
y_pred_1 = gbdt_0.predict(x_train)
y_pred_prob_1 = gbdt_0.predict_proba(x_train)[:, 1]
print('Accuracy : %.4g' % metrics.accuracy_score(y_train, y_pred_1))
print('AUC(Training) : %f' % metrics.roc_auc_score(y_train, y_pred_prob_1))

調整の最初のステップ:
  最初に学習率(ステップサイズ)とn_estimators(反復回数)から始めます一般に、最適な反復回数をグリッド検索するために、より小さいステップサイズが選択されます。ここでは、学習率を0.1に設定し、検索される反復回数を20〜80に設定して、n_estimators(反復回数)決定することもできます。

# 2.设置一个较小的learning_rate,网格搜索n_estimators
params_test = {
    
    'n_estimators': np.arange(20, 81, 10)}
gbdt_1 = GradientBoostingClassifier(learning_rate=0.1, min_samples_split=300, min_samples_leaf=20,
                                    max_depth=8, max_features='sqrt', subsample=0.8, random_state=10)
gs = GridSearchCV(estimator=gbdt_1, param_grid=params_test, scoring='roc_auc', cv=5)
gs.fit(x_train, y_train)
print('模型最佳参数为', gs.best_params_)
print('模型最好的评分为', gs.best_score_)
模型最佳参数为 {
    
    'n_estimators': 80}
模型最好的评分为 0.9999988452344752

パラメータ調整の2番目のステップ:
学習率と反復回数が決定された後、決定木のパラメータの調整を開始します。最初に、決定木の最大深度max_depthと内部ノードの細分割に必要な最小サンプル数min_samples_splitグリッド検索実行します。検索範囲はそれぞれ3〜13と100〜800です内部ノードを細分化するために必要なサンプルの最小数min_samples_splitは、デシジョンツリーの他のパラメーターにも関連しているため、最初にデシジョンツリーの最大深度max_depthを決定します。

# 3.对max_depth与min_samples_split进行网格搜索
params_test = {
    
    'max_depth': np.arange(3, 14, 1), 'min_samples_split': np.arange(100, 801, 100)}
gbdt_2 = GradientBoostingClassifier(learning_rate=0.1, n_estimators=80, min_samples_leaf=20,
                                    max_features='sqrt', subsample=0.8, random_state=10)
gs = GridSearchCV(estimator=gbdt_2, param_grid=params_test, scoring='roc_auc', cv=5)
gs.fit(x_train, y_train)
print('模型最佳参数为', gs.best_params_)
print('模型最好的评分为', gs.best_score_)

チューニングの3番目のステップ:

内部ノードを細分割するために必要なサンプルの最小数min_samples_splitとリーフノードの最小数min_samples_leafは一緒に調整されます。チューニング範囲はそれぞれ400-1000と60-100です。

# 4.内部节点再划分所需最小样本数min_samples_split和叶子节点最少样本数min_samples_leaf一起调参
params_test = {
    
    'min_samples_leaf': np.arange(20, 101, 10), 'min_samples_split': np.arange(400, 1001, 100)}
gbdt_3 = GradientBoostingClassifier(learning_rate=0.1, n_estimators=80, max_depth=9,
                                    max_features='sqrt', subsample=0.8, random_state=10)
gs = GridSearchCV(estimator=gbdt_3, param_grid=params_test, scoring='roc_auc', cv=5)
gs.fit(x_train, y_train)
print('模型最佳参数为', gs.best_params_)
print('模型最好的评分为', gs.best_score_)

最終版

gbdt_4 = GradientBoostingClassifier(learning_rate=0.1, n_estimators=80, max_depth=9, min_samples_leaf=70,
                                    min_samples_split=500, max_features='sqrt', subsample=0.8, random_state=10)
gbdt_4.fit(x_train, y_train)
y_pred_4 = gbdt_4.predict(x_test)
y_pred_prob_4 = gbdt_4.predict_proba(x_test)[:, 1]
print('Accuracy : %.4g' % metrics.accuracy_score(y_test, y_pred_4))
print('AUC(Testing) : %f' % metrics.roc_auc_score(y_test, y_pred_prob_4))

# 训练集上的accuracy、auc
y_pred_1 = gbdt_4.predict(x_train)
y_pred_prob_1 = gbdt_4.predict_proba(x_train)[:, 1]
print('Accuracy : %.4g' % metrics.accuracy_score(y_train, y_pred_1))
print('AUC(Training) : %f' % metrics.roc_auc_score(y_train, y_pred_prob_1))

効果はデフォルトの効果ほど良くないことがわかります。主な理由は、0.8のサブサンプリングのみを使用し、データの20%がフィッティングに参加しなかったためです。
チューニングの4番目のステップ:
最大数の特徴max_featuresでグリッド検索を実行します

# 对max_features进行网格搜索
param_test4 = {
    
    'max_features': range(5, 31, 2)}
gbdt_4 = GradientBoostingClassifier(learning_rate=0.1, n_estimators=80, max_depth=9, min_samples_leaf=70,
                                    min_samples_split=500, subsample=0.8, random_state=10)
gs = GridSearchCV(estimator=gbdt_4, param_grid=param_test4, scoring='roc_auc', cv=5)
gs.fit(x_train, y_train)
print('模型最佳参数为', gs.best_params_)
print('模型最好的评分为', gs.best_score_)

高麗人参の5番目のステップ:

# 对subsample进行网格搜索
param_test5 = {
    
    'subsample':[0.6,0.7,0.75,0.8,0.85,0.9]}
gbdt_5 = GradientBoostingClassifier(learning_rate=0.1, n_estimators=80, max_depth=9, min_samples_leaf=70,
                                    min_samples_split=500, max_features=28, random_state=10)
gs = GridSearchCV(estimator=gbdt_5, param_grid=param_test5, scoring='roc_auc', cv=5)
gs.fit(x_train, y_train)
print('模型最佳参数为', gs.best_params_)
print('模型最好的评分为', gs.best_score_)

基本的にすべての調整結果が得られたので、ステップサイズを半分にし、最大反復回数を2倍にして、モデルの一般化能力を高めることができます。

2.変数の重要性

  ランダムフォレストと同様に、GBDTも機能の重要性を与えることができます。

clf = GradientBoostingClassifier(learning_rate=0.05, n_estimators=70,max_depth=9, min_samples_leaf =70,
               min_samples_split =1000, max_features=28, random_state=10,subsample=0.8)
clf.fit(X_train, y_train)
importances = clf.feature_importances_
# 按重要性降序对要素进行排序。 默认情况下,argsort返回升序
features_sorted = np.argsort(-importances)
import_feautres = [allFeatures[i] for i in features_sorted]

おすすめ

転載: blog.csdn.net/weixin_46649052/article/details/114399752