pythonのxgboostのグリッドサーチとクロスバリデーション関連での質問です。


[Python: XGBoost を使ってみる](https://blog.amedama.jp/entry/2019/01/29/235642)

上記ページの「学習過程を可視化する」の項目での質問です。

上記HPのサンプルコードで

[code]

    # 学習過程を記録するための辞書
    evals_result = {}
    print('@A'. evals_result)
    bst = xgb.train(xgb_params,
                    dtrain,
                    num_boost_round=1000,  # ラウンド数を増やしておく
                    evals=evals,
                    evals_result=evals_result,
                    )
    
    print('@B'. evals_result)
    
[/code]

＠Aの部分でprintするとevals_resultは当然カラです。  
しかし＠Bのところでprintするとevals_resultにいろいろと何かが代入されています。

evals_resultには何が代入されているのですか？

HPの「# 学習の課程を折れ線グラフとしてプロットする」以降の部分がなぜ出力されるのかがよくわからなくコードを１行1行追ってみています。

とりあえず evals_result について解説をいただきたく思います。  
よろしくお願いします。




> evals_resultには何も代入していないのに、なぜか＠B時点には何やらが代入されています。 まずそこがよくわからないです。

何も代入されていない（空の辞書であった）`evals_result`に対して、`xgb.train()`の処理中に要素（学習用データと検証用データの損失）が追加されています。

> xgb.trainのところでも「カラのevals_resultを.trainの引数evals_result引数に代入している」ように見えます。

はい。そうです。`xgb.train()`の処理中に`evals_result`に値が代入（要素が追加）されるように、引数で渡しています。「参照渡し」を理解されていないのかもしれませんね。このキーワードでググってみて下さい。

> またxgb.trainによってevals_resultに何かが代入されたのだとしたら、ではなんでevals_result =
> {}が必要なの？とまた疑問が浮かびます。

定義されていない変数は使えないからです。

> また「学習過程を記録するための辞書」というのが何を指しているのかもわからないです。 すみません。

参照しているページを見ると、この辞書から取得した学習用データと検証用データの損失をプロットしています。100ラウンドを超えると、学習が進んでも精度が上がっていかない様子が読み取れますよね。

> こんな状態です。 evals_resultにはどこで何が代入されたのでしょうか？そこがよくわかりません。

前述した通りです。

`evals_result`を`xgb.train()`の戻り値にしていないのは、おそらく他の同様のメソッドとの統一を図るためではないかと思います（※推測ですが...）。

