# Catboostとは？XgboostやLightGBMとの違いとPythonでの使い方を見ていこうー！！

> 当サイト【スタビジ】の本記事では、XgboostやLightGBMに代わる新たな勾配ブースティング手法「Catboost」について徹底的に解説していき最終的にPythonにてMnistの分類モデルを構築していきます。LightGBMやディープラーニングとの精度差はいかに！？

- URL: https://toukei-lab.com/catboost
- 公開: 2022.11.29 / 更新: 2025.02.06
- サイト: スタビジ（https://toukei-lab.com）

:::talk{who="umatan"}
当サイト【スタビジ】の本記事では、XgboostやLightGBMに代わる新たな勾配ブースティング手法「Catboost」について徹底的に解説していき最終的にPythonにてMnistの分類モデルを構築していきます。LightGBMやディープラーニングとの精度差はいかに！？
:::

こんにちは！

消費財メーカーでデジタルマーケター・データサイエンティストをやっているウマたん([@statistics1012](https://twitter.com/statistics1012?lang=ja))です！

[Xgboost](/xgboost)に代わる手法として[LightGBM](/light-gbm)が登場し、さらにCatboostという手法が2017年に登場いたしました。

これらは[弱学習器](/weak-learning)である[決定木](/%E6%B1%BA%E5%AE%9A%E6%9C%A8)を勾配ブースティングにより[アンサンブル学習](/ensemble)した非常に強力な機械学習手法群。

計算負荷もそれほど重くなく非常に高い精度が期待できるため、[Kaggle](/kaggle)などの[データ分析コンペ](/data-competition)や実務シーンなど様々な場面で頻繁に使用されているのです。

:::talk{who="robotan"}
最新のアルゴリズムがどんどん登場するけど、勾配ブースティング×決定木の組み合わせであることは変わらないんだね！
:::

:::talk{who="umatan"}
そうなんだよー！それだけ勾配ブースティング×決定木の組み合わせが強いということだね！
:::

この記事では、そんなCatboostの概要について見ていき、Pythonで[Mnist](/mnist)の画像データを分類するモデルを作っていきます。

[LightGBM](/light-gbm)と[ディープラーニング](/deep-learning)との精度比較も行いますよー！

機械学習・ディープラーニングをまず勉強したい方は当メディアが運営する[「スタアカ（スタビジアカデミー）」](https://toukei-lab.com/achademy/)の以下のコースをチェックしてみて下さい！

:::box
**[スタアカ「06.機械学習概要コース」](https://toukei-lab.com/achademy/courses/machien-learning-theory/)\
[スタアカ「08.ディープラーニングコース」](https://toukei-lab.com/achademy/courses/deep-learning/)**
:::

:::talk{who="umatan"}
Pythonの勉強は以下の記事をチェック！
:::

<https://toukei-lab.com/python-learn>

## Catboostとは？XgboostやLightGBMとの違い

![勾配ブースティング](/wp-content/uploads/2019/07/xgboost.jpg)

Catboostは、<mark>「Category　Boosting」の略であり2017年にYandex社から発表された機械学習ライブラリ。</mark>

発表時期としてはLightGBMよりも若干後になっています。

Yandex社は<mark>ロシアのGoogle。</mark>

ロシアの検索エンジン市場の過半数を占有しており、自動車産業にも事業展開している大手IT企業なんです。

:::talk{who="robotan"}
へー！中国以外にも検索市場でGoogleが天下を取っていない国があるんだねー！
:::

:::talk{who="umatan"}
韓国はNaverが圧倒的だし、国産会社が検索市場でトップシェアを取っている国はまだまだ多いね！
:::

さて、そんなYandex社が発表した「Category　Boosting」ですが他の勾配ブースティング手法と比較してどのような特徴があるのでしょうか？

「Category Boosting」を発表した論文を見てみると以下のように書いてあります。

> In this paper we present a new gradient boosting algorithm that successfully handles categorical features and takes advantage of dealing with them during training as opposed to preprocessing time.\
> Another advantage of the algorithm is that it uses a new schema for calculating leaf values when selecting the tree structure, which helps to reduce overfitting.\
> （引用元：”[CatBoost: gradient boosting with categorical features](http://learningsys.org/nips17/assets/papers/paper_11.pdf)\
> [support](http://learningsys.org/nips17/assets/papers/paper_11.pdf)”）

ここで言っているのは2つ。

:::point
**・カテゴリカル変数（質的変数）の扱い方が上手いよ**\
**・決定木のツリー構造を最適にして過学習を防ぐよ**
:::

まあ、要は<mark>データセットによるけどXgboostやLightGBMよりも精度が高くなる可能性があるよ</mark>ってことですね。

実際に論文の中でもいくつかのデータセットに各手法を適用させてLogloss値で比較をしています。

![Catboost performance](/wp-content/uploads/2020/03/catboost-performance.jpg)\
（引用元：”[CatBoost: gradient boosting with categorical features ](http://learningsys.org/nips17/assets/papers/paper_11.pdf)[support](http://learningsys.org/nips17/assets/papers/paper_11.pdf)”）

実際にCatboostが最も良い精度をたたき出しているのが分かると思います。

ちなみに[Catboostの公式HP](https://catboost.ai/)に色々とまとめてありますが、大規模データセットのモデル構築も予測も比較的早い速度で出来るよ、とも書いてあります。

## CatboostをPythonで実装してみよう！

実際にそんなCatboostをPythonで実装していきましょう！

今回は、[Mnist](/mnist)というよく[画像認識](/python-image)に使われるデータセットを用いていきます。

このデータセットには0～9の文字が様々なカタチで書かれたサンプルが入っています。

[LightGBM](/light-gbm)と[ディープラーニング（CNN）](/deep-learning)と比較していきますよー！

ちなみに機械学習モデルを個人で構築するならGoogle colaboratoryがオススメです！

永久無料でGPUが使えるので！

<https://toukei-lab.com/google-colaboratory>

CatboostについてもGoogle colaboratoryを使ってモデル構築していきます！

### CatboostでMnistを分類

Catboostは、その名の通りcatboostという名前のライブラリから使用することが可能なんです。

前準備として必要なライブラリを読み込んでいきましょう！

```python
import pandas as pd
import numpy as np
from tensorflow.keras.datasets import mnist
from sklearn.model_selection import train_test_split
```

続いて、今回分類を行うMnistデータを加工。

```python
# Kerasに付属の手書き数字画像データをダウンロード
np.random.seed(0)
(X_train_base, labels_train_base), (X_test, labels_test) = mnist.load_data()

# Training set を学習データ（X_train, labels_train）と検証データ（X_validation, labels_validation）に8:2で分割する
X_train,X_validation,labels_train,labels_validation = train_test_split(X_train_base,labels_train_base,test_size = 0.2)

# 各画像は行列なので1次元に変換→X_train,X_validation,X_testを上書き
X_train = X_train.reshape(-1,784)
X_validation = X_validation.reshape(-1,784)
X_test = X_test.reshape(-1,784)

#正規化
X_train = X_train.astype('float32')
X_validation = X_validation.astype('float32')
X_test = X_test.astype('float32')
X_train /= 255
X_validation /= 255
X_test /= 255
```

Catboostにインプットするためのデータを用意します。

```python
# 訓練・テストデータの設定
from catboost import Pool

train_pool = Pool(X_train, labels_train)
validate_pool = Pool(X_validation, labels_validation)
```

パラメータを設定して・・

```python
#経過時間計測
import time
start = time.time()

from catboost import CatBoostClassifier
params = {
    'early_stopping_rounds' : 10,
    'iterations' : 100, 
    'custom_loss' :['Accuracy'], 
    'random_seed' :42
}
```

モデル構築と予測を行っていきます。

この時処理速度も同時に測っていきます。

```python
# パラメータを指定した場合は、以下のようにインスタンスに適用させる
model = CatBoostClassifier(**params)
cab = model.fit(train_pool, eval_set=validate_pool)
preds = cab.predict(X_test)
from sklearn.metrics import accuracy_score
print('accuracy_score:{}'.format(accuracy_score(labels_test, preds)))

#経過時間
print('elapsed_timetime:{}'.format(time.time()-start))
```

推定精度は・・・

![Catboost　Mnist](/wp-content/uploads/2020/04/catboost_perform2.jpg)

推定精度は0.9565！

<mark>非常に高い精度を得ることができました。</mark>

最新の勾配ブースティング手法「Catboost」がこんなにもカンタンに実装できちゃうんです！

全コードをまとめておきましょう！

```python title="Catboost.py"
import pandas as pd
import numpy as np
from tensorflow.keras.datasets import mnist
from sklearn.model_selection import train_test_split

# Kerasに付属の手書き数字画像データをダウンロード
np.random.seed(0)
(X_train_base, labels_train_base), (X_test, labels_test) = mnist.load_data()

# Training set を学習データ（X_train, labels_train）と検証データ（X_validation, labels_validation）に8:2で分割する
X_train,X_validation,labels_train,labels_validation = train_test_split(X_train_base,labels_train_base,test_size = 0.2)

# 各画像は行列なので1次元に変換→X_train,X_validation,X_testを上書き
X_train = X_train.reshape(-1,784)
X_validation = X_validation.reshape(-1,784)
X_test = X_test.reshape(-1,784)

#正規化
X_train = X_train.astype('float32')
X_validation = X_validation.astype('float32')
X_test = X_test.astype('float32')
X_train /= 255
X_validation /= 255
X_test /= 255

# 訓練・テストデータの設定
from catboost import Pool

train_pool = Pool(X_train, labels_train)
validate_pool = Pool(X_validation, labels_validation)

#経過時間計測
import time
start = time.time()

from catboost import CatBoostClassifier
params = {
    'early_stopping_rounds' : 10,
    'iterations' : 100, 
    'custom_loss' :['Accuracy'], 
    'random_seed' :42
}
# パラメータを指定した場合は、以下のようにインスタンスに適用させる
model = CatBoostClassifier(**params)
cab = model.fit(train_pool, eval_set=validate_pool)
preds = cab.predict(X_test)
from sklearn.metrics import accuracy_score
print('accuracy_score:{}'.format(accuracy_score(labels_test, preds)))

#経過時間
print('elapsed_timetime:{}'.format(time.time()-start))

```

### LightGBMとディープラーニング（CNN）でMnistを分類

同様にLightGBMを使用してMnistを分類した結果は・・・0.972！

![Light gbm　Mnist](/wp-content/uploads/2020/04/Light-GBM_performance2.jpg)

結果は[Light gbm](/light-gbm)に軍配があがりました。

処理速度も<mark>Catboostが負けている・・・</mark>

やはりLight gbmつよし！ですねー

LightGBMの全コードは以下です。

```python title="Light-gbm.py"
import lightgbm as lgb
import pandas as pd
import numpy as np
from tensorflow.keras.datasets import mnist
from sklearn.model_selection import train_test_split
from sklearn.metrics import accuracy_score

# Kerasに付属の手書き数字画像データをダウンロード
np.random.seed(0)
(X_train, labels_train), (X_test, labels_test) = mnist.load_data()

# 各画像は行列なので1次元に変換→X_train,X_validation,X_testを上書き
X_train = X_train.reshape(-1,784)
X_test = X_test.reshape(-1,784)

#正規化
X_train = X_train.astype('float32')
X_test = X_test.astype('float32')
X_train /= 255
X_test /= 255

# 訓練・テストデータの設定
train_data = lgb.Dataset(X_train, label=labels_train)
eval_data = lgb.Dataset(X_test, label=labels_test, reference= train_data)

params = {
'task': 'train',
'boosting_type': 'gbdt',
'objective': 'multiclass',
'num_class': 10,
'verbose': 5,
}

gbm = lgb.train(
    params,
    train_data,
    valid_sets=eval_data,
    num_boost_round=50,
)

preds = gbm.predict(X_test)
preds
y_pred = []
for x in preds:
  y_pred.append(np.argmax(x))

accuracy_score(labels_test, y_pred)
```

詳しくは以下の記事でまとめています！

<https://toukei-lab.com/light-gbm>

ちなみにディープラーニング（CNN）で回した時の推定精度は、0.9696！

以下がディープラーニングのコードになります。

```python title="Deep-learning.py"
import numpy as np
from sklearn.model_selection import train_test_split
import tensorflow as tf
from tensorflow.keras.datasets import mnist
from tensorflow import keras
from tensorflow.keras.layers import Dense, Activation
from tensorflow.keras.models import Sequential
from tensorflow.keras.utils import to_categorical


# Kerasに付属の手書き数字画像データをダウンロード
np.random.seed(0)
(X_train_base, labels_train_base), (X_test, labels_test) = mnist.load_data()

# Training set を学習データ（X_train, labels_train）と検証データ（X_validation, labels_validation）に8:2で分割する
X_train,X_validation,labels_train,labels_validation = train_test_split(X_train_base,labels_train_base,test_size = 0.2)

# 各画像は行列なので1次元に変換→X_train,X_validation,X_testを上書き
X_train = X_train.reshape(-1,784)
X_validation = X_validation.reshape(-1,784)
X_test = X_test.reshape(-1,784)

#正規化
X_train = X_train.astype('float32')
X_validation = X_validation.astype('float32')
X_test = X_test.astype('float32')
X_train /= 255
X_validation /= 255
X_test /= 255

# labels_train, labels_validation, labels_test をダミー変数化して y_train, y_validation, y_test に格納する
y_train = to_categorical(labels_train)
y_validation = to_categorical(labels_validation)
y_test = to_categorical(labels_test)

# パラメータの設定
n_features = 784
n_hidden   = 100
bias_init = 0.1

# 学習率
rate       = 0.01

# Sequentialクラスを使ってモデルを準備する
model = Sequential()

# 隠れ層を追加
model.add(Dense(n_hidden,activation='relu',input_shape=(n_features,)))
model.add(Dense(n_hidden,activation='relu'))
model.add(Dense(n_hidden,activation='relu'))

# 出力層を追加
model.add(Dense(10,activation='softmax'))

# TensorFlowのモデルを構築
model.compile(optimizer=tf.optimizers.Adam(rate),
              loss='categorical_crossentropy', metrics=['mae', 'accuracy'])

# Early stoppingを適用してフィッティング
log = model.fit(X_train, y_train, epochs=3000, batch_size=100, verbose=True,
                callbacks=[keras.callbacks.EarlyStopping(monitor='val_loss', 
                                                     min_delta=0, patience=10, 
                                                         verbose=1)],
                validation_data=(X_validation, y_validation))

# Test dataで予測を実行。
pred_test = model.predict_classes(X_test)

validation = (pred_test == labels_test)
size       = validation.size
size
correct    = np.count_nonzero(validation)
print(f"{correct}/{size} correct ({correct*100/size:.3f}%)")
```

詳しくは以下の記事でまとめています！

<https://toukei-lab.com/deep-learning>

もう少し真面目に[パラメータチューニング](/hyper-para-tuning)を行えば順序が逆転することは多いにあります。

ぜひ色々と試してみてください！

## Catboost　まとめ

ここまでご覧いただきありがとうございました！

本記事では**Catboost**について見てきましたー！

最後にカンタンにCatboostの特徴をまとめておきましょう！

:::point
**・カテゴリカル変数（質的変数）の扱い方が上手いよ**\
**・決定木のツリー構造を最適にして過学習を防ぐよ**\
**・計算負荷が低いよ**
:::

Pythonで容易に実装できるので、ぜひ使ってみてください。

XgboostやLightGBMより高い精度を得られるかもしれませんよー！

:::talk{who="umatan"}
興味がある人は、カテゴリカル変数を含むデータセットで試してみよう！
:::

ちなみにPythonの学習方法については以下の記事でまとめていますのでよければチェックしてみてください！

<https://toukei-lab.com/python-learn>

よりさらに深く統計学や機械学習を学びたい人のために勉強法を以下にまとめていますのでぜひチェックしてみてください！

<https://toukei-lab.com/statistics-freshman>

<https://toukei-lab.com/machine-learning-fresh>

また、当メディアではデータサイエンティストになるための分野を体系的に学ぶスクール[「スタアカ（スタビジアカデミー）」](https://toukei-lab.com/achademy/)を運営しておりますので、データサイエンス全般に興味のある方は是非チェックしてみてください！

:::box
**AIデータサイエンス特化スクール「スタアカ」**

![スタアカ（スタビジアカデミー）のトップページ](/wp-content/uploads/2026/10/achademy-top.jpg)
:::

<table class="table">
<tbody>
<tr>
<th>【価格】</th>
<td>ライトプラン：1,280円/月（全コースが受講し放題）<br>
プレミアムプラン：129,800円（通常149,800円・買い切り）</td>
</tr>
<tr>
<th>【オススメ度】</th>
<td><span class="stars" role="img" aria-label="5点中5点" data-value="5"></span></td>
</tr>
<tr>
<th>【サポート体制】</th>
<td><span class="stars" role="img" aria-label="5点中4点" data-value="4"></span></td>
</tr>
<tr>
<th>【受講形式】</th>
<td>オンライン形式</td>
</tr>
<tr>
<th>【学習範囲】</th>
<td>統計学・機械学習・ディープラーニングを網羅的に学ぶ<br>
生成AI（LLM・RAG・プロンプトエンジニアリング）を学ぶ<br>
SQLとPythonを組み合わせて実データを使った様々なワークを行う<br>
実践的なビジネスフレームワークを学ぶ<br>
マーケティングの実行プラン策定</td>
</tr>
</tbody>
</table>

データサイエンティストとしての自分の経験をふまえてエッセンスを詰め込んだのがこちらのスタビジアカデミー、略して「[スタアカ](https://toukei-lab.com/achademy/)」！！

月額1,280円のライトプランで、統計学から機械学習・生成AIまで全コースが受講し放題です！

<mark>プレミアムプランでは、24時間以内の質問対応と現役データサイエンティストとの1on1（30分×4回）を実施します！</mark>

カリキュラム自体は、他のスクールと比較して圧倒的に良い自信があるのでぜひ受講してみてください！

他のスクールのカリキュラムはPythonでの機械学習実装だけに焦点が当たっているものが多く、実務に即した内容になっていないものが多いです。

<mark>そんな課題感に対して、実務で使うことの多いSQLや機械学習のビジネス導入プロセスの理解なども合わせて学べるボリューム満点のコース</mark>になっています！

Pythonが初めての人でも学べるようなカリキュラムにしておりますので是非チェックしてみてください！

ウォルマートのデータを使って商品の予測分析をしたり、実務で使うことの多いGoogleプロダクトのBigQueryを使って投球分析をしたり、データサイエンティストに必要なビジネス・マーケティングの基礎を学んでマーケティングプランを作ってもらったりする盛りだくさんの内容になってます！

:::box
**・BigQuery上でSQL、Google Colab上でPythonを使い野球の投球分析**\
**・世界最大手小売企業のウォルマートの実データを用いた需要予測**\
**・ビジネス・マーケティングの基礎を学んで実際の企業を題材にしたマーケティングプランの策定**\
**・生成AIのAPIを使ってチャットボットやAIエージェントを作る**
:::

::button[スタアカの受講はこちら]{href="https://toukei-lab.com/achademy/" note="＼今すぐ試す／"}