機械学習のアルゴリズムにはさまざまな選択肢がありますが、「高い予測精度を維持しながら、計算コストを抑え、大規模データやカテゴリデータにも対応したい!」そんな場面で頼れるのが CatBoost です。
CatBoostは、勾配ブースティング決定木(Gradient Boosting Decision Trees, GBDT) をベースとしたアルゴリズムであり、特にカテゴリ変数の処理を効率化する点が特徴です。一般的なGBDTモデルとは異なり、カテゴリ特徴量を事前にエンコードすることなく直接学習できる ため、データ前処理の手間を軽減しながら、高精度な予測を実現します。
さらに、CatBoostは過学習を抑制するための正則化 や、順序ベースのブースティング(Ordered Boosting) による学習の安定性向上、大規模データに対応するための最適化が施されています。
本記事では、CatBoostを活用して分類問題と回帰問題を解く方法 を、サンプルコード付きで分かりやすく解説します。
Pythonでの実装方法はもちろん、ランダムフォレストや他のGBDT実装(XGBoost、LightGBM など)との違い、メリット・デメリット、パラメータチューニングのポイントまで幅広く網羅していますので、CatBoostを使ってモデルを改善したい方は、ぜひご一読ください!
CATBoostとは
CatBoost(Categorical Boosting) は、勾配ブースティング決定木(Gradient Boosting Decision Tree, GBDT)を基盤としたライブラリであり、高速かつ高精度なモデルの構築が可能 な点が特徴です。
CatBoostはGBDTのアンサンブル学習を活用し、回帰や分類など幅広い問題に対応可能 です。複数の決定木を直列につなげて学習を進めることで、誤差を段階的に修正しながら精度の高い予測モデルを構築します。さらに、CatBoost独自の順序ベースのブースティング(Ordered Boosting) を採用することで、学習の安定性を向上させています。
また、CatBoostの大きな特徴として、カテゴリ変数を事前エンコードせずに直接学習できる 点が挙げられます。これにより、データ前処理の手間を削減しつつ、高精度な予測が可能になります。
さらに、ノイズに強く、非線形な関係も学習可能 であるため、大規模データの分析やKaggleコンペ、実務のデータサイエンスにおいても広く活用されています。
このような特性を活かし、CatBoostはカテゴリデータを多く含む問題や、高速でスケーラブルなモデルが求められる場面 で特に効果を発揮します。
CatBoostの仕組み

CatBoostの構築プロセスも、基本的にGBDTと同様のブースティングの考え方に基づいていますが、カテゴリ変数の処理 や 学習の安定性向上 のための独自の工夫が施されています。
LightGBMの学習ステップ
- 残差の計算:
初期モデルを作成し、各データに対して予測誤差(残差)を計算します。 - 弱学習器(決定木)の学習:
残差を予測する小さな決定木を作成し、モデルに追加します。CatBoostでは、順序ベースのブースティング(Ordered Boosting) を採用し、学習データの順序を利用することで過学習を抑え、より安定した学習を実現しています。 - モデルの更新:
新しい木の予測を加えることで全体のモデルが改善され、この処理を繰り返すことで誤差を少しずつ減らしていきます。さらに、CatBoostはカテゴリ変数を事前エンコードせずに直接処理できる ため、データ前処理の負担を軽減しながら高精度な予測を行えます。
このように、CatBoostはGBDTの原理を活かしながら、カテゴリ変数の処理を最適化し、高精度な予測と安定した学習を両立 できるように設計されています。
決定木・ランダムフォレストとの違い
特徴 | 決定木 | ランダムフォレスト | CatBoost(GBDT) |
---|---|---|---|
構造 | 1本の木 | 複数の木(並列) | 複数の木(直列) |
過学習のしやすさ | 高い | 低い | 低い(順序ブースティングによる抑制) |
学習速度 | 速い | 遅い | 高速(カテゴリ変数処理最適化) |
精度 | 単純なデータで高い | 複雑なデータで高い | 非常に高い(順序ベースのブースティング) |
特徴量選択 | 全特徴量 | ランダムに一部選択 | 全特徴量(重要度に基づく分割) |
スケーラビリティ | 低い | 高い | 非常に高い(大規模データ・カテゴリ変数に強い) |
CatBoostのメリット・デメリット
メリット
- 高精度な予測: 多くのケースで最も精度の高いアルゴリズムの一つ
- 非線形な関係にも対応: 複雑な特徴間の関係を捉えることが可能
- 特徴量の重要度を可視化: どの特徴がどれだけモデルに貢献しているかを分析できる
- カテゴリ変数を直接処理可能: 事前のエンコードなしで学習でき、データ前処理の負担を軽減
- 高速な学習: 順序ベースのブースティングにより計算速度を向上
- 柔軟なカスタマイズ性: 損失関数、木の深さ、学習率などを細かく調整可能
デメリット
- 学習コストが高い: 木を1本ずつ順番に構築するため時間がかかる
- ハイパーパラメータ調整が重要: 学習率や木の深さなどを適切に調整しないと過学習のリスクあり
- ノイズに過敏: 特に小規模データセットでは過学習しやすい
- リアルタイム用途にはやや不向き: 推論速度はランダムフォレストより遅め
CatBoostに適したデータ
向いているデータ
- 特徴量が多く、複雑なパターンを持つデータ
- 高精度な予測が求められる業務(金融、医療、製造業など)
- カテゴリ変数を多く含む構造化データ(数値、カテゴリデータなど)
- 回帰・分類どちらにも対応したいタスク
向いていないデータ
- リアルタイム予測が必要なシステム(学習・推論速度がネック)
- 非常に高次元・スパースなデータ(例:生のテキスト)
- ノイズの多いデータ(過学習しやすいため注意が必要)
製造業におけるCatBoostの活用例
製造業において、CatBoostは次の用途で使われています。
用途 | 概要 | タイプ | 具体例 |
---|---|---|---|
異常検知 | センサーデータから異常パターンを検出し、予防保全や品質向上に貢献 | 分類 | 振動・温度・電流などの変動パターンから異常兆候を自動検出 |
故障予測 | 機械の状態を学習し、故障の予兆を捉える | 分類 | 異常振動の継続時間や加速度傾向をもとにベアリングの故障を予測 |
品質予測 | 製造条件と品質データを関連づけ、不良品の発生を抑制 | 回帰 | 温度・圧力・回転数から製品の寸法ばらつきを予測 |
需要予測 | 時系列データに基づき、将来の需要や在庫変動を予測 | 回帰 | 生産計画や仕入れ戦略の最適化 |
故障分類 | 故障発生時、その原因(電気系/機械系など)を分類 | 分類 | ログデータやセンサー値から適切な対応部門を特定 |
生産量最適化 | プロセス条件を調整し、最大効率の生産体制を実現 | 回帰 | 材料投入量・加工時間・気温などから最適な生産条件を推定 |
エネルギー消費予測 | 設備や工場全体の電力使用量を予測し、省エネ施策やコスト削減に貢献 | 回帰 | 月別・時間帯別の使用傾向からピーク電力を予測し契約電力を最適化 |
CatBoostによる分類問題の解き方
1. 事前準備(ライブラリ導入とデータ準備)
まず、以下のライブラリをインストールしてください。
pip install matplotlib
pip install pandas
pip install scikit-learn
pip install catboost
次に、CatBoostの分類モデルを試すためのダミーデータを作成します。今回は、7つの特徴量から4クラスを分類するデータを使用します。製造業での応用としては、センサーによる異常検知や製品の不良予測などに置き換えることができます。
from sklearn.datasets import make_classification
import pandas as pd
# ダミーデータ作成
X, y = make_classification(
n_samples=1000,
n_features=7,
n_informative=5,
n_redundant=2,
n_classes=4,
n_clusters_per_class=1,
flip_y=0.05,
random_state=42
)
# データフレーム化
df = pd.DataFrame(X, columns=[f"特徴量_{i+1}" for i in range(7)])
df['正解データ'] = y
# ファイルに保存(任意)
df.to_csv("classification_data.csv", index=False)
特徴量_1~7 は一見無秩序に見えるかもしれませんが、CatBoostを用いることで目的変数(分類先)を高精度に予測できます。

CatBoostを用いた分類モデルの学習と評価(サンプルコードと解説)
以下は、CatBoostを用いて分類モデルの学習と評価を行うサンプルコードです。
このまま実行すると学習が始まり、精度評価指標(混同行列、accuracyなど)が出力されます。
学習と評価の部分は、train_catboost_classifier
という名前で関数化していますので、コピペでお使いいただけます。
import pandas as pd
import catboost as cb
from sklearn.model_selection import train_test_split
from sklearn.metrics import accuracy_score, classification_report, confusion_matrix
def train_catboost_classifier(df, target, columns, params=None, test_size=0.2, random_state=42):
"""
CatBoostを用いた分類モデルを構築し、レポートを出力する関数。
引数:
df : pandas.DataFrame
データを含むデータフレーム。
target : str
予測対象となるターゲット列名。
columns : list of str
使用する特徴量の列名のリスト。
params : dict, optional (default=None)
CatBoostのハイパーパラメータ。
test_size : float, optional (default=0.2)
テストデータの割合。
random_state : int, optional (default=42)
乱数シード。
戻り値:
model : CatBoostClassifier
訓練されたCatBoostモデルのオブジェクト。
cm : numpy.ndarray
混同行列を表す2次元配列。
"""
if params is None:
params = {
'loss_function': 'MultiClass',
'iterations': 500,
'learning_rate': 0.1,
'depth': 6,
'random_seed': random_state,
'verbose': False
}
columns = [col for col in columns if col != target]
X = df[columns]
y = df[target]
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=test_size, random_state=random_state)
model = cb.CatBoostClassifier(**params)
model.fit(X_train, y_train, verbose=False)
y_pred = model.predict(X_test)
accuracy = accuracy_score(y_test, y_pred)
report = classification_report(y_test, y_pred, target_names=[str(i) for i in range(len(df[target].unique()))])
cm = confusion_matrix(y_test, y_pred)
print(f'正解率: {accuracy:.4f}')
print('混同行列:')
print(cm)
print('分類レポート:')
print(report)
return model, cm
if __name__ == "__main__":
df = pd.read_csv('classification_data.csv')
model, cm = train_catboost_classifier(df, target='正解データ', columns=df.columns)
正解率: 0.9350
混同行列:
[[45 1 1 4]
[ 0 46 0 0]
[ 2 0 49 2]
[ 0 2 1 47]]
分類レポート:
precision recall f1-score support
0 0.96 0.88 0.92 51
1 0.94 1.00 0.97 46
2 0.96 0.92 0.94 53
3 0.89 0.94 0.91 50
accuracy 0.94 200
macro avg 0.94 0.94 0.94 200
weighted avg 0.94 0.94 0.93 200
ハイパーパラメータを指定する場合は、params
に辞書形式で指定します。必要に応じて適宜値を書き換え、実行してください。
# 関数の呼び出し(ハイパーパラメータを指定)
train_catboost_classifier(df, target='正解データ', columns=df.columns, params={'iterations': 100})
分類結果(混同行列)の視覚化

混同行列を可視化すると、結果が直感的に分かり易くなります。下記がそのサンプルです。 plot_confusion_matrix
という関数名にしていますので、コピペで利用可能です。
#---------------------------------------------------------------
# この部分に、前述した train_catboost_classifier関数 を張り付けて下さい
#---------------------------------------------------------------
import matplotlib.pyplot as plt
import seaborn as sns
from matplotlib import rcParams
import pandas as pd
import catboost as cb
from sklearn.model_selection import train_test_split
from sklearn.metrics import accuracy_score, classification_report, confusion_matrix
rcParams['font.family'] = 'Meiryo'
def plot_confusion_matrix(cm, class_names=[]):
"""
混同行列をプロットする関数。
引数:
cm : numpy.ndarray
混同行列を表す2次元配列。
class_names : list of str, optional
クラス名のリスト。省略すると連番が表示される
"""
plt.figure(figsize=(10, 7))
sns.heatmap(cm, annot=True, fmt='d', cmap='Blues', xticklabels=class_names, yticklabels=class_names)
plt.xlabel('予測ラベル')
plt.ylabel('実際のラベル')
plt.title('混同行列')
plt.show()
if __name__ == "__main__":
# データを読み込む
df = pd.read_csv('classification_data.csv')
# CatBoost分類器の学習(ハイパーパラメータはデフォルト値を使用)
model, cm = train_catboost_classifier(df, target='正解データ', columns=df.columns)
# クラス名を設定して混同行列をプロット
class_names = df['正解データ'].unique().astype(str)
plot_confusion_matrix(cm, class_names=class_names)
分類結果の評価
今回のテストデータに対してCatBoostで分類した結果を整理し、評価してみました。
正解率
正解率(Accuracy) | 0.93 |
---|
モデルの全体的な精度は非常に高いと言えます。
混同行列
正解の分類クラス | クラス 0の予測件数 | クラス 1の予測件数 | クラス 2の予測件数 | クラス 3の予測件数 |
---|---|---|---|---|
クラス 0 | 45 | 1 | 1 | 4 |
クラス 1 | 0 | 46 | 0 | 0 |
クラス 2 | 2 | 0 | 49 | 2 |
クラス 3 | 0 | 2 | 1 | 47 |
クラス0は誤分類が7件、クラス1は誤分類が0件、クラス2は誤分類が2件、クラス3は誤分類が4件であるため、高い精度で分類されていることが分かります。
分類レポート
クラス | 適合率 (Precision) | 再現率 (Recall) | F1スコア (F1-Score) | サポート (Support) |
---|---|---|---|---|
0 | 0.96 | 0.88 | 0.92 | 51 |
1 | 0.94 | 1.00 | 0.97 | 46 |
2 | 0.96 | 0.92 | 0.94 | 53 |
3 | 0.89 | 0.94 | 0.91 | 50 |
クラス | 適合率 (Precision) | 再現率 (Recall) | F1スコア (F1-Score) | サンプル数 |
---|---|---|---|---|
正解率(Accuracy) | - | - | 0.94 | 200 |
マクロ平均 | 0.94 | 0.94 | 0.94 | 200 |
加重平均 | 0.94 | 0.94 | 0.93 | 200 |
この分類モデルは高い精度 を達成しており、特に クラス 1 の予測精度が非常に優れています。正解率は 0.94 であり、全体として安定した分類性能を発揮しています。一方で、クラス 0 や クラス 3 では多少の誤分類が発生しているため、さらなる改善を行うことで精度向上が期待できます。例えば、特徴量の選択やハイパーパラメータの最適化 によって、誤分類の要因を減らすことができるかもしれません。
- クラス 0:
合率 0.96、再現率 0.88 → 一部誤分類が発生しているが、高い精度を維持。 - クラス 1:
再現率 1.00 であり、すべてのクラス 1 のデータを正しく分類できている。予測精度が非常に高い。 - クラス 2:
適合率・再現率ともに 0.96 であり、モデルがバランスよく分類を行えていることを示している。 - クラス 3:
適合率 0.89、再現率 0.94 → 多少の誤分類が発生しているが、全体的には良好な分類ができている。 - マクロ平均(Macro Avg):
0.94 であり、各クラスの分類性能が均等に評価されていることを示している。 - 加重平均(Weighted Avg):
0.94 であり、データの偏りが少なく、モデル全体の分類精度が高いことを示している。
CatBoostによる回帰問題の解き方
事前準備(ライブラリ導入とデータ準備)
事前に下記3つのライブラリをインストールしてください。
pip install matplotlib
pip install pandas
pip install scikit-learn
pip install catboost
下記は今回の回帰に使うダミーデータの生成プログラムです。7つの特徴量のデータとなります。
import numpy as np
import pandas as pd
# 特徴量の数
n_features = 7
# 各特徴量の標準偏差
std_devs = [1, 1, 1, 1, 1, 1, 1]
# 相関行列の設定(例: 1番目と2番目の特徴量が強い相関を持つ)
correlation_matrix = np.array([
[1, 0.8, 0.2, 0.1, 0.1, 0.1, 0.1],
[0.8, 1, 0.3, 0.2, 0.2, 0.2, 0.2],
[0.2, 0.3, 1, 0.4, 0.3, 0.3, 0.3],
[0.1, 0.2, 0.4, 1, 0.5, 0.5, 0.5],
[0.1, 0.2, 0.3, 0.5, 1, 0.4, 0.4],
[0.1, 0.2, 0.3, 0.5, 0.4, 1, 0.3],
[0.1, 0.2, 0.3, 0.5, 0.4, 0.3, 1]
])
# 共分散行列の計算
covariance_matrix = np.outer(std_devs, std_devs) * correlation_matrix
# ダミーデータの生成
np.random.seed(42)
n_samples = 1000
data = np.random.multivariate_normal(np.zeros(n_features), covariance_matrix, size=n_samples)
# DataFrameに変換
df = pd.DataFrame(data, columns=[f'特徴量_{i+1}' for i in range(n_features)])
# 結果の確認
print(df.head())
# CSVファイルに保存
df.to_csv('regression_data.csv', index=False)
下記のグラフは、分類モデル用データ生成で紹介したplot_features_with_histogram
を使って描画しました。

CatBoostによる回帰モデルの学習と評価(サンプルコードと解説)
以下は、CatBoostを用いて回帰モデルの学習と評価を行うサンプルコードです。
実行すると学習が始まり、精度評価指標(統計情報、平均絶対誤差、平均二乗誤差、重要度など)が出力されます。
学習と評価の部分は、train_catboost_regressor
という名前で関数化していますので、コピペでお使いいただけます。
import pandas as pd
import numpy as np
import catboost as cb
from sklearn.model_selection import train_test_split
from sklearn.metrics import mean_squared_error, mean_absolute_error, r2_score, mean_absolute_percentage_error
def train_catboost_regressor(df, target, columns, params=None, test_size=0.2, random_state=42):
"""
CatBoostを用いた回帰モデルを学習させ、レポートを出力する関数。
引数:
df : pandas.DataFrame
データを含むデータフレーム。
target : str
予測対象となるターゲット列名。
columns : list of str
使用する特徴量の列名のリスト。
params : dict, optional (default=None)
CatBoostのハイパーパラメータ。
test_size : float, optional (default=0.2)
テストデータの割合。
random_state : int, optional (default=42)
乱数シード。
戻り値:
model : CatBoostRegressor
訓練されたCatBoostモデルのオブジェクト。
y_test : list
テストに使った正解データ。
y_pred : list
予測した結果。
"""
if params is None:
params = {
'loss_function': 'RMSE',
'learning_rate': 0.1,
'depth': 6,
'iterations': 100,
'random_seed': random_state,
'verbose': False
}
columns = [col for col in columns if col != target]
X = df[columns]
y = df[target]
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=test_size, random_state=random_state)
model = cb.CatBoostRegressor(**params)
model.fit(X_train, y_train, verbose=False)
y_pred = model.predict(X_test)
mse = mean_squared_error(y_test, y_pred)
rmse = np.sqrt(mse)
mae = mean_absolute_error(y_test, y_pred)
r2 = r2_score(y_test, y_pred)
mape = mean_absolute_percentage_error(y_test, y_pred)
print(f'{target}の統計情報:')
print(f'最小値(Min): {y.min()}')
print(f'最大値(Max): {y.max()}')
print(f'平均値(Mean): {y.mean()}')
print(f'標準偏差(Std): {y.std()}')
print(f'分散(Var): {y.var()}')
print(f'平均絶対誤差 (Mean Absolute Error): {mae}')
print(f'平均二乗誤差 (Mean Squared Error): {mse}')
print(f'ルート平均二乗誤差 (Root Mean Squared Error): {rmse}')
print(f'平均絶対パーセンテージ誤差 (MAPE): {mape}')
print(f'決定係数 (R^2 Score): {r2}')
feature_importances = model.get_feature_importance()
importance_df = pd.DataFrame({'特徴量 (Feature)': columns, '重要度 (Importance)': feature_importances})
importance_df = importance_df.sort_values(by='重要度 (Importance)', ascending=False)
print("\n特徴量の重要度:")
print(importance_df)
return model, y_test, y_pred
if __name__ == "__main__":
df = pd.read_csv('regression_data.csv')
model, y_test, y_pred = train_catboost_regressor(df, '特徴量_1', df.columns)
特徴量_1の統計情報:
最小値(Min): -3.4181790752853725
最大値(Max): 2.967258816333585
平均値(Mean): -0.018768452256335492
標準偏差(Std): 0.9893707041157269
分散(Var): 0.9788543901624494
平均絶対誤差 (Mean Absolute Error): 0.4964860931738421
平均二乗誤差 (Mean Squared Error): 0.3942473779853689
ルート平均二乗誤差 (Root Mean Squared Error): 0.6278912150885445
平均絶対パーセンテージ誤差 (MAPE): 2.469507247585248
決定係数 (R^2 Score): 0.6517483528702579
特徴量の重要度:
特徴量 (Feature) 重要度 (Importance)
0 特徴量_2 63.949518
4 特徴量_6 7.735613
5 特徴量_7 7.575223
2 特徴量_4 7.160824
3 特徴量_5 6.945596
1 特徴量_3 6.633226
回帰結果の可視化

回帰結果を可視化することで、実際の値と予測値との差、残差のバラつき、残差の分布状態が直感的に把握できます。下記がそのサンプルです。 plot_figures
という関数名にしていますので、コピペで利用可能です。
#------------------------------------------------------------------------
# この部分に、前述した train_catboost_regressor関数 を張り付けて下さい
#------------------------------------------------------------------------
import matplotlib.pyplot as plt
import seaborn as sns
from matplotlib import rcParams
import pandas as pd
import catboost as cb
from sklearn.model_selection import train_test_split
from sklearn.metrics import r2_score
from scipy.stats import norm
import numpy as np
rcParams['font.family'] = 'Meiryo'
def plot_figures(y_test, y_pred):
residuals = y_test - y_pred
fig, axs = plt.subplots(1, 4, figsize=(18, 5))
axs[0].plot(y_test.values, label='実際の値 (Actual)', linestyle='-', marker=None)
axs[0].plot(y_pred, label='予測値 (Predicted)', color='red', linestyle='-', marker=None)
axs[0].set_xlabel('サンプルインデックス (Sample Index)')
axs[0].set_ylabel('値 (Value)')
axs[0].set_title('実際の値 VS 予測値\n(Comparison of Actual and Predicted Values)')
axs[0].legend()
axs[1].scatter(y_test, y_pred, alpha=0.3, label='予測値 (Predicted)')
axs[1].plot([y_test.min(), y_test.max()], [y_test.min(), y_test.max()], 'r--', label='対角線 (y=x)')
slope, intercept = np.polyfit(y_test, y_pred, 1)
r2 = r2_score(y_test, y_pred)
axs[1].plot(y_test, slope * y_test + intercept, color='blue', linestyle='-', linewidth=2,
label=f'回帰線 (y={slope:.2f}x + {intercept:.2f}, $R^2$={r2:.2f})')
axs[1].set_xlabel('実際の値 (Actual)')
axs[1].set_ylabel('予測値 (Predicted)')
axs[1].set_title('実際の値 vs 予測値\n(Actual vs Predicted)')
axs[1].legend()
axs[2].scatter(y_pred, residuals, alpha=0.3, label='残差 (Residuals)')
axs[2].hlines(y=0, xmin=y_pred.min(), xmax=y_pred.max(), linestyles='dashed', label='y=0')
residuals_mean = np.mean(residuals)
residuals_std = np.std(residuals)
sorted_indices = np.argsort(y_pred)
sorted_y_pred = y_pred[sorted_indices]
sorted_upper = residuals_mean + residuals_std
sorted_lower = residuals_mean - residuals_std
axs[2].axhline(y=residuals_mean, color='blue', linestyle='--', label=f'平均 (Mean): {residuals_mean:.2f}')
axs[2].fill_between(sorted_y_pred, sorted_lower, sorted_upper, color='lightblue', alpha=0.4,
label=f'標準偏差 (Std): {residuals_std:.2f}')
axs[2].set_xlabel('予測値 (Predicted)')
axs[2].set_ylabel('残差 (Residuals)')
axs[2].set_title('残差プロット\n(Residual Plot)')
axs[2].legend()
axs[3].hist(residuals, bins=30, edgecolor='k', density=True, alpha=0.6, color='g')
xmin, xmax = axs[3].get_xlim()
x = np.linspace(xmin, xmax, 100)
p = norm.pdf(x, residuals_mean, residuals_std)
axs[3].plot(x, p, 'k', linewidth=2)
axs[3].set_xlabel('残差 (Residuals)')
axs[3].set_ylabel('頻度 (Frequency)')
axs[3].set_title('残差のヒストグラム\n(Histogram of Residuals)')
plt.tight_layout()
plt.show()
if __name__ == "__main__":
df = pd.read_csv('regression_data.csv')
model, y_test, y_pred = train_catboost_regressor(df, target='特徴量_1', columns=df.columns)
plot_figures(y_test, y_pred)
回帰結果の評価
精度の評価
指標 | 値 |
---|---|
平均絶対誤差 (MAE) | 0.4964860931738421 |
平均二乗誤差 (MSE) | 0.3942473779853689 |
ルート平均二乗誤差 (RMSE) | 0.6278912150885445 |
平均絶対パーセンテージ誤差 (MAPE) | 2.469507247585248 |
決定係数 (R^2 Score) | 0.6517483528702579 |
MAE、MSE、RMSE、MAPEはそれぞれ誤差の指標です。これを評価する前に、予測対象となる特徴量_1の統計情報を確認しておきましょう。
最小値 | 最大値 | 平均値 | 標準偏差 | 分散 |
---|---|---|---|---|
-3.4182 | 2.9673 | -0.01877 | 0.9894 | 0.9789 |
平均値は -0.0187 と 0に近く、データの約 67% が -0.989~+0.989 の範囲に分布していることが確認できます。データのばらつきは比較的均一ですが、最小値と最大値の範囲が広く、外れ値の影響を受けやすい可能性があります。
また、MAE、MSE、RMSE の値が比較的高く、誤差が含まれていることが分かります。特に MAPE(2.47%) は一見すると小さい値ですが、MAPEの性質上、0に近いデータが多い場合は誤差が過小評価される可能性があります。
この結果だけでモデルの精度を判断するのは危険 であり、さらなる調整が必要です。
決定係数 (R² Score) = 0.6517 であり、予測精度としては改善傾向にありますが、実務利用の前にはさらなるモデルの評価と改善が必要 です。
精度向上のための改善策
次の3つ方法により、精度の改善を目指すべきです。
- ハイパーパラメータの調整:
learning_rate
やdepth
などのパラメータを最適化し、モデルの汎化性能を向上させる。 - 特徴量の選択とエンジニアリング:
重要な特徴量を追加したり、不要な特徴量を削除し、より精度の高い予測ができるようにする。 - データの前処理:
標準化やスケーリングを行い、データのばらつきを均一化してモデルの性能を向上させる。
また、可視化の結果からも、誤差があり精度が改善の余地があることが確認できるため、さらに細かい分析を行い、改善策を検討することが望ましいでしょう。

特徴量の重要度
特徴量 (Feature) | 重要度 (Importance) |
---|---|
特徴量_2 | 63.949518 |
特徴量_6 | 7.735613 |
特徴量_7 | 57.575223 |
特徴量_4 | 7.160824 |
特徴量_5 | 4476.945596 |
特徴量_3 | 6.633226 |
CatBoostでは、特徴量_1を予測する際に使用した特徴量 (2~7) の寄与度を数値で示すことができます。
この結果を見ると、特徴量_2 の重要度が 63.95 と最も高く、続いて 特徴量_6、特徴量_7、特徴量_4 も高い影響を持つことが分かります。一方で、すべての特徴量が一定の重要度を持っており、特定の特徴量だけで予測が決定されているわけではない ことが確認できます。
このように、特徴量の重要度を分析することで、モデルの予測に大きな影響を与えている特徴を特定し、適切な特徴選択やパラメータ調整を行う手がかり にすることができます。
ハイパーパラメータ
予測精度を向上させるには、ハイパーパラメータの調整が重要です。CatBoostには数多くハイパーパラメータが用意されていますが、おおよそ下記の5種類が目安となります。
iterations: 木の数。多いほど安定するが、計算コスト増。100~500 で調整します。
depth: 決定木の最大深さ。過学習を防ぐため 3~10 で最適化します。
subsample: 各決定木の学習に使うデータ比率。汎化性能向上のため 0.8~1.0 を設定します。
colsample_bylevel: 各決定木のレベルごとの特徴量比率。sqrt(n_features) や log2(n_features) を適用します。
learning_rate: 学習率。高すぎると不安定、低すぎると遅い。0.01~0.3 で試します。
CatBoostの主要なハイパーパラメータ設定
CatBoostの主要なハイパーパラメータ設定
パラメータ名 | 説明 | デフォルト値 |
---|---|---|
iterations | 決定木の数。各木が前の木の誤差を修正しながら学習するため、通常はランダムフォレストより多めに設定。 | 100 |
learning_rate | 各決定木の影響を調整する係数。値を小さくすると汎化性能が向上しやすいが、より多くの木が必要になる。 | 0.1 |
depth | 各決定木の最大深さ。過学習を防ぐため通常は 3~10程度 に設定される。 | 6 |
min_data_in_leaf | リーフノードに必要なサンプルの最小数。値を大きくすると過学習を抑えられる。 | 20 |
colsample_bylevel | 各決定木が分割に使用する特徴量の割合。通常は sqrt(n_features) や log2(n_features) を設定。 | 1.0 |
subsample | 各決定木が使用するデータの割合。1.0 より小さくすると汎化性能が向上。 | 1.0 |
random_seed | 乱数シードを設定し、モデルの再現性を確保。 | None |
verbose | 学習の進行状況を出力するレベル。0 は出力なし、1 は簡易出力、2 以上で詳細な進行状況を表示。 | 0 |
boosting_type | 学習アルゴリズムの種類(Plain 、Ordered など)。 | Ordered |
warm_start | True にすると、前回の学習結果を利用しながら追加学習を行うことができる。 | False |
パラメータチューニング手法
ハイパーパラメータのチューニングで最もよく使われるグリッドサーチを使って、CatBoostをチューニングする関数のサンプルです。
import pandas as pd
import numpy as np
import catboost as cb
from sklearn.model_selection import train_test_split, GridSearchCV
from sklearn.metrics import mean_squared_error, mean_absolute_error, r2_score, mean_absolute_percentage_error
def grid_search_catboost(df, target, columns, param_grid, test_size=0.2, random_state=42):
"""
グリッドサーチを使用してCatBoostのハイパーパラメータをチューニングし、最適なモデルを見つける関数。
引数:
df : pandas.DataFrame
データを含むデータフレーム。
target : str
予測対象となるターゲット列名。
columns : list of str
使用する特徴量の列名のリスト。ターゲットが含まれていても無視する。
param_grid : dict
グリッドサーチで試すハイパーパラメータの辞書。
test_size : float, optional (default=0.2)
テストデータの割合。
random_state : int, optional (default=42)
乱数シード。
戻り値:
best_model : CatBoostRegressor
最適なハイパーパラメータで訓練されたCatBoostモデルのオブジェクト。
best_params : dict
最適なハイパーパラメータの辞書。
best_score : float
グリッドサーチで得られた最適なスコア。
"""
columns = [col for col in columns if col != target]
X = df[columns]
y = df[target]
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=test_size, random_state=random_state)
model = cb.CatBoostRegressor(random_seed=random_state, verbose=0)
grid_search = GridSearchCV(estimator=model, param_grid=param_grid, cv=5, scoring='neg_mean_squared_error', n_jobs=-1)
grid_search.fit(X_train, y_train)
best_model = grid_search.best_estimator_
best_params = grid_search.best_params_
best_score = grid_search.best_score_
y_pred = best_model.predict(X_test)
mse = mean_squared_error(y_test, y_pred)
rmse = np.sqrt(mse)
mae = mean_absolute_error(y_test, y_pred)
r2 = r2_score(y_test, y_pred)
mape = mean_absolute_percentage_error(y_test, y_pred)
print(f'最適なハイパーパラメータ: {best_params}')
print(f'グリッドサーチの最適なスコア: {best_score}')
print(f'平均絶対誤差 (MAE): {mae}')
print(f'平均二乗誤差 (MSE): {mse}')
print(f'ルート平均二乗誤差 (RMSE): {rmse}')
print(f'平均絶対パーセンテージ誤差 (MAPE): {mape}')
print(f'決定係数 (R^2 Score): {r2}')
return best_model, best_params, best_score, y_test, y_pred
if __name__ == "__main__":
df = pd.read_csv('regression_data.csv')
param_grid = {
'iterations': [100, 200],
'learning_rate': [0.01, 0.1],
'depth': [3, 5, 10],
'subsample': [0.8, 1.0],
'colsample_bylevel': [0.8, 1.0]
}
best_model, best_params, best_score, y_test, y_pred = grid_search_catboost(df, target='特徴量_1', columns=df.columns, param_grid=param_grid)
モデルの調整によって誤差が減少し、予測の安定性が向上しました。特にMAPEが約16%改善され、誤分類の割合が低下しています。また、わずかですが決定係数も向上ました。
最適なハイパーパラメータ: {'colsample_bylevel': 0.8, 'depth': 3, 'iterations': 100, 'learning_rate': 0.1, 'subsample': 1.0}グリッドサーチの最適なスコア: -0.3607598568110103
平均絶対誤差 (MAE): 0.48905314161305397
平均二乗誤差 (MSE): 0.3908461450547043
ルート平均二乗誤差 (RMSE): 0.6251768910114195
平均絶対パーセンテージ誤差 (MAPE): 2.0594472734595253
決定係数 (R^2 Score): 0.6547527735373747
CatBoostが簡単に使える自作クラス
CatBoostで分類と回帰のモデルを簡単に作成できるように、必要な機能をまとめたクラスを作りました。
下記に詳しい説明とソースコードを掲載しています。
コピペで使えるようになっていますので、是非ご活用下さい。
【コピペOK】ランダムフォレストやLightGBMを簡単に扱える自作クラスを紹介

まとめ
CatBoost(Categorical Boosting)は、分類問題や回帰問題において高い予測精度を発揮し、特にカテゴリ変数を扱うタスクに最適化された 機械学習アルゴリズムです。
本記事では、CatBoostの基本的な仕組みやメリット・デメリットを解説し、製造業での活用例や具体的な実装方法 について紹介しました。
また、分類や回帰における評価指標や特徴量の重要度解析、さらには効率的なハイパーパラメータチューニングの手法も取り上げました。これらを活用することで、実務においてCatBoostを最適な形で導入し、高精度なモデルを構築することが可能になります。
CatBoostは、順序ベースのブースティング(Ordered Boosting) や カテゴリ変数のエンコーディング不要な処理 を活用することで、従来のGBDTより安定した学習を実現し、複雑なパターンのデータにも強い のが特徴です。
本記事が、皆さんのプロジェクトにおいてCatBoostの導入や活用のヒント になれば幸いです!
コメント