モデルの複雑さ
#過学習と汎化能力
モデルの複雑さ
モデルの複雑さ(complexity)という概念を考える
たとえば決定木であれば、木が「深い」ほど「複雑である」という
深さ2の木
https://gyazo.com/6b9b434375cb9cd0b70cf975269d2feb
深さ6の木
https://gyazo.com/08993daca2bd6ca1d61c8562ef4feea3
原理的には、モデルを複雑にすると、学習データに対する「あてはまり」がよくなる
しかしながら、度を超えて複雑すぎると、ノイズを含んだデータに合わせすぎてしまい、過学習しやすくなる
よって、モデルは適度な複雑さにしておくことが非常に重要である
ただし、バイアス誤差と分散誤差にあるように、データ量が多いと、モデルが複雑であっても汎化能力は高くなる
モデルの複雑さとハイパーパラメータ
ハイパーパラメータとは、モデル自体のパラメータ$ \theta(たとえば$ y = ax + bでいえば$ aや$ b)ではなく、学習しようとしているモデルの構造や、学習アルゴリズムの挙動を制御するための、メタな(上位の)パラメータのこと
予測モデルのオブジェクトを生成する際の引数に入れる
ハイパーパラメータの中にはモデルの複雑さを調整するものがある
例えば以下は決定木を使用する際の「準備」(決定木モデルのクラスのオブジェクト生成)のコードだが、ここでの引数max_depthは、「最大でどの深さまでの木を作るか」を指定するハイパーパラメータ。これを大きくするほど複雑な決定木を作ることができる
model = DecisionTreeClassifier(max_depth = 3)
アルゴリズムによって、モデルの複雑さに影響するハイパーパラメータは異なる
汎化能力が高くなるようにハイパーパラメータを調整する
モデルが「適度な複雑さ」になるように、「複雑さを決めるハイパーパラメータ」を決めればよい
どうやって「適度な複雑さ」を見つけるか?
テストデータに対する評価が最も良くなる設定にするのが基本戦略
テストデータは擬似的な「未知のデータ」なので、これに対する評価が良いということは、汎化能力が高いと期待できる(と考える)
詳しくはハイパーパラメータチューニングにて
(参考)各種アルゴリズムとそのライブラリ(リンク先はライブラリの仕様のページ)
これらのリンク先にある「Parameters」
決定木:DecisionTreeClassifier
ランダムフォレスト:RandomForestClassifier
XGBoost:XGBClassifier
ロジスティック回帰:LogisticRegression
サポートベクターマシン(SVM):SVC
多層パーセプトロン:MLPClassifier