Pythonを用いて直線や曲線にフィットさせてみたいと思います。
資料はこちら → 線形回帰
p.1 Scikit-learn及びmatplotlibを用いて、右下のグラフの回帰直線を描くスクリプトです。y=5x+誤差(乱数)にデータを作成し散布図を描いています。
p.2 Xとyのデータを指定した割合で分割。今回は学習用データ:テストデータ=7:3で分配します。 線形回帰として「LinearRegression()」を用います。「fit」でフィットさせます。すると回帰直線の切片、勾配だけでなく、予測値、誤差などを算出してくれます
p.3 直線は容易に回帰式を得られますが、左上のようなプロットの場合は、どうフィットさせますか? 1次、2次、3次と10次の式で残差が最小になるように回帰曲線をpythonを用いて描いてみました。 左上の表をご覧ください。回帰式の次数が増えると決定係数R2も増加して10次ではR2=1と各点を全て通る曲線が描かれています。 新しいxの値に対するyの値を4つのグラフを用いて予測しようとする場合、どれを選択するでしょうか? 右上か左下のグラフが予測し易いと思いませんか。右下はフィットはしていますが、予測には使い難いですね。 このような状態を機械学習では「過学習」と呼びます。
学習し過ぎなのです。
p.4 過学習の状態をイメージするとこんな図になります。機械学習で青線のような回帰曲線を導いたとします。本来の予測曲線は黒の実線です。 xeという値に対する予測値yは予測して欲しいy値より下方にあり乖離が大きくなります。この状況を過学習と呼びます。
p.5 過学習を防止するために、損失関数(残差の平方和)に回帰係数の平方和あるいは残差の絶対値に係数λを乗じてペナルティーとします。(損失関数)+(ペナルティー)が最小になるようにして回帰式を求めます。 平方和を用いるのが、「リッジ回帰」絶対値を用いるのが「LASSO回帰」です。
p.6にリッジ回帰、p,7にLASSO回帰のスクリプトを載せます。
p.10 直線回帰の場合は、線形回帰、リッジ回帰、LASSO回帰いずれとも大きなさはなさそうです。
過学習にペナルティーとは、勉強も、し過ぎはダメなのでしょうか?
本日用いたスクリプトはこちら → 回帰(スクリプト)
資料p.3の多項式フィッティングのスクリプトはp.3にあります。 使用したx値とy値は別のテキストファイルから読み込んでいますので、ご注意ください。