LoginSignup
4

More than 5 years have passed since last update.

過学習を防ごう(機械学習)

Last updated at Posted at 2018-11-23

目次

1 過学習とは?
2 もっと学習する
3 交差検証
4 L2正則化
5 L1正則化
6 次元削減をする

過学習とは?

機械学習を行う上で重要なことの一つにモデルの汎化性能をあげることがあります。あるデータを使ってモデルを作った結果、その精度が100%になったときは注意が必要です。なぜならそのモデルは学習に使ったデータのみに完璧な解答をしているだけで、未知のデータに対してはうまく正解を出せないかもしれないからです。このようにモデルが学習をするときに使ったデータに対してはよい正解率を示すのに対して、未知のデータに対しては低い正解率しか出せないことを「過学習」といいます。過学習を防ぐための手法はいくつかあります。

もっと学習する

一番単純な方法はこれです。学習に使用するデータの数が増えれば、より多くの未知のデータを学習できる可能性があるからです。また、データの数が少ないことはよく起こりうるので、データの水増しなどの前処理をする必要があることもあります。それでもデータが足りないときは別の方法を考える必要があります。

交差検証

学習データをある一定の割合で分けて、片方を学習用データ、もう片方を評価用データにして、評価データでモデルの評価をする方法があります。これをhold-out法といいます。評価用データは学習には用いていないので、このデータを用いることでモデルの汎化性能を調べることができます。交差検証のほかの手法としては、k分割交差検証や、Leave-One-Out法、bootstrap法などがあります。(説明は割愛)

L2正則化

正則化はコスト関数にペナルティ項を追加します。L2正則化は重みベクトルの2乗の和を計算してコスト関数に追加します。正則化項を式にするとこんな感じ

  L2 : ||w||^2 = (\sum_{j=1}^m w_j^2 )

重みの2乗の和がかかってくるので正則化されていないコスト関数を使ってトレーニングされたモデルと比べて、重みの値は極端に小さくなります。全体的に重みが減り、モデルの表現力は減るので過学習の抑制につながります。

L1正則化

L2正則化に対してL1正則化は重み係数の絶対値の和となります。式にするとこんな感じ

L1 : ||w|| = (\sum_{j=1}^m |w_j| )

L1正則化は疎な解につながります。つまり重みが0になる部分が多く出てきます。
重みが0になってくれるのがありがたいのは特徴量が非常に多いときです。これによってデータの次元を減らすことができます。

次元削減をする

特徴量の数を減らすことによってモデルの複雑性を下げることができます。ただし、無作為に特徴量を減らすと、モデルの正確さが削がれることが考えられるので、できるだけデータを説明するのにあまり重要でない特徴量を減らしていくのが望ましいです。データ量の圧縮には一般的に主成分分析(PCA)などが用いられます。次元を削減することで、次元の呪い(与えられた標本に対して、特徴量が多すぎると学習器の性能が低下すること)を抑えることもできます。

おわりに

そろそろちゃんと実装したいです。

参考文献

python機械学習プログラミングー達人データサイエンティストによる理論と実装
OpenCVとPythonによる機械学習プログラミング

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
4