LoginSignup
45
51

More than 5 years have passed since last update.

機械学習よくわかってない人がPythonでGBDT使ってみる話

Last updated at Posted at 2015-12-17

なぜか日本語のGBDTのページが少なかったので書いてみました。
タイトルの通り機械学習よくわかってない人なのでガチ勢からのツッコミには対応できません。ご了承ください。
俺みたいな「機械学習ちょっと知ってるけど高度な話になると何もわからない」人の助けになればいいなと思っています。

GBDTとは

教師有り機械学習の一つ。Gradient Boosting Decision Treeの略です。SVMみたく教師データをもとにクラスタリングしてくれます。ただ基本二値分類のSVMとは違って他クラス分類ができます。Randomforestなど他の他クラス分類との違いは調査不足です。ごめんなさい。
理論など詳しい話はもっと頭のいい人がまとめてくださっているので省きます。
http://www.housecat442.com/?p=480
http://qiita.com/Quasi-quant2010/items/a30980bd650deff509b4

とりあえずやってみる

SVMでCodeIQの問題を解いている記事があったので真似してGBDTでもやってみます。

sample_gbdt.py
# -*- coding: utf-8 -*-
from sklearn.ensemble import GradientBoostingClassifier
import numpy as np

# 学習データ
train_data = np.loadtxt('CodeIQ_auth.txt', delimiter=' ')
X_train = [[x[0], x[1]] for x in train_data]
y_train = [int(x[2]) for x in train_data]

# 試験データ
X_test = np.loadtxt('CodeIQ_mycoins.txt', delimiter=' ')
y_test = np.array([1,0,0,1,1,0,1,1,1,0,0,1,1,0,0,1,0,0,0,1])

clf = GradientBoostingClassifier(n_estimators=100, learning_rate=0.1,
        max_depth=1).fit(X_train, y_train)

print ("Predict ",clf.predict(X_test))
print ("Expected", y_test)
print clf.score(X_test, y_test)

SVMを使っていたのをGBDTでやるだけです。今回は二値分類で。labelの種類を増やせば勝手にそれに応じて他クラス分類してくれるみたいですけど。

結果がこちら

('Predict ', array([1, 0, 0, 1, 0, 0, 1, 1, 1, 0, 0, 1, 0, 0, 0, 1, 1, 0, 0, 1]))
('Expected', array([1, 0, 0, 1, 1, 0, 1, 1, 1, 0, 0, 1, 1, 0, 0, 1, 0, 0, 0, 1]))
0.85

3か所間違えてますね。。。

パラメータ調整

ここでsklearnのページを見てみましょう。別に見なくてもいいですけど。
http://scikit-learn.org/stable/modules/generated/sklearn.ensemble.GradientBoostingClassifier.html
パラメータの数がたくさん。15個。しかも英語でよくわからない。
しかしよくみるとmax_depthのdefaultが3とある。自分のは1だ。なんでだ。

てなわけで直して再チャレンジ。

('Predict ', array([1, 0, 0, 1, 0, 0, 1, 1, 1, 0, 0, 1, 1, 0, 0, 1, 0, 0, 0, 1]))
('Expected', array([1, 0, 0, 1, 1, 0, 1, 1, 1, 0, 0, 1, 1, 0, 0, 1, 0, 0, 0, 1]))
0.95

あがった。あがりましたよ。あがりましたけどやっぱり1か所間違えてますね。
ここで調子の乗ってmax_depthをあげてみましょう。例えば5とか

('Predict ', array([1, 0, 0, 1, 0, 0, 1, 1, 1, 0, 0, 1, 1, 0, 0, 1, 0, 0, 0, 0]))
('Expected', array([1, 0, 0, 1, 1, 0, 1, 1, 1, 0, 0, 1, 1, 0, 0, 1, 0, 0, 0, 1]))
0.9

下がりましたね……。あげればいいなんてものではないのはわかっていましたがやっぱりそうなんですね。
しかしこの規模の問題でさえパラメータを変えるだけで結果が変わるんですね。如何に機械学習においてパラメータ調整が大切か身をもって知りました。

そしてこのパラメータ調整。もうちょっと専門的知識がないとうまくできない気がします。pythonでちょっと動かして喜んでるようでは難しそうです。

もうちょっとまじめに勉強して出直そうと思います。

45
51
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
45
51