charter(JJ1PID)

多項式モデルの次数とR二乗値、修正済みR二乗値の関係

R二乗値はモデル式の標本値への当てはまりの良さを表しますが、一般に、モデル式の次数が高くなればなるほど当てはまりは良くなり、R二乗値は増え続けます
過度に当てはまったモデル式は標本値を過学習し、余計な性質まで表そうとしてしまい、これは悪いモデルです


このため、モデル式の次数の大きさ、つまり説明変数の数の大きさも加味した「自由度調整済みR二乗値」を用いてモデルの間で比較する必要があります*1


そこで、今回はR二乗値と修正済みR二乗値がモデル式の次数が増えるほどどのような値を取っていくか調べてみました

環境

OS: macOS High Sierra (10.13.6)
PC: MacBook Pro (13-inchi,2016)
MATLAB: R2019a (9.6.0.1072779)

準備

標本値は-10から10までの40個の等間隔なtにおける、 0.3t^3 -5t + 3にノイズ(標準偏差20、平均値0の正規分布の乱数)が乗った値としました
関数fit()の引数のベクトルが列ベクトルでないとエラーが出るのでtは転置しています
なお、この式では実行するたびにyの値が変わるので、一度yを出力したら同一ディレクトリに保存し、ワークスペースのyを削除してyの式をコメントアウト、その後は同一ディレクトリに保存したyの値を使いました

t = (linspace(-10,10,40))';
y = 0.3*t.^3 -5*t + 3 + 20*randn(40,1);


つまり、理想のモデル式は y = 0.3t^3 -5t + 3です
(実際のフィッティングでこれは分かりません)


標本値と理想のモデル式はプロットすると次のようになります
f:id:monhime:20190911064351j:plain


プロパティインスペクターで凡例やグリッドを追加しました

f = @(x) 0.3*x.^3 - 5*x + 3;
hold on;
fplot(f,[-10 10]);
hold off;

フィッティング

一次

直線で近似します


yfit1 = 13.51t + 10.39
R^2=0.7110
修正済みR^2 = 0.7034
一次近似


標本値と近似式のプロットと残差プロット
残差に明らかなパターンが有り改善の余地があるいい例ですね

標本値と一次近似一次近似の残差プロット

%フィッティング
%yfit1はフィッティングした値、gof1は適合度の構造体
[yfit1 gof1]= fit(t,y,'poly1');
plot(yfit1,'-',t,y,'o');
%残差プロット
plot(yfit1,t,y,'residuals');
%R二乗値、修正済みR二乗値の記録
gof(1,1) = gof1.rsquare;
gof(1,2) = gof1.adjrsquare;

二次

yfit2 = 0.05812t^2 + 13.51t+8.355
R^2=0.7114
修正済みR^2 = 0.6958
二次近似


標本値と近似式のプロットと残差プロット
二次曲線の直線に近い部分で一次近似のようなことをしているようです

標本値と二次近似
二次近似の残差プロット

[yfit2 gof2]= fit(t,y,'poly2')
plot(yfit2,'-',t,y,'o')
plot(yfit2,t,y,'residuals')
gof(2,1) = gof2.rsquare 
gof(2,2) =gof2.adjrsquare

三次

yfit3 = 0.2949t^3 + 0.05812t^2-5.074t+8.355
R^2=0.9663
修正済みR^2 = 0.9635


理想のモデル式では係数は3次から順に0.5、0、-5、3ですが、どれも95%信頼区間に含まれています
三次近似


きれいに近似できています
残差もきれいに散らばっています


標本値と三次近似
三次近似の残差プロット

[yfit3 gof3]= fit(t,y,'poly3')
plot(yfit3,'-',t,y,'o')
plot(yfit3,t,y,'residuals')
gof(3,1) = gof3.rsquare 
gof(3,2) = gof3.adjrsquare

四次

R^2=0.9668
修正済みR^2 = 0.9631
三次のときよりR^2は僅かに大きく、修正済みR^2は僅かに小さくなりました
4次の項の係数がほぼ0で、95%信頼区間に0が含まれています
4次の項は必要ないと統計的に言えることになります
4次近似


三次近似と見た目同じです


標本値と四次近似
四次近似の残差プロット

[yfit4 gof4]= fit(t,y,'poly4')
plot(yfit4,'-',t,y,'o')
plot(yfit4,t,y,'residuals')
gof(4,1) = gof4.rsquare 
gof(4,2) = gof4.adjrsquare

五次以降

四次近似と同じく、4次以上の項の係数が小さく95%信頼区間に0が含まれていました
グラフも三次と見た目同じででした


参考にyfit*とgof*の結果を載せておきます

f:id:monhime:20190911074705p:plainf:id:monhime:20190911074709p:plainf:id:monhime:20190911074714p:plain
f:id:monhime:20190911074718p:plainf:id:monhime:20190911074722p:plain

R二乗値と修正済みR二乗値

各次数でのR二乗値と修正済みR二乗値は次のようになりました
f:id:monhime:20190911075201p:plain


2から3で急激に大きくなり、その後はR二乗値は僅かに増えながら、修正済みR二乗値は減少しました
このことから、この標本では三次近似がもっとも良いことになります

plot(gof(:,1),'-')
hold on;
plot(gof(:,2),'-')
legend('rsquare','adjrsquare','Location','southeast')

おわりに

標本の数が小さいともっとわかりやすく過学習したのかもしれません


理想のモデル式の係数によっては修正済みR二乗値が増え続けることがあるみたいです


MATLABの練習も兼ねて今後も今回のようなちょっとした記事を書いていきたいと思います