matatabipower
@matatabipower

Are you sure you want to delete the question?

Leaving a resolved question undeleted may help others!

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とはどういうイメージなのか、教えていただけますでしょうか。

0

1Answer

木の最大深度が1ということは一回も枝分かれしていないのでは?

1回の枝分かれをしている.が正しいですね.

いろいろな説明変数からカットオフ値のようなものを設定して枝分かれさせるのだと思いますが、複数の説明変数があるのにどの説明変数を選んで枝分かれさせるというのでしょうか

貪欲に,分割することで最適な答えを出しそうな特徴量を求め選択して枝分かれさせる.だったと記憶してます(間違ってたらすみません).

もしかして予測してるのではなくてそのまま目的変数を引用してるだけ?なのでは

Cross Validationは実行されたのでしょうか.最適化の手順を明示いただけると何かわかるかもしれません.
少なくとも,訓練データ内で各パラメータとの相関をとるだけで,「そのまま目的変数を引用してる」かどうかがわかると思います.

0Like

Comments

  1. @matatabipower

    Questioner

    おこたえありがとうございます!!
    考えれば考えるほど混乱しております。。。
    >>>貪欲に,分割することで最適な答えを出しそうな特徴量を求め選択して枝分かれさせる.だったと記憶してます(間違ってたらすみません).
    最適な答えを出しそうなものを選択している、ということでなんとなくイメージがつかめました。

    今回うまくいかなかったものを全部消してしまい明示ができずすみません。
    ただ別の説明変数を加えてみたところ単に引用しているだけではないとわかりました。
    質問している私が何を聞けばいいかわかっていない状態でご迷惑をおかけしました。

    もう少し考えてみて改めて質問させていただこうと思います。
    ありがとうございました!!

Your answer might help someone💌