max_depthは1でもいいのでしょうか?
解決したいこと
パラメーターのチューニングがうまくいかず手作業でmax_depthを1~5まで変えてみました。
すると1の時ものすごく成績が良くなりました。
木の最大深度が1ということは一回も枝分かれしていないのでは?という疑念があるのですが、
max_depthは1でも問題ないのでしょうか?
*追記
1回枝分かれしているということがわかりました。
これはいろいろな説明変数からカットオフ値のようなものを設定して枝分かれさせるのだと思いますが、
複数の説明変数があるのにどの説明変数を選んで枝分かれさせるというのでしょうか。
謎です。
以下にプログラムの概要を記します(固有名詞が出てくるため花の名前に変えてあります。)
該当するソースコード
#訓練データとテストデータの取得
from sklearn.model_selection import train_test_split
flower_data = pd.DataFrame(flower, columns=["turip","sakura","dandelion","rose","magnolia", "lily"])
print(flower_data)
flower_target=pd.Series(flower["type"])
print(flower_target)
#訓練データとテストデータの取得(テストが0.2,訓練が0.8)
from sklearn.model_selection import train_test_split
train_x, test_x, train_y, test_y = train_test_split(flower_data,
flower_target,
test_size=0.2,
shuffle=False)
#xgboost用の型に変換する
dtrain = xgb.DMatrix(train_x, label=train_y)
#パラメータの設定 max_depth:木の最大深度 eta:学習率 objective:学習目的 num_class:クラス数
param = {'max_depth': 1, 'objective': 'multi:softmax', 'num_class':4}
#学習
bst = xgb.train(param, dtrain)
#予測
dtest = xgb.DMatrix(test_x)
pred = bst.predict(dtest)
#精度の確認
from sklearn.metrics import accuracy_score
from sklearn.metrics import r2_score
#.4fは小数点以下4桁までという意味
score = accuracy_score(test_y, pred)
print('score:{0:.4f}'.format(score))
結果
accuracy scoreが1になり予測も全問正解という結果になり、
もしかして予測してるのではなくてそのまま目的変数を引用してるだけ?なのでは、という気持ちになっています。
調べるとmax_depth=1を使っているプログラムもあるようで問題ないのかもしれませんが、
不安です。
木の深度が1とはどういうイメージなのか、教えていただけますでしょうか。