【AIプログラミング】勾配ブースティングマシンを勉強、乳がんデータを分類

AIプログラミング

勾配ブースティングマシンという名前がかっこいいやつを勉強しました。

アルゴリズムは見た目じゃなくて中身だよ。

決定木の流れで、ランダムフォレストと勉強してきましたが、今回は、最終進化のような、勾配ブースティングマシンというものを勉強しました。この勾配ブースティングマシンというアルゴリズムをベースにしたものは、かなり精度が出るみたいです。まずは、scikit-learnに実装されているもので試してみたいと思いました。

勾配ブースティングマシンは、決定木を応用したアルゴリズムです。決定木については、こちらの記事もご参考ください。

こんな人の役に立つかも

・機械学習プログラミングの勉強をしている人

・勾配ブースティングマシンについて知りたい人

・scikit-learnで勾配ブースティングマシンを勉強している人

スポンサーリンク

勾配ブースティングマシンについて

勾配ブースティングマシンは、いくつかの決定木を組み合わせたアルゴリズムです。

「勾配ブースティング」の部分を英語で「GradientBoosthing」と言い、その後に分類ならClassifierがついて「GradientBoostingClassifier」のように使います。

回帰、分類の両方に利用できる、アンサンブル学習です。

アンサンブル学習とは

アンサンブル学習は、いくつもの基本的な学習アルゴリズムを組み合わせたものです。

勾配ブースティングは、決定木という基本的なアルゴリズムの組み合わせでできています。また、基本的なアルゴリズム(勾配ブースティングでいう決定木)を弱学習器といいます。

ランダムフォレストもアンサンブル学習です。

 

キングスラ〇ムのような感じのアルゴリズムかな。

なんだかすごそうだね。

scikit-learnの勾配ブースティングマシンで分類

scikit-learnライブラリでの勾配ブースティングマシンは、

分類用に「GradientBoostingClassifier

回帰用に「GradientBoostingRegressor

が準備されていますので、簡単に利用することができます。

乳がんデータの分類で威力偵察

import~乳がんデータの読み込みまでを行います。

from sklearn.datasets import load_breast_cancer
from sklearn.model_selection import train_test_split
from sklearn.ensemble import GradientBoostingClassifier
import matplotlib.pyplot as plt
import numpy as np

#乳がんデータ
panda_box = load_breast_cancer()

X = panda_box.data
y = panda_box.target

#訓練データとテストデータに分割
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size = 0.25, stratify=y, random_state=0)

勾配ブースティングマシンの分類器を利用したいので、「GradientBoostingClassifier」を利用します。

#勾配ブースティングマシン
clf = GradientBoostingClassifier().fit(X_train,y_train)

print("訓練データへの精度")
print("{:.4f}" .format(clf.score(X_train, y_train)))
print("未知データへの精度")
print("{:.4f}" .format(clf.score(X_test, y_test)))
訓練データへの精度
1.0000
未知データへの精度
0.9580

訓練データへの精度が1ということは、過学習??

代表的なパラメータにlearning_rateがあるので、それを調整してみよう。

learning_rateは、デフォルト値で「0.1」です。この値を小さくすると、モデルの複雑さがなくなっていきますので、0.01とかにしたほうが訓練データに適合しすぎないのかもしれません。

次のプログラムで、「learning_rate」を「0.01~0.5」までの50回分を比較しました。

import matplotlib.pyplot as plt
import numpy as np

train_dat_array = []
test_dat_array = []

loop = 50

for i in range(loop):
    clf = GradientBoostingClassifier(learning_rate=(loop+1)*0.01).fit(X_train,y_train)
    train_dat_array.append(clf.score(X_train, y_train))
    test_dat_array.append(clf.score(X_test, y_test))

#グラフの描画
X_axis = np.linspace(0.01,loop*0.01,loop)
plt.plot(X_axis, train_dat_array)
plt.plot(X_axis, test_dat_array)

訓練データへの精度はずっと1なので、テストデータへの精度が良い、0.02当りを選択するのが良いのかもしれません。

タイトルとURLをコピーしました