技術共有

Python28-11 CatBoost 勾配ブースティング アルゴリズム

2024-07-12

한어Русский языкEnglishFrançaisIndonesianSanskrit日本語DeutschPortuguêsΕλληνικάespañolItalianoSuomalainenLatina

写真

CatBoost (Categorical Boosting) は、Yandex (検索エンジンがかつてロシア市場の 60% 以上を占め、他のインターネット製品やサービスも提供しているロシアのインターネット企業) によって開発された、勾配ブースティングに基づく機械学習アルゴリズムです。 CatBoost はカテゴリ特徴の処理に特に優れており、過剰適合やデータ漏洩の問題を効果的に回避できます。 CatBoost の正式名は「Categorical Boosting」で、多数のカテゴリ特徴を含むデータを処理するときにパフォーマンスが向上するように設計されています。

CatBoostの機能

  1. カテゴリ特徴の処理: CatBoost は、追加のエンコード (ワンホット エンコードなど) を行わずに、カテゴリ特徴を直接処理できます。

  2. 過学習を避ける: CatBoost は、カテゴリ特徴を処理する新しい方法を採用しており、過剰適合を効果的に削減します。

  3. 効率: CatBoost は、トレーニング速度と予測速度の両方で優れたパフォーマンスを発揮します。

  4. CPUとGPUのトレーニングをサポート: CatBoost は CPU 上で実行することも、GPU を使用してトレーニングを加速することもできます。

  5. 欠損値を自動的に処理する: CatBoost は、追加の前処理手順を行わずに欠損値を自動的に処理できます。

CatBoost の中心原則

CatBoost の中心原理は、勾配ブースティング決定木 (GBDT) に基づいていますが、カテゴリ特徴の処理と過学習の回避という点で革新的です。重要な技術的なポイントをいくつか示します。

  1. カテゴリ特徴処理

    • CatBoost では、カテゴリの平均に基づいて新しい特徴を計算する「平均エンコーディング」と呼ばれる方法が導入されています。

    • 「ターゲットエンコード」と呼ばれる手法を利用し、カテゴリ特徴を数値特徴に変換する際にターゲット値の平均を使用することでデータ漏洩のリスクを軽減します。

    • トレーニング プロセス中、ターゲット変数が直接エンコードされることを避けるために、データは統計情報を使用して処理されます。

  2. 順序付けされたブースティング

    • データの漏洩と過剰適合を防ぐために、CatBoost はトレーニング中にデータを秩序だった方法で処理します。

    • 順序付きブースティングは、トレーニング中にデータをランダムにシャッフルすることで機能し、モデルが特定の時点の過去のデータのみを参照し、意思決定に将来の情報を使用しないようにします。

  3. 計算の最適化

    • CatBoost は、事前計算とキャッシュを通じて特徴計算プロセスを高速化します。

    • CPU および GPU トレーニングをサポートし、大規模なデータ セットで適切なパフォーマンスを発揮します。

CatBoostの基本的な使い方

以下は、分類タスクに CatBoost を使用する基本的な例です。Auto MPG (Miles Per Gallon) データ セットを使用します。これは、機械学習と統計分析で一般的に使用される古典的な回帰問題データ セットです。このデータセットは、さまざまな車種の燃料効率 (つまり、ガロンあたりのマイル数) およびその他のいくつかの関連特性を記録します。

データセットの特徴:

  • mpg: ガロンあたりのマイル数 (ターゲット変数)。

  • シリンダー:気筒数。エンジンの気筒数を表します。

  • 変位: エンジン排気量 (立方インチ)。

  • 馬力:エンジン出力(馬力)。

  • 重さ: 車両重量 (ポンド単位)。

  • 加速度: 0 から 60 mph (秒) までの加速時間。

  • モデル年:車両の製造年。

  • 起源: 車両の原産地 (1=米国、2=ヨーロッパ、3=日本)。

データセットの最初の数行:

  1.     mpg  cylinders  displacement  horsepower  weight  acceleration  model_year  origin
  2. 0  18.0          8         307.0       130.0  3504.0          12.0          70       1
  3. 1  15.0          8         350.0       165.0  3693.0          11.5          70       1
  4. 2  18.0          8         318.0       150.0  3436.0          11.0          70       1
  5. 3  16.0          8         304.0       150.0  3433.0          12.0          70       1
  6. 4  17.0          8         302.0       140.0  3449.0          10.5          70       1

コード例:

  1. import pandas as pd  # 导入Pandas库,用于数据处理
  2. import numpy as np  # 导入Numpy库,用于数值计算
  3. from sklearn.model_selection import train_test_split  # 从sklearn库导入train_test_split,用于划分数据集
  4. from sklearn.metrics import mean_squared_error, mean_absolute_error  # 导入均方误差和平均绝对误差,用于评估模型性能
  5. from catboost import CatBoostRegressor  # 导入CatBoost库中的CatBoostRegressor,用于回归任务
  6. import matplotlib.pyplot as plt  # 导入Matplotlib库,用于绘图
  7. import seaborn as sns  # 导入Seaborn库,用于绘制统计图
  8. # 设置随机种子以便结果复现
  9. np.random.seed(42)
  10. # 从UCI机器学习库加载Auto MPG数据集
  11. url = "http://archive.ics.uci.edu/ml/machine-learning-databases/auto-mpg/auto-mpg.data"
  12. column_names = ['mpg''cylinders''displacement''horsepower''weight''acceleration''model_year''origin']
  13. data = pd.read_csv(url, names=column_names, na_values='?', comment='t', sep=' ', skipinitialspace=True)
  14. # 查看数据集的前几行
  15. print(data.head())
  16. # 处理缺失值
  17. data = data.dropna()
  18. # 特征和目标变量
  19. = data.drop('mpg', axis=1)  # 特征变量
  20. = data['mpg']  # 目标变量
  21. # 将类别特征转换为字符串类型(CatBoost可以直接处理类别特征)
  22. X['cylinders'= X['cylinders'].astype(str)
  23. X['model_year'= X['model_year'].astype(str)
  24. X['origin'= X['origin'].astype(str)
  25. # 将数据集划分为训练集和测试集
  26. X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2random_state=42)
  27. # 定义CatBoost回归器
  28. model = CatBoostRegressor(
  29.     iterations=1000,  # 迭代次数
  30.     learning_rate=0.1,  # 学习率
  31.     depth=6,  # 决策树深度
  32.     loss_function='RMSE',  # 损失函数
  33.     verbose=100  # 输出训练过程信息
  34. )
  35. # 训练模型
  36. model.fit(X_train, y_train, eval_set=(X_test, y_test), early_stopping_rounds=50)
  37. # 进行预测
  38. y_pred = model.predict(X_test)
  39. # 评估模型性能
  40. mse = mean_squared_error(y_test, y_pred)  # 计算均方误差
  41. mae = mean_absolute_error(y_test, y_pred)  # 计算平均绝对误差
  42. # 打印模型的评估结果
  43. print(f'Mean Squared Error (MSE): {mse:.4f}')
  44. print(f'Mean Absolute Error (MAE): {mae:.4f}')
  45. # 绘制真实值与预测值的对比图
  46. plt.figure(figsize=(106))
  47. plt.scatter(y_test, y_pred, alpha=0.5)  # 绘制散点图
  48. plt.plot([y_test.min(), y_test.max()], [y_test.min(), y_test.max()], '--k')  # 绘制对角线
  49. plt.xlabel('True Values')  # X轴标签
  50. plt.ylabel('Predictions')  # Y轴标签
  51. plt.title('True Values vs Predictions')  # 图标题
  52. plt.show()
  53. # 特征重要性可视化
  54. feature_importances = model.get_feature_importance()  # 获取特征重要性
  55. feature_names = X.columns  # 获取特征名称
  56. plt.figure(figsize=(106))
  57. sns.barplot(x=feature_importances, y=feature_names)  # 绘制特征重要性条形图
  58. plt.title('Feature Importances')  # 图标题
  59. plt.show()
  60. # 输出
  61. '''
  62. mpg  cylinders  displacement  horsepower  weight  acceleration  
  63. 0  18.0          8         307.0       130.0  3504.0          12.0   
  64. 1  15.0          8         350.0       165.0  3693.0          11.5   
  65. 2  18.0          8         318.0       150.0  3436.0          11.0   
  66. 3  16.0          8         304.0       150.0  3433.0          12.0   
  67. 4  17.0          8         302.0       140.0  3449.0          10.5   
  68.    model_year  origin  
  69. 0          70       1  
  70. 1          70       1  
  71. 2          70       1  
  72. 3          70       1  
  73. 4          70       1  
  74. 0: learn: 7.3598113 test: 6.6405869 best: 6.6405869 (0) total: 1.7ms remaining: 1.69s
  75. 100: learn: 1.5990203 test: 2.3207830 best: 2.3207666 (94) total: 132ms remaining: 1.17s
  76. 200: learn: 1.0613606 test: 2.2319632 best: 2.2284239 (183) total: 272ms remaining: 1.08s
  77. Stopped by overfitting detector  (50 iterations wait)
  78. bestTest = 2.21453232
  79. bestIteration = 238
  80. Shrink model to first 239 iterations.
  81. Mean Squared Error (MSE): 4.9042
  82. Mean Absolute Error (MAE): 1.6381
  83. <Figure size 1000x600 with 1 Axes>
  84. <Figure size 1000x600 with 1 Axes>
  85. '''

平均二乗誤差 (MSE) : 平均二乗誤差。予測値と実際の値の間の平均二乗差を表します。値が小さいほどモデルのパフォーマンスが向上します。ここでは MSE の値は 4.9042 です。

平均絶対誤差 (MAE) : 平均絶対誤差。予測値と実際の値の間の平均絶対差を表します。値が小さいほどモデルのパフォーマンスが向上します。ここでの MAE の値は 1.6381 です。

写真

  1. 散布図 : 図内の各点はテストサンプルを表します。横軸はサンプルの真の値 (MPG) を表し、縦軸はモデルの予測値 (MPG) を表します。

  2. 対角線: 図中の黒い点線は 45 度の対角線であり、理想的な条件、つまり予測値が真の値に等しい場合の予測結果を表しています。

  3. ポイントの配分:

    • 斜めに近い: モデルの予測値が真の値に非常に近く、予測が正確であることを示します。

    • 斜めから離れてください:予測値と実際の値との乖離が大きく、予測が不正確であることを示します。

図の点から、ほとんどの点が対角線付近に集中していることがわかります。これは、モデルの予測性能が優れていることを示していますが、対角線から遠く離れた点もいくつかあることを示しています。これらのサンプルの予測値と真の値の間の一定のギャップ。

写真

  1. 棒グラフ : 各バーは、モデル内のフィーチャーの重要性を表します。バーが長いほど、モデル予測に対する特徴の寄与が大きくなります。

  2. 機能名: Y 軸上のすべてのフィーチャの名前をリストします。

  3. 特徴の重要度の値: 各フィーチャの相対重要度の値を X 軸に表示します。

写真からわかるように:

  1. モデル年: すべての特徴の中で最も重要で、車の製造年が予測燃費に大きな影響を与えることを示します。

  2. 重さ: 車の重量は 2 番目に重要な特性であり、燃費にも大きな影響を与えます。

  3. 変位そして馬力:エンジンの排気量やパワーも燃費に大きく貢献します。

この例では、CatBoost を使用して Auto MPG データセットを処理します。その主な目的は、車の燃料効率 (つまり、ガロンあたりのマイル数、MPG) を予測する回帰モデルを構築することです。

上記の内容はインターネットからまとめたものです。お役に立ちましたら、また次回お楽しみください。