この記事では、Catboostモジュールと、もう少し複雑な概念である CatboostClassifier
について学びます。
それでは始めましょう。
catboostモジュールとは?
CatBoostモジュールは、決定木やその他の機械学習タスクにおいて、高速でスケーラブル、非常に高性能な勾配ブーストシステムであるオープンソースライブラリです。
また、GPUにも対応しており、学習速度を向上させることができます。
Catboostは、kaggleで利用可能な回帰問題や分類問題の範囲に使用することができます。
Catboost分類器の実装
1. モジュールのインポート
catboostモジュールの簡単な実装では、3つのモジュールをインポートすることになります。
catboostモジュールは明らかに、データを可視化するための matplotlib と、データセットを生成するための
numpy` モジュールをインポートします。
もし、モジュールのインポートでエラーが発生した場合は、 pip
コマンドを使用してモジュールをインストールしてください。
正しいモジュールと正しい関数をインポートするためのコードは以下の通りです。
1
2
3
|
from catboost import CatBoostClassifier
import matplotlib.pyplot as plt
import numpy as np
|
2. トレーニングデータとテストデータの準備
次に、catboostモジュールを学習させるためのテストデータを作成し、ランダムポイントを確認するためのテストデータを作成します。
トレーニングデータ
学習データのサンプルを作成するには、平均と共分散の2つの行列が必要です。
平均は点の中心を表し、共分散は点の広がりを表します。
後で、平均と共分散行列を点の数とともに渡して、多変量正規分布を作成します。
2つの異なるクラスのデータを作成するコードは以下のとおりです。
1
2
3
4
5
6
7
|
mean1 = [ 8 , 8 ]
covar1 = [[ 2 , 0.7 ],[ 0.7 , 1 ]]
d2 = np.random.multivariate_normal(mean1,covar1, 200 )
mean2 = [ 1 , 1 ]
covar2 = [[ 2 , 0.7 ],[ 0.7 , 1 ]]
d2 = np.random.multivariate_normal(mean2,covar2, 200 )
|
テストデータ
学習ポイントを得るために、randomモジュールをインポートし、後で学習済みモデルに渡すための10個のランダムなxとyの座標を生成します。
次に、xとyの座標をforループを使ってリストにまとめます。
そのためのコードを以下に示します。
1
2
3
4
5
6
|
import random
x_cord_test = [random.randint( - 2 , 10 ) for i in range ( 5 )]
y_cord_test = [random.randint( - 2 , 10 ) for i in range ( 5 )]
test_data = []
for i in range ( len (x_cord_test)):
test_data.append([x_cord_test[i],y_cord_test[i]])
|
モデル準備のための最終学習データ
最後のステップは、2つのクラスのデータを1つのデータフレームに結合して、最終的な学習データを作成することです。
結果のデータの行数は、両方のクラスのデータポイントの合計に等しくなります。
列の数は3列となり、列には点のx、y座標とラベルが格納されます。
すべての値を0としたダミーのデータフレームを作成し、ラベルとともに2つのクラスのデータをデータフレーム内の正しい位置に配置します。
最後に、データのシャッフルを行う。
1
2
3
4
5
6
|
plt.style.use( 'seaborn' )
plt.scatter(d1[:, 0 ],d1[:, 1 ],color = "Red" ,s = 20 )
plt.scatter(d2[:, 0 ],d2[:, 1 ],color = "Blue" ,s = 20 )
for i in test_data:
plt.scatter(i[ 0 ],i[ 1 ],marker = "*" ,s = 200 ,color = "black" )
plt.show() |
データビジュアライゼーション – 2
それでは、以下のコードで最終的なデータを可視化してみましょう。
1
2
3
4
5
6
7
8
9
10
11
|
df_rows = d1.shape[ 0 ] + d2.shape[ 0 ]
df_columns = d1.shape[ 1 ] + 1
df = np.zeros((df_rows,df_columns))
df[ 0 :d1.shape[ 0 ], 0 : 2 ] = d1
df[d1.shape[ 0 ]:, 0 : 2 ] = d2
df[ 0 :d1.shape[ 0 ], 2 ] = 0
df[d1.shape[ 0 ]:, 2 ] = 1
np.random.shuffle(df) |
最終的なグラフは以下のようになります。
これで CatBoostClassifier
に渡すデータの準備が整いました。
1
2
3
4
|
plt.scatter(df[:, 0 ],df[:, 1 ],color = "Green" )
for i in test_data:
plt.scatter(i[ 0 ],i[ 1 ],marker = "*" ,s = 200 ,color = "black" )
plt.show() |
3. catboost モジュールの使用 – CatBoostClassifier
CatBoostClassifierを実装するために、反復回数をパラメータとするモデルオブジェクトを作成します。
また、モデルには GPU
を使用する予定なので、パラメータとして tak_type
を渡します。
次のステップでは、fit
関数を用いて学習データ点とラベルをフィッティングし、モデルを学習させます。
また、各テスト点を predict
関数に渡して、結果を取得します。
1
2
|
model = CatBoostClassifier(iterations = 100 ,task_type = "GPU" )
model.fit(df[:, 0 : 2 ],df[:, 2 ],verbose = False )
|
結果は以下のようになります。
グラフから、かなり正確な結果であることがクロスチェックできます。
(6,3) ==> 0.0 (10,4) ==> 0.0 (6,-2) ==> 0.0 (1,7) ==> 1.0 (3,0) ==> 1.0 |
まとめ
本日は、CatBoost という高速で素晴らしい分類器について学ぶことができました。
皆さんも様々なデータセットで試してみてください。
お読みいただきありがとうございました。