機械学習戦闘: GBM 勾配ブースティング マシンに基づく Python 予測 (14)

辛口な記事ですが、気に入っていただけましたらいいね・収集して更新を続けてください!

1 はじめに

1.1 GBM の概要

Gradient Boosting Machine (略してGBM ) は、アンサンブル学習の一種である強力な機械学習アルゴリズムです。GBM は、分類および回帰問題の解決に優れたパフォーマンスを発揮し、データ サイエンスの分野で一般的に使用されるアルゴリズムの 1 つです。GBM は、複数の弱学習器 (通常はデシジョン ツリー) を組み合わせて強力な予測モデルを構築します。トレーニング プロセスでは、勾配ブースティング手法を採用して、モデルの予測能力を徐々に向上させます。データ上のモデルの残留誤差を最小限に抑えるために、反復の各ラウンドで、新しい弱学習器が前のラウンドのモデルの誤差を修正するようにトレーニングされます。最後に、すべての弱学習器の結果が重み付けされて結合され、最終的な予測結果が得られます。

利点:

  • 高い予測精度: GBM は多くのデータセットで優れたパフォーマンスを発揮し、多くの場合、高い予測精度を実現します。

  • 非線形関係の処理: GBM は、複雑なデータ内の非線形関係を捉えるのに優れています。

  • 堅牢性: GBM はノイズや外れ値に対して比較的堅牢であり、複数のモデルを組み合わせることで単一モデルのオーバーフィッティングのリスクを軽減できます。

  • 特徴の重要性評価: GBM は、データ内のどの特徴が予測に最大の影響を与えるかを理解するために、各特徴の重要性評価を提供できます。

  • スケーラビリティ: GBM は大規模なデータセットに適用でき、最新のコンピューティング プラットフォームに効率的に実装できます。

短所:

  • 長いトレーニング時間: 一部の単純な線形モデルと比較して、GBM のトレーニング時間は、特に複雑なモデルや大規模なデータ セットの場合に長くなる可能性があります。

  • ハイパーパラメータの調整: GBM のパフォーマンスは一部のハイパーパラメータ (学習率、ツリーの数など) の影響を受けやすいため、慎重な調整と最適化が必要です。

  • オーバーフィットの可能性: ハイパーパラメーターが慎重に設定されていない場合、またはトレーニング セット データが小さい場合、GBM がオーバーフィットして、新しいデータのパフォーマンスが低下する可能性があります。

  • 高次元の疎データには適さない: 高次元の疎データの場合、GBM のパフォーマンスは、そのようなデータ用に特別に設計された一部のアルゴリズムほど良くない可能性があります。

1.2 GBMの適用

  1. 金融分野: 金融分野では、GBM は信用スコアリング モデルで広く使用されています。GBM は、顧客の過去の信用情報やその他の関連特性を分析することで、顧客の信用リスクを予測し、金融機関がより多くの情報に基づいた信用決定を行えるよう支援します。さらに、GBM は株価予測にも使用でき、過去の株価データと市場指標を使用して将来の株価動向を予測します。

  2. 保険業界: 保険業界では、GBM はリスク評価と保険金請求の予測に使用できます。GBM は、顧客の個人情報、保険履歴、その他のリスク要因を分析することで、顧客のリスク レベルを評価し、保険会社が適切な保険契約と価格設定を策定できるように支援します。さらに、GBM は保険金請求の確率を予測することもできるため、保険会社が保険金請求プロセスをより適切に管理できるようになります。

  3. 電子商取引: 電子商取引では、GBM はレコメンダー システムでよく使用されます。GBM は、ユーザーの購入履歴、閲覧行動、その他の行動特性を分析することで、ユーザーに合わせてパーソナライズされた製品やサービスを推奨し、ユーザーの購入コンバージョン率と満足度を向上させることができます。さらに、GBM は広告のクリックスルー率を予測することもでき、広告主が広告戦略を最適化するのに役立ちます。

  4. 医学および生物科学: 医療分野では、GBM は病気の予測と診断の支援に適用できます。GBM は、患者の臨床データ、医療画像、遺伝情報を分析することで、患者が特定の病気に罹患しているかどうかを予測し、診断に役立つ情報を提供します。さらに、GBM は創薬にも使用でき、薬物分子と生物活性データを分析することで潜在的な新薬候補を予測できます。

  5. ソーシャル ネットワーク: ソーシャル ネットワークでは、GBM はユーザーの行動モデリングと社会関係分析に使用できます。GBM は、ソーシャル ネットワークでのユーザーのインタラクティブな行動とコンテンツ共有を分析することで、ユーザーの興味や行動を予測し、ソーシャル ネットワーキング プラットフォームに対して、よりパーソナライズされたサービスと推奨事項を提供できます。

  6. 自然言語処理: 自然言語処理の分野では、GBM は感情分析とテキスト分類に使用できます。GBM は、テキスト内の感情的および意味論的な情報を分析することで、テキストの感情的傾向を判断したり、テキストをニュース分類、スパム識別などのさまざまなカテゴリに分類したりできます。

  7. 産業および製造: 産業分野では、GBM は機器の故障予測と品質管理に適用できます。GBMはセンサーデータや装置のプロセスパラメータを分析することで、装置の故障を予測し、事前に修復措置を講じることができます。さらに、GBM は品質管理にも使用でき、生産プロセスにおける欠陥や欠陥製品の検出に役立ちます。

  8. エネルギーと環境: エネルギーと環境の分野では、GBM はエネルギー消費予測と気候モデル予測に適用できます。GBM は過去のデータを分析し、エネルギー消費に影響を与える要因を分析することで、将来のエネルギー需要を予測し、エネルギー計画と管理を支援します。さらに、GBM は気候モデルの予測にも使用され、気象の変化や自然災害のリスクを予測するのに役立ちます。

  9. 運輸および物流: 運輸および物流業界では、GBM を交通流の予測や道路状況の評価に使用できます。GBM は過去の交通データと道路状況を分析することで、将来の交通の流れと道路状況を予測し、交通管理部門が交通スケジュールと計画を最適化するのに役立ちます。

2. scikit-learn の実践的なデモンストレーション

GradientBoostingRegressorおよび は、GradientBoostingClassifierPython のscikit -learnライブラリGradient Boosting Machine (GBM) の 2 つの主要なクラスです。

GradientBoostingRegressorscikit-learn の回帰問題用の勾配ブースティング マシン クラスです。連続ターゲット変数の予測問題を解決するために使用されます。一連の回帰ツリー (決定ツリーは回帰タスクに使用されます) を当てはめることにより、GBM はデータ内の非線形関係をモデル化し、連続的な予測結果を生成できます。たとえば、GradientBoostingRegressor を使用して、住宅価格や販売量などの連続ターゲット変数を予測できます。

GradientBoostingClassifierscikit-learn の分類問題用の勾配ブースティング マシン クラスです。これは、離散ターゲット変数の予測問題を解決し、サンプルをさまざまなカテゴリに分割するために使用されます。トレーニング中、GBM はカテゴリを予測するための弱学習器としてデシジョン ツリーを使用します。たとえば、GradientBoostingClassifier は、スパムの識別や腫瘍の種類の分類などの分類タスクに使用できます。

2.1 分類問題

データセットを作成して、1000 個のサンプルと 20 個の特徴を含む合成分類データセットを生成します。このうち、15 個の機能は情報機能、5 個の機能は冗長機能です。

from sklearn.datasets import make_classification
X, y = make_classification(n_samples=1000, n_features=20, n_informative=15, n_redundant=5, random_state=7)
print(X.shape, y.shape)

# (1000, 20) (1000,)

モデルを構築し、10 倍のクロスを 3 回繰り返します

import numpy as np
from sklearn.datasets import make_classification
from sklearn.model_selection import cross_val_score, RepeatedStratifiedKFold
from sklearn.ensemble import GradientBoostingClassifier

X, y = make_classification(n_samples=1000, n_features=20, n_informative=15, n_redundant=5, random_state=7)
model = GradientBoostingClassifier()
cv = RepeatedStratifiedKFold(n_splits=10, n_repeats=3, random_state=1)
n_scores = cross_val_score(model, X, y, scoring='accuracy', cv=cv, n_jobs=-1)
print('Mean Accuracy: %.3f (%.3f)' % (np.mean(n_scores), np.std(n_scores)))

# Mean Accuracy: 0.899 (0.030)

バイナリデータ予測

from sklearn.datasets import make_classification
from sklearn.ensemble import GradientBoostingClassifier

X, y = make_classification(n_samples=1000, n_features=20, n_informative=15, n_redundant=5, random_state=7)
model = GradientBoostingClassifier()
model.fit(X, y)
row = [0.2929949, -4.21223056, -1.288332, -2.17849815, -0.64527665, 2.58097719, 0.28422388, -7.1827928, -1.91211104, 2.73729512, 0.81395695, 3.96973717, -2.66939799, 3.34692332, 4.19791821, 0.99990998, -0.30201875, -4.43170633, -2.82646737, 0.44916808]
yhat = model.predict([row])

print('Predicted Class: %d' % yhat[0])

# Predicted Class: 1

2.2 回帰問題

データセットを作成する

from sklearn.datasets import make_regression
X, y = make_regression(n_samples=1000, n_features=20, n_informative=15, noise=0.1, random_state=7)
print(X.shape, y.shape)

# (1000, 20) (1000,)

モデルを構築し、10 倍のクロスを 3 回繰り返します

from numpy import mean, std
from sklearn.datasets import make_regression
from sklearn.model_selection import cross_val_score, RepeatedKFold
from sklearn.ensemble import GradientBoostingRegressor

X, y = make_regression(n_samples=1000, n_features=20, n_informative=15, noise=0.1, random_state=7)
model = GradientBoostingRegressor()
cv = RepeatedKFold(n_splits=10, n_repeats=3, random_state=1)
n_scores = cross_val_score(model, X, y, scoring='neg_mean_absolute_error', cv=cv, n_jobs=-1)
print('MAE: %.3f (%.3f)' % (mean(n_scores), std(n_scores)))

# MAE: -62.440 (3.259)

モデル予測

from sklearn.datasets import make_regression
from sklearn.ensemble import GradientBoostingRegressor

X, y = make_regression(n_samples=1000, n_features=20, n_informative=15, noise=0.1, random_state=7)
model = GradientBoostingRegressor()
model.fit(X, y)
row = [0.20543991, -0.97049844, -0.81403429, -0.23842689, -0.60704084, -0.48541492, 0.53113006, 2.01834338, -0.90745243, -1.85859731, -1.02334791, -0.6877744, 0.60984819, -0.70630121, -1.29161497, 1.32385441, 1.42150747, 1.26567231, 2.56569098, -0.11154792]
yhat = model.predict([row])
print('Prediction: %d' % yhat[0])

# Prediction: 37

3. GBM ハイパーパラメータ

勾配ブースティングは、複数の弱学習器 (通常はデシジョン ツリー) を組み合わせて強力な予測モデルを構築することです勾配ブースティング アルゴリズムには、モデルとトレーニング プロセスのパフォーマンスに影響を与えるために設定する必要がある重要なハイパーパラメーターがいくつかあります。以下に、勾配ブースティング アルゴリズムの重要なハイパーパラメーターをいくつか示します。ここでは、最も一般的に使用される 5 つのみを示します。

ハイパーパラメータ 説明する
n_estimators アンサンブル内の弱学習器 (通常は決定木) の数。学習者が多いと過剰適合が発生する可能性があり、学習者が少ないと過適合が発生する可能性があります。
学習率 モデルに対する各弱学習器の寄与を制御します。学習率が小さいほど、各学習器の重み調整が小さくなり、モデルの堅牢性の向上に役立ちますが、より多くの反復が必要になる場合があります。学習率が大きいと、過剰学習が発生する可能性があります。
最大深さ デシジョン ツリーの最大の深さ。弱学習器 (デシジョン ツリー) の複雑さを制御するために使用されます。最大深度が大きいほど、決定木の分岐が多くなり、オーバーフィッティングが発生する可能性があります。最大深さを小さくすると、過剰適合を防ぐことができます。
min_samples_split デシジョン ツリー ノードの分割に必要なサンプルの最小数。この値を増やすと、モデルの複雑さが軽減され、過剰適合の可能性が減ります。
min_samples_leaf リーフ ノードに必要なサンプルの最小数。この値を増やすと、モデルの複雑さが軽減され、過剰適合の可能性が減ります。
サブサンプル 各弱学習者がトレーニング中に使用するサンプルの割合を制御します。値が 1.0 未満の場合、一部のサンプルがトレーニングに使用されていることを意味し、分散が減少し、モデルの汎化能力が向上します。
max_features 分割時に各デシジョン ツリー ノードが考慮する特徴の数を決定します。

これらのハイパーパラメータは勾配ブースティング マシンにおいて非常に重要であり、モデルの複雑さ、フィッティング パフォーマンス、汎化能力に影響を与えます。パラメーターを調整するときは、最適なモデルのパフォーマンスを得るために、特定のデータセットや問題に応じて適切なハイパーパラメーター値を選択する必要があります。

### 总模版,后续
from numpy import mean, std, arange
from sklearn.datasets import make_classification
from sklearn.model_selection import cross_val_score, RepeatedStratifiedKFold
from sklearn.ensemble import GradientBoostingClassifier
from matplotlib import pyplot

# 获取数据集
def get_dataset():
    X, y = make_classification(n_samples=1000, n_features=20, n_informative=15, n_redundant=5, random_state=7)
    return X, y

# 获取待评估的模型列表
# ——————————————————
# 替换内容,直接复制每小段超参数建模示例进来运行即可
# ——————————————————

# 使用交叉验证评估给定模型
def evaluate_model(model, X, y):
    # 定义评估过程
    cv = RepeatedStratifiedKFold(n_splits=10, n_repeats=3, random_state=1)
    # 评估模型并收集结果
    scores = cross_val_score(model, X, y, scoring='accuracy', cv=cv, n_jobs=-1)
    return scores

# 获取数据集
X, y = get_dataset()
# 获取待评估的模型列表
models = get_models()
# 评估模型并存储结果
results, names = list(), list()
for name, model in models.items():
    # 评估模型
    scores = evaluate_model(model, X, y)
    # 存储结果
    results.append(scores)
    names.append(name)
    # 输出性能评估结果
    print('>%s %.3f (%.3f)' % (name, mean(scores), std(scores)))

# 绘制模型性能箱线图进行对比
pyplot.boxplot(results, labels=names, showmeans=True)
pyplot.xlabel('Sample Ratio')
pyplot.ylabel('Accuracy')
pyplot.title('Gradient Boosting Performance Comparison')
pyplot.show()

3.1 決定木の数 (n_estimators)

構築する弱学習器の数 (反復数とも呼ばれます) を指定します。反復が増えるとモデルは複雑になりますが、過剰適合につながる可能性があります。このパラメータのデフォルト値は 100 ですが、ここでは 10 から 5,000 への変更を示します。

# 获取待评估的模型列表
def get_models():
    models = dict()
    # 定义不同树数量
    n_trees = [10, 50, 100, 500, 1000, 5000]
    for n in n_trees:
        models[str(n)] = GradientBoostingClassifier(n_estimators=n)
    return models

3.2 サンプルサイズ(サブサンプル)

トレーニング中に各弱学習器によって使用されるサンプルの割合を制御します。値が 1.0 未満の場合、一部のサンプルがトレーニングに使用されていることを意味し、分散が減少し、モデルの汎化能力が向上します。

# 获取待评估的模型列表
def get_models():
    models = dict()
    # 探索不同的样本比例,从10%到100%,步长为10%
    for i in arange(0.1, 1.1, 0.1):
        key = '%.1f' % i
        models[key] = GradientBoostingClassifier(subsample=i)
    return models

3.3 特徴の数 (max_features)

分割時に各デシジョン ツリー ノードが考慮する特徴の数を決定します。モデルの確率性に影響を与える可能性があり、値が小さいほどモデルの多様性が向上し、値が大きいほどフィッティングのパフォーマンスが向上する可能性があります。

# 获取要评估的模型列表
def get_models():
    models = dict()
    # 探索特征数量从1到20
    for i in range(1, 21):
        models[str(i)] = GradientBoostingClassifier(max_features=i)
    return models

3.4 学習率 (learning_rate)

モデルに対する各弱学習器の寄与度。学習率とも呼ばれます。学習率が小さいほど、各学習器の重み調整が小さくなり、モデルの堅牢性の向上に役立ちますが、より多くの反復が必要になる場合があります。

# 获取要评估的模型列表
def get_models():
    models = dict()
    # 定义要探索的学习率
    learning_rates = [0.0001, 0.001, 0.01, 0.1, 1.0]
    for rate in learning_rates:
        key = '%.4f' % rate
        models[key] = GradientBoostingClassifier(learning_rate=rate)
    return models

3.5 決定木の深さ (max_ Depth)

弱学習器 (決定木) の複雑さを制御するために使用される決定木の最大の深さ。デフォルトは 3 です。最大深度が大きいほど、決定木の分岐が多くなり、オーバーフィッティングが発生する可能性があります。最大深さを小さくすると、過剰適合を防ぐことができます。

# 获取要评估的模型列表
def get_models():
    models = dict()
    # 定义要探索的树深度范围
    for depth in range(1, 11):
        models[str(depth)] = GradientBoostingClassifier(max_depth=depth)
    return models

4。討議

ここではn_estimatorssubsamplelearning_ratemax_depthと4つのパラメータを組み合わせてヒートマップを作成しており、どの指標が結果に大きな影響を与えているかを大まかに把握することも可能です。

勾配ブースティングは、分類または回帰予測モデリング問題に使用できるアンサンブル機械学習アルゴリズムのクラスを指します。アンサンブルはデシジョン ツリー モデルから構築されます。ツリーは一度に 1 つずつアンサンブルに追加され、以前のモデルによって生じた予測エラーを修正するために適合されます。boostingこれは、 と呼ばれるアンサンブル機械学習モデルです。任意の微分可能損失関数と勾配降下最適化アルゴリズムを使用してモデルを近似します。これにより、ニューラル ネットワークと同様に、モデルがフィッティングされるにつれて損失勾配が最小化されるため、この手法は「勾配ブースティング」として知られています。

おすすめ

転載: blog.csdn.net/weixin_48093827/article/details/131923143