リッジ回帰は高次元()では役に立たないでしょうか?OLSはどのようにオーバーフィットに失敗しますか?


50

予測子とサンプルサイズ古き良き回帰問題を考えます。通常の知恵は、OLS推定器がオーバーフィットし、一般的にリッジ回帰推定器よりも優れていることです:クロス検証を使用して最適な正則化パラメーターを見つけるのが標準です。ここでは、10倍のCVを使用します。清澄化更新:とき、Iは"最小ノルムOLSの推定"を理解することによって与えられる"OLS推定量"によってpβ = X X + λ I - 1 X Y λ N < P β OLS = X X + X Y = X + Y n

β^=(XX+λI)1Xy.
λn<p
β^OLS=(XX)+Xy=X+y.

およびデータセットがあります。すべての予測子は標準化されており、を予測するのに(単独で)良い仕事をすることができるものがかなりあります。たとえば、ように小さなイッシュをランダムに選択すると、妥当なCV曲線が得られます。大きな値の、ゼロのR-squaredを生成し、小さな値の、負のR-squaredを生成しますオーバーフィッティング)の間に最大値があります。以下のため曲線は似ています。ただし、それよりもはるかに大きい場合、たとえば場合、最大値はまったく得られません。曲線のプラトー、つまりOLS、P > 1000年Y 、P = 50 < N λ λ P = 100 > N 、P 、P = 1000年λ 0 λn=80p>1000yp=50<nλλp=100>npp=1000λ0は、最適なリッジ回帰と同等の性能を発揮します。λ

ここに画像の説明を入力してください

それはどのように可能であり、私のデータセットについて何と言っていますか?明白な何かを見逃していますか、それとも本当に直観に反していますか?両方がよりも大きいとすると、と間に質的な違いはありますか?p = 1000 np=100p=1000n

最小ノルムOLSソリューションはどのような条件下でオーバーフィットしませんか?n<p


更新:コメントに不信感があったため、を使用した再現可能な例を次に示しglmnetます。私はPythonを使用しますが、Rユーザーはコードを簡単に変更できます。

%matplotlib notebook

import numpy as np
import pylab as plt
import seaborn as sns; sns.set()

import glmnet_python    # from https://web.stanford.edu/~hastie/glmnet_python/
from cvglmnet import cvglmnet; from cvglmnetPlot import cvglmnetPlot

# 80x1112 data table; first column is y, rest is X. All variables are standardized
mydata = np.loadtxt('../q328630.txt')   # file is here https://pastebin.com/raw/p1cCCYBR
y = mydata[:,:1]
X = mydata[:,1:]

# select p here (try 1000 and 100)
p = 1000

# randomly selecting p variables out of 1111
np.random.seed(42)
X = X[:, np.random.permutation(X.shape[1])[:p]]

fit = cvglmnet(x = X.copy(), y = y.copy(), alpha = 0, standardize = False, intr = False, 
               lambdau=np.array([.0001, .001, .01, .1, 1, 10, 100, 1000, 10000, 100000]))
cvglmnetPlot(fit)
plt.gcf().set_size_inches(6,3)
plt.tight_layout()

ここに画像の説明を入力してください ここに画像の説明を入力してください


2
@DJohnson冗談じゃない。通常の10倍CV。つまり、各トレーニングセットにはn = 72があり、各テストセットにはn = 8があります。
アメーバは、モニカを復活させる

2
それは通常の履歴書とはほど遠いものです。検出可能な結果のようなものをどのように期待できるのでしょうか?
マイクハンター

3
@DJohnsonなぜこれがいつもとは違うと言っているのか分かりません。これが10倍CVです。
アメーバは、モニカを復活させる

2
@ seanv507なるほど。さて、「lambda = 0のソリューション」を「lambda = 0の最小ノルムソリューション」として定義することをお勧めします。私の質問は次のように再定式化できると思います:どのような条件下で、n <pオーバーフィットvsオーバーフィットではない最小ノルムOLSソリューションでしょうか?
アメーバは、モニカを復活させる

3
@amoeba:この質問をありがとう。これまで非常に有益で興味深いものでした。
usεr11852が復活モニック言う

回答:


23

自然な正則化は、理論PCAに多くの小さなコンポーネントが存在するために発生します。これらの小さなコンポーネントは、小さな係数を使用してノイズを近似するために暗黙的に使用されます。最小ノルムOLSを使用する場合、多くの小さな独立したコンポーネントでノイズを近似します。これには、リッジ正則化と同等の正則化効果があります。多くの場合、この正則化は強すぎるため、負のリッジとして知られる「反正則化」を使用して補正することができます。その場合、負の値に対してMSE曲線の最小値が表示されますλxλ

理論上のPCAとは、次のことを意味します。

ましょ多変量正規分布。などの線形アイソメ図があります。ここで、は対角ですのコンポーネントは独立しています。は、対角化することで簡単に取得できます。fはuが= F X N 0 D D U D ΣをxN(0,Σ)fu=f(x)N(0,D)DuDΣ

これで、モデルをと書くことができます (線形等角は内積を保持します)。あなたが書く場合は、モデルを記述することができ 。さらにしたがって、リッジや最小ノルムOLSのような近似法は完全に同型です の推定量は、推定量の によるイメージです。y=β.x+ϵy=f(β).f(x)+ϵγ=f(β)y=γ.u+ϵβ=γy=γ.u+ϵfy=β.x+ϵ

理論的PCAは、非独立予測変数を独立予測変数に変換します。これは、経験的共分散行列を使用する経験的PCAに大まかに関連しているだけです(サンプルのサイズが小さい理論的なものとは大きく異なります)。理論PCAは実際には計算できませんが、ここでは直交予測子空間でモデルを解釈するためにのみ使用されます。

多くの小さな分散独立予測子をモデルに追加するとどうなるか見てみましょう。

定理

係数によるリッジの正則化は()と同等です:λp

  • それぞれが分散を持つ偽独立予測子(中心および同一分布)を追加するpλp
  • 強化されたモデルに最小ノルムOLS推定量を適合させる
  • 真の予測変数のパラメーターのみを保持

(スケッチ)証明

コスト関数が漸近的に等しいことを証明します。レッツ・スプリット本物と偽物の予測にモデル:。Ridgeのコスト関数(真の予測子用)は次のように記述できます。y=βx+βx+ϵ

costλ=β2+1λyXβ2

最小ノルムOLSを使用する場合、応答は完全に適合します。誤差項は0です。コスト関数は、パラメーターのノルムのみに関するものです。真のパラメーターと偽のパラメーターに分割できます。

costλ,p=β2+inf{β2Xβ=yXβ}

正しい表現では、最小ノルム解は次の式で与えられます。

β=X+(yXβ)

SVDを使用する:X

X=UΣV

X+=VΣ+U

私たちは、当たり前のことを見本質的に特異値に依存の特異値の逆数であること 。の正規化されたバージョンはです。私は文献を見てきましたが、大きなランダム行列の特異値はよく知られています。以下のためと十分に大きい、最小と最大 特異値は、(参照によって近似される定理1.1)。βX+XXp/λXpnsminsmax

smin(p/λX)p(1n/p)
smax(p/λX)p(1+n/p)

が大きい場合、は0に向かう傾向があるため、すべての特異値は近似されると言えます。副<文>この[前述の事実の]結果として、それ故に、従って、だから◆【同】consequently; therefore <文>このような方法で、このようにして、こんなふうに、上に述べたように◆【同】in this manner <文>そのような程度まで<文> AひいてはB◆【用法】A and thus B <文>例えば◆【同】for example; as an example:pn/pp

β1λyXβ

最後に:

costλ,pβ2+1λyXβ2=costλ

:モデルに偽の予測子の係数を保持するかどうかは関係ありません。によって導入される分散は 。したがって、とにかく1に向かう傾向がある係数だけMSEを増やします。どういうわけか、偽の予測変数を実際の予測変数とは異なる方法で扱う必要はありません。βxλpβ21pyXβ2npMSE(β)1+n/p

さて、@ amoebaのデータに戻ります。理論的なPCAを(通常と仮定)に適用した後、は線形アイソメトリによって変数変換されます。その変数の成分は独立しており、分散の減少順にソートされます。問題は、変換された問題と同等です。xxuy=βx+ϵy=γu+ϵ

ここで、コンポーネントの分散が次のようになると想像してください。

ここに画像の説明を入力してください

最後のコンポーネントの多くのを考慮し、それらの分散の合計を呼び出します。これらはそれぞれほぼ等しい分散を持ち、独立しています。それらは定理で偽の予測子の役割を果たします。pλλ/p

この事実は@jonnyのモデルでより明確です:理論的なPCAの最初のコンポーネントのみがと相関し(比例)、大きな分散を持ちます。他のすべてのコンポーネント(比例)の分散は比較的小さく(共分散行列を記述し、これを見るために対角化)、偽の予測子の役割を果たします。ここでの正規化は、前のに(およそ)し、真のしました。これは間違いなくオーバーシュリンクです。これは、最終的なMSEが理想的なMSEよりもはるかに大きいという事実からわかります。正則化効果が強すぎます。yx¯xix¯N(0,1p2)γ1γ12=1p

リッジによって、この自然な正則化を改善することが可能な場合があります。まず、時には必要な真剣にライバルリッジに本当に大きな定理(1000年、10000 ...)での有限性不正確のようなものです。しかし、Ridgeは、自然に存在する暗黙の正則化に対する追加の正則化であり、非常に小さな効果しか持たないことも示しています。この自然な正則化がすでに強すぎて、Ridgeが改善されないこともあります。これ以上に、反正則化:負の係数を持つリッジを使用することをお勧めします。これは、を使用した@jonnyのモデル()のMSEを示しています。ppp=1000λR

ここに画像の説明を入力してください


2
+1非常に素晴らしい、これを書いてくれてありがとう。「正則化」と言うときは、(つまり、リッジ)正則化を意味することを明確にすることが重要だと思います。投げ縄またはエラスティックネットの動作が改善され、実際にそれが人々が状況で使用していることを願っています。そのような設定で純粋なリッジを使用する人はいません。標準的なアドバイスは、スパース性を強制する正則化を使用することです。そのため、純粋な尾根の振る舞いは学問的な興味しか持たないかもしれません。それでも、私たちがここでそれを発見しているように見えるのはかなり驚くべきことです。なぜこれがあまり知られていないのですか?L2np
アメーバは、モニカを復活させる

1
不十分なハードコードされたに比例。申し訳ありませんが、私は何か適切な時間を持っていませんでした。私の主な焦点は、min-norm OLSの振る舞いでした。これはあなたの例とは異なり、40の最初の「それほど悪くない正則化」が激しくより良いことを確認しました。λσ2
ブノワサンチェス

3
私は謎を理解したと思う:係数によるリッジ正則化は、それぞれが分散(大きなに対して漸近的に)を持つ偽の予測子を追加するmin-norm OLSと同等です。データとジョニーのモデルでは、PCAの最小分散成分のおかげで何もせずに起こります。今私は...これを明確に説明する方法を見つけるために時間が必要λpλ/pp
ブノワ・サンチェス

1
私は小さな点を明確にしました:偽の予測子の係数はエラーをあまり増加させません(証明の最後の注を参照)。データ/ジョニーでは必然的に保持されるため、重要です。
ブノワサンチェス

3
ネガティブリッジを試しました。信じられませんが、うまくいきます!!! (ジョニーのモデルだけでなく...)
ブノワサンチェス

16

素晴らしい議論を続けてくれてありがとう。問題の核心は、最小ノルムOLSがリッジ回帰と同様の収縮を効果的に実行していることです。これは、たびに発生するようです。皮肉なことに、純粋なノイズ予測子を追加することは、非常に奇妙な形式または正則化として使用することさえできます。pn


パートI.人工データと分析CVによるデモンストレーション

@Jonny(+1)は非常に単純な人工的な例を思いついたので、ここで少し調整します。サイズとは、すべての変数が単位分散を持つガウス分布であり、各予測子と応答間の相関がます。を修正します。Xn×pyρρ=.2

二乗誤差の分析表現があるため、leave-one-out CVを使用します。これはPRESS、「予測二乗和」として知られています。残差である及びありますハット行列 SVD。これにより、クロス検証を使用せずに実際に実行することなく@Jonnyの結果を複製できます(の2乗の合計に対するPRESSの比率をプロットしています)。

PRESS=i(ei1Hii)2,
ei
e=yy^=yHy,
H
H=X(XX+λI)1X=US2S2+λU
X=USVglmnety

ここに画像の説明を入力してください

この分析的アプローチにより、での制限を計算できます。単にPRESS式にをプラグインしても機能しませんおよび場合、残差はすべてゼロであり、hat行列は対角に1を含む単位行列です。つまり、PRESSの分数方程式は未定義です。ただし、で制限を計算すると、の最小ノルムOLS解に対応し。λ0λ=0n<pλ=0λ0λ=0

コツは、場合にハット行列のテイラー展開を行うことです: ここで、グラム行列を導入しました。λ0

H=U11+λ/S2UU(1λ/S2)U=IλUS2U=IλG1.
G=XX=US2U

ほとんど終了です:ラムダはキャンセルされたため、ここに制限値があります。上の図(パネル)に大きな黒い点でプロットしましたが、完全に一致しています。

PRESS=i(λ[G1y]iλGii1)2=i([G1y]iGii1)2.
p>n

2月21日更新。上記の式は正確ですが、さらに近似することである程度の洞察を得ることができます。それはのように見えるあれば対角線上でもほぼ同じ値を持つ(おそらく非常に等しくない値を持つすべての固有値アップミックスかなり)。したがって、各について、があります。ここで、角括弧は平均化を示します。この近似を使用して、次のように書き換えることができ。この近似値は、上の図に赤い白丸で示されています。G1SUiGii1S2

PRESSS2S2Uy2.

これがよりも大きいか小さいかは、特異値依存します。このシミュレーションでは、はの最初のPCと相関しているため、は大きく、他のすべての項は小さくなります。(実際のデータでは、は主要なPCによっても十分に予測されます。)場合、の列が十分にランダムであれば、すべての特異値は互いにかなり近くなります(行直交)。「メイン」タームy2=Uy2SyXU1yypnXU1y1より小さい係数で乗算されます。最後に向かう項には、1より大きいがそれほど大きくない係数が乗算されます。全体的に標準が低下します。対照的に、場合、いくつかの非常に小さな特異値があります。反転後、それらは全体的な基準を高める大きな要因になります。pn

[この議論は非常に手がひらい。もっと正確にできることを願っています。]

健全性チェックとして、特異値の順序を入れ替えるとS = diag(flipud(diag(S)));、予測されるMSEは2番目と3番目のパネルのどこでも超えています。1

figure('Position', [100 100 1000 300])
ps = [10, 100, 1000];

for pnum = 1:length(ps)
    rng(42)
    n = 80;
    p = ps(pnum);
    rho = .2;
    y = randn(n,1);
    X = repmat(y, [1 p])*rho + randn(n,p)*sqrt(1-rho^2);

    lambdas = exp(-10:.1:20);
    press = zeros(size(lambdas));
    [U,S,V] = svd(X, 'econ');
    % S = diag(flipud(diag(S)));   % sanity check

    for i = 1:length(lambdas)
        H = U * diag(diag(S).^2./(diag(S).^2 + lambdas(i))) * U';
        e = y - H*y;
        press(i) = sum((e ./ (1-diag(H))).^2);
    end

    subplot(1, length(ps), pnum)
    plot(log(lambdas), press/sum(y.^2))
    hold on
    title(['p = ' num2str(p)])
    plot(xlim, [1 1], 'k--')

    if p > n
        Ginv = U * diag(diag(S).^-2) * U';
        press0 = sum((Ginv*y ./ diag(Ginv)).^2);
        plot(log(lambdas(1)), press0/sum(y.^2), 'ko', 'MarkerFaceColor', [0,0,0]);

        press0approx = sum((diag(diag(S).^-2/mean(diag(S).^-2)) * U' * y).^2);
        plot(log(lambdas(1)), press0approx/sum(y.^2), 'ro');
    end
end

パートII。正則化の形式として純粋なノイズ予測子を追加する

@ Jonny、@ Benoit、@ Paul、@ Dikranなどによって、予測子の数を増やすと最小ノルムOLSソリューションが縮小するという適切な議論が行われました。実際、と、新しい予測子は最小ノルム解のノルムのみを減少させることができます。そのため、予測変数を追加するとノルムが押し下げられます。これは、リッジ回帰がノルムにペナルティを課す方法に似ています。p>n

これは正則化戦略として使用できますか?とから始めて、正則化の試みとして純粋なノイズ予測子を追加し続けます。LOOCVを実行し、リッジのLOOCVと比較します(上記のように計算されます)。予測子でを取得した後、元の予測子のみに関心があるため、で「切り捨て」ていることに注意してください。n=80p=40qβ^p+qp

ここに画像の説明を入力してください

できます!!!

実際、ベータ版を「切り捨てる」必要はありません。完全なベータ版と完全な予測子を使用しても、良好なパフォーマンスを得ることができます(右のサブプロットの破線)。これは問題の私の実際のデータを模倣していると思います:本当に予測している予測子はわずかで、それらのほとんどは純粋なノイズであり、正則化として機能します。このレジームでは、追加のリッジの正則化はまったく役に立ちません。p+qy

rng(42)
n = 80;
p = 40;
rho = .2;
y = randn(n,1);
X = repmat(y, [1 p])*rho + randn(n,p)*sqrt(1-rho^2);

lambdas = exp(-10:.1:20);
press = zeros(size(lambdas));
[U,S,V] = svd(X, 'econ');

for i = 1:length(lambdas)
    H = U * diag(diag(S).^2./(diag(S).^2 + lambdas(i))) * U';
    e = y - H*y;
    press(i) = sum((e ./ (1-diag(H))).^2);
end

figure('Position', [100 100 1000 300])
subplot(121)
plot(log(lambdas), press/sum(y.^2))
hold on
xlabel('Ridge penalty (log)')
plot(xlim, [1 1], 'k--')
title('Ridge regression (n=80, p=40)')
ylim([0 2])

ps = [0 20 40 60 80 100 200 300 400 500 1000];
error = zeros(n, length(ps));
error_trunc = zeros(n, length(ps));
for fold = 1:n
    indtrain = setdiff(1:n, fold);
    for pi = 1:length(ps)
        XX = [X randn(n,ps(pi))];
        if size(XX,2) < size(XX,1)
            beta = XX(indtrain,:) \ y(indtrain,:);
        else
            beta = pinv(XX(indtrain,:)) * y(indtrain,:);
        end
        error(fold, pi) = y(fold) - XX(fold,:) * beta;
        error_trunc(fold, pi) = y(fold) - XX(fold,1:size(X,2)) * beta(1:size(X,2));
    end
end

subplot(122)
hold on
plot(ps, sum(error.^2)/sum(y.^2), 'k.--')
plot(ps, sum(error_trunc.^2)/sum(y.^2), '.-')
legend({'Entire beta', 'Truncated beta'}, 'AutoUpdate','off')
legend boxoff
xlabel('Number of extra predictors')
title('Extra pure noise predictors')
plot(xlim, [1 1], 'k--')
ylim([0 2])

@MartijnWeteringsこの実験では、n = 80とp = 40から始めます。予測子の総数(p + q)がn = 80に近づくと、問題は悪条件になり、OLSソリューションは大幅にオーバーフィットします。q = 40付近でエラーに大きなピークがあります。p + q> nになると、「最小ノルム」制約が開始され、エラーが減少し始めますが、q = 0であった場所に戻るまでに時間がかかります。q = 70付近、つまりp + q = 130で発生します。その後、エラーはさらに減少し、プロットのこの部分はリッジ回帰プロットに似ています。理にかなっていますか?
アメーバは、モニカを復活させる

@MartijnWeterings最初のコメント:私たちは同じページにいます。2番目のコメント:私の質問では、ベータ版を切り捨てていません、そうです。しかし、実際にシミュレーションでベータ版を切り捨てない場合(のy(fold) - XX(fold,:) * beta代わりに使用XX(fold,1:size(X,2)) * beta(1:size(X,2)))、結果はあまり変わりません。これを回答に追加する必要があると思います。私の元のデータはこのような行動を示していると思います。
アメーバは、

(1/2):私はまだすべてのコメントとコードを理解するために取り組んでいますが、私には考えがあります:私たちが観察しているこの現象とリッジ回帰とランダム効果の関係はありますか?
ライアンシモンズ

(2/2):ここでのRandelの答え(stats.stackexchange.com/questions/122062/…)により、ランダム効果とリッジ回帰の間で同等の推定値が表示されます。ここで、ラムダは残差と分散の比に等しいランダム効果。ここで、Benoit Sanchezの答えによれば、リッジ回帰は、それぞれがラムダの関数とパラメーターの数に等しい分散を持つ任意の数の偽独立予測子を追加することと同等であることがわかります。概念的な関係があるように思えます。
ライアンシモンズ

@amoebaそれは間違いだった。スケーリングされたベクトルyを行列Xに追加すると、リッジ回帰またはノイズベクトルとは多少異なりますが、正規化されます。しかし、すべての変数をyベクトルとわずかに負の相関(または正ではない)にするために、各xから少しを引くとどうなるのか不思議に思います。これは、いくつかの「負の」正則化を実行するためです。これは、1000個のベクトルの正則化を「元に戻す」ためです(ピーク/最適化正則化係数がほぼ範囲外になっているので、ある時点でそれが大きくなりすぎる可能性があります)。y
セクストゥスエンピリカス

15

これは、これが発生する人為的な状況です。各予測変数が、大量のガウスノイズが適用されたターゲット変数のコピーであるとします。最適なモデルは、すべての予測変数の平均です。

library(glmnet)
set.seed(1846)
noise <- 10
N <- 80
num.vars <- 100
target <- runif(N,-1,1)
training.data <- matrix(nrow = N, ncol = num.vars)
for(i in 1:num.vars){
  training.data[,i] <- target + rnorm(N,0,noise)
}
plot(cv.glmnet(training.data, target, alpha = 0,
               lambda = exp(seq(-10, 10, by = 0.1))))

100個の予測子を持つさまざまなラムダのMSE

100個の変数は「通常の」方法で動作します。ラムダの正の値は、サンプルエラーを最小限に抑えます。

ただし、上記のコードのnum.varsを1000に増やしてください。これが新しいMSEパスです。(私はlog(Lambda)= -100に拡張して、納得させました。

1000個の予測子を持つさまざまなラムダのMSE

私は何が起こっていると思う

低い正則化で多くのパラメーターをフィッティングする場合、係数は真の値の周りに高い分散でランダムに分布します。

予測子の数が非常に多くなると、「平均誤差」はゼロに近づく傾向があり、係数を0に偏らせるよりも、係数を可能な限り低下させてすべてを合計する方が適切です。

真の予測がすべての予測変数の平均であるという状況がこれが発生する唯一の時間ではないと確信していますが、ここで最も必要な条件を特定する方法はわかりません。

編集:

ソリューションが最小ノルムOLSソリューションに収束しているため、非常に低いラムダの「フラット」動作が常に発生します。同様に、非常に高いラムダでは、解が0に収束するため、曲線は平坦になります。これら2つの解のうちの1つが最適である場合、最小値はありません。

この場合、最小ノルムOLSソリューションが(比較的)優れているのはなぜですか?私は非常に直感に反することがわかった次の行動に関連していると思いますが、熟考するとかなり理にかなっています。

max.beta.random <- function(num.vars){
  num.vars <- round(num.vars)
  set.seed(1846)
  noise <- 10
  N <- 80
  target <- runif(N,-1,1)
  training.data <- matrix(nrow = N, ncol = num.vars)

  for(i in 1:num.vars){
    training.data[,i] <- rnorm(N,0,noise)
  }
  udv <- svd(training.data)

  U <- udv$u
  S <- diag(udv$d)
  V <- udv$v

  beta.hat <- V %*% solve(S) %*% t(U) %*% target

  max(abs(beta.hat))
}


curve(Vectorize(max.beta.random)(x), from = 10, to = 1000, n = 50,
      xlab = "Number of Predictors", y = "Max Magnitude of Coefficients")

abline(v = 80)

予測子の数が増加するときの係数の最大強度のプロット

ランダムに生成された応答とは関係のない予測子では、pが増加すると係数は大きくなりますが、pがNよりはるかに大きくなると、ゼロに向かって縮小します。これは私の例でも起こります。非常に大まかに言って、これらの問題に対する非正規化ソリューションは、すでに非常に小さいため、縮小する必要はありません!

これは些細な理由で起こります。は、の列の線形結合として正確に表現できます。は、係数の最小ノルムベクトルです。列が追加されるにつれて、のノルムは減少するか、一定のままでなければなりません。可能な線形結合は、前の係数を同じに保ち、新しい係数を設定するためです。yXβ^β^0


1
(+1)。そのため、この現象は予測変数が相関しているときに発生するようです。正式には、エラーカーブに正の最小値がないことも、0での制限が大きくないことも意味しません。これは、曲線が平坦になる傾向があり、正則化が動作を停止するために必要な小ささのしきい値が、大きな 0に向かう傾向があることを意味します。ここで、このしきい値は計算限界を超えていますが、Firebugの答えは、それが常に存在する可能性があることを示唆しています。λλp
ブノワサンチェス

1
glmnet更新になぜ必要なのですか?最小ノルムOLSソリューションのみが必要な場合、直接式があり(質問の2番目の式を参照)、 SVDを計算すると、この式は単純に。このソリューションを計算する関数もおそらくRにありますが、私はRを本当に知りません:)X=USVβ^=VS1Uy
amoebaは、

2
それについてもう少し考えると、まったく驚くことではありません。は、のベクトルの線形結合として正確に表現できます。は、最小のノルムを持つ係数のベクトルです。ベクトルを追加するとき、古い係数を同じに保ち、新しい係数をゼロに設定できるため、のノルムは減少するか、同じサイズのままでなければなりません。yXβ^β^
ジョニーローモンド

3
Jonnyの例は、すでに分析されているため良い例です。James-Steinestimatorを参照してください。次元3以上の固定ベクトルの平均を推定する場合、ゼロにバイアスをかけることにより、単純な平均化をいつでも改善できます。これは、リッジ回帰の多かれ少なかれです。おそらく、このケースでは改善が見られないほど小さいのではないでしょうか?θ
ポール

3
リッジ回帰は、余分な「偽」サンプルをデータセットに追加することと同じであり、各サンプルは1つの特徴に値を持ち、他の部分はゼロで、対応するすべての応答はゼロです。(この形式でRRコスト関数を書き換えることは簡単です。)同様の効果を持つ追加の機能(純粋なノイズなど)を追加する方法があるかどうか疑問に思っています。もちろん、追加の機能を追加すると、次元が増加しますが、その値は「元の」予測子でしか見ることができません。@ポールpλβ^
アメーバは、モニカを復活させる

6

そこでmlr、R の専用パッケージを使用してネストされたクロス検証を実行し、実際にモデリングアプローチから何が得られるかを確認することにしました。

コード(通常のノートブックで実行するには数分かかります)

library(mlr)
daf = read.csv("https://pastebin.com/raw/p1cCCYBR", sep = " ", header = FALSE)

tsk = list(
  tsk1110 = makeRegrTask(id = "tsk1110", data = daf, target = colnames(daf)[1]),
  tsk500 = makeRegrTask(id = "tsk500", data = daf[, c(1,sample(ncol(daf)-1, 500)+1)], target = colnames(daf)[1]),
  tsk100 = makeRegrTask(id = "tsk100", data = daf[, c(1,sample(ncol(daf)-1, 100)+1)], target = colnames(daf)[1]),
  tsk50 = makeRegrTask(id = "tsk50", data = daf[, c(1,sample(ncol(daf)-1, 50)+1)], target = colnames(daf)[1]),
  tsk10 = makeRegrTask(id = "tsk10", data = daf[, c(1,sample(ncol(daf)-1, 10)+1)], target = colnames(daf)[1])
)

rdesc = makeResampleDesc("CV", iters = 10)
msrs = list(mse, rsq)
configureMlr(on.par.without.desc = "quiet")
bm3 = benchmark(learners = list(
    makeLearner("regr.cvglmnet", alpha = 0, lambda = c(0, exp(seq(-10, 10, length.out = 150))),
    makeLearner("regr.glmnet", alpha = 0, lambda = c(0, exp(seq(-10, 10, length.out = 150))), s = 151)
    ), tasks = tsk, resamplings = rdesc, measures = msrs)

結果

getBMRAggrPerformances(bm3, as.df = TRUE)
#   task.id    learner.id mse.test.mean rsq.test.mean
#1    tsk10 regr.cvglmnet     1.0308055  -0.224534550
#2    tsk10   regr.glmnet     1.3685799  -0.669473387
#3   tsk100 regr.cvglmnet     0.7996823   0.031731316
#4   tsk100   regr.glmnet     1.3092522  -0.656879104
#5  tsk1110 regr.cvglmnet     0.8236786   0.009315037
#6  tsk1110   regr.glmnet     0.6866745   0.117540454
#7    tsk50 regr.cvglmnet     1.0348319  -0.188568886
#8    tsk50   regr.glmnet     2.5468091  -2.423461744
#9   tsk500 regr.cvglmnet     0.7210185   0.173851634
#10  tsk500   regr.glmnet     0.6171841   0.296530437

基本的にはタスク間で同じです。

では、最適なラムダはどうでしょうか?

sapply(lapply(getBMRModels(bm3, task.ids = "tsk1110")[[1]][[1]], "[[", 2), "[[", "lambda.min")
# [1] 4.539993e-05 4.539993e-05 2.442908e-01 1.398738e+00 4.539993e-05
# [6] 0.000000e+00 4.539993e-05 3.195187e-01 2.793841e-01 4.539993e-05

ラムダがすでに変換されていることに注意してください。最小のラムダ選択したフォールドもあり。λ=0

私はもう少しいじってみましたglmnetが、どちらも最小限のラムダが選択されていませんでした。小切手:

編集:

アメーバによるコメントの後、正則化パスはglmnet推定における重要なステップであることが明らかになり、コードは現在それを反映しています。この方法で、ほとんどの不一致はなくなりました。

cvfit = cv.glmnet(x = x, y = y, alpha = 0, lambda = exp(seq(-10, 10, length.out = 150)))
plot(cvfit)

ここに画像の説明を入力してください

結論

したがって、基本的に、実際に適合度を向上させます編集:しかし、それほどではありません!)。λ>0

それはどのように可能であり、私のデータセットについて何と言っていますか?明白な何かを見逃していますか、それとも本当に直観に反していますか?

データ設定の真の分布は、ゼロより大きい小さな値に近いと思われます。ただし、直感に反するものはありません。λ

編集:ただし、リッジの正規化パスはを呼び出すときに以前のパラメーター推定値を使用しますglmnetが、これは私の専門知識を超えています。lambda分離レベルを本当に低く設定すると、パフォーマンスが低下する可能性があります。

編集:ラムダ選択は、データについて何かを言います。大きいラムダはパフォーマンスを低下させるため、大きいラムダはすべての係数をゼロに向けて縮小するため、モデルに優先的な係数、つまり大きい係数が存在することを意味します。しかしモデルの自由の有効度は、自由見かけ度よりも小さいことを意味し。λ0p

両方がnよりも大きい場合、p = 100とp = 1000の間に質的な違いはありますか?

p=1000常に、少なくとも同じ情報、または超える情報が含まれます。p=100


コメント

ゼロではないラムダに対して最小の最小値を取得しているように見えますが(私はあなたの図を見ています)、曲線はまだ本当に左側で本当に平坦です。したがって、私の主な疑問は、なぜλ→0が顕著にオーバーフィットしないのかということです。ここにはまだ答えがありません。これは一般的な現象だと思いますか?つまり、n≪pのデータの場合、lambda = 0は最適なラムダとほぼ同等のパフォーマンスを発揮しますか?それとも、これらのデータについて特別なものですか?上記のコメントを見ると、多くの人が私にそれが可能であるとさえ信じていなかったことがわかります。

検証のパフォーマンスとテストのパフォーマンスを混同していると思いますが、そのような比較は保証されません。

編集:ただし、lambda正規化パス全体を実行した後に0に設定してもパフォーマンスは低下しないため、正規化パスは何が起こっているのかを理解するために重要です!

また、私はあなたの最後の行をよく理解していません。p = 100のcv.glmnet出力を見てください。形状が大きく異なります。p = 100またはp = 1000の場合、この形状に影響を与えるものは何ですか(左側の漸近線対無漸近線)。

両方の正則化パスを比較しましょう。

fit1000 = glmnet(x, y, alpha = 0, lambda = exp(seq(-10,10, length.out = 1001)))
fit100 = glmnet(x[, sample(1000, 100)], y, alpha = 0, lambda = exp(seq(-10,10, length.out = 1001)))
plot(fit1000, "lambda")

ここに画像の説明を入力してください

x11()
plot(fit100, "lambda")

ここに画像の説明を入力してください

は、両方のプロットの左側に漸近的にOLSリッジの係数が小さくても、増加時に大きな係数を与えることが明らかになります。したがって、基本的に、グラフの左側でオーバーフィットします。これはおそらく、それらの間の動作の違いを説明しています。p=1000λp=100

Ridgeは係数をゼロに縮小しても、ゼロに到達することはないため、がオーバーフィットするのは困難です。これは、モデルの予測力がより多くのコンポーネント間で共有されることを意味します。これにより、ノイズによって運ばれるのではなく、平均値周辺での予測が容易になります。p=1000


+1これらの実験を行ってくれてありがとう!ゼロ以外のラムダの極小値を取得しているように見えますが(図を見ています)、曲線はまだ本当に左側で本当に平坦です。したがって、私の主な疑問は、なぜが顕著にオーバーフィットしないのかということです。ここにはまだ答えがありません。これは一般的な現象だと思いますか?つまり、データの場合、lambda = 0は最適なラムダとほぼ同等のパフォーマンスを発揮しますか?それとも、これらのデータについて特別なものですか?上記のコメントを見ると、多くの人が私にそれが可能であるとさえ信じていなかったことがわかります。λ0np
アメーバは、

また、私はあなたの最後の行をよく理解していません。cv.glmnetp = 100の出力を見てください。形状が大きく異なります。p = 100またはp = 1000の場合、この形状に影響を与えるものは何ですか(左側の漸近線対無漸近線)。
アメーバは、モニカを

場合は知っていますmlr選択lambda.minlambda.1se(中cv.glmnetの用語)?
アメーバは、

@amoeba lambda.minregr.cvglmnetおそらく他のルールを選択できる学習者もいます。
ファイアバグ

ありがとう。正直に言うと、私はあなたの1e-100ベンチマークの出力を理解していません。たとえば、p = 1100の場合、MSE = 1.45になります。ただし、ここでは内部ループにハイパーパラメーターチューニングがないため、基本的に内部CVループはまったく必要ありません。結果は、lambda = 1e-100のネストされていないCVの場合と同じであることを意味します。しかし、最初の図では、MSEが約0.7であることがわかります。私には意味がありません。
アメーバは、

5

(最小限の)OLSがオーバーフィットに失敗するのはどうしてですか?

要するに:

真のモデルの(未知の)パラメーターと相関する実験パラメーターは、最小ノルムOLS適合手順で高い値で推定される可能性が高くなります。それは、それらが「モデル+ノイズ」に適合するのに対し、他のパラメーターは「ノイズ」にのみ適合するためです(したがって、より低い係数のモデルのより大きな部分に適合し、高い値を持つ可能性が高くなります)最小ノルムOLSで)。

この効果により、最小ノルムOLSフィッティング手順でオーバーフィッティングの量が減少します。より多くのパラメータが利用可能な場合、「真のモデル」の大部分が推定に組み込まれる可能性が高くなるため、効果はより顕著になります。

長い部分:(
問題が私にとって完全に明確ではないため、ここに何を置くべきか分かりません。または、答えが質問に対処するためにどの精度が必要かわかりません)

以下は簡単に構築できる例で、問題を示しています。効果はそれほど奇妙ではなく、例は簡単に作成できます。

  • 変数として sin関数(垂直であるため)を取りましたp=200
  • 測定値でランダムモデルを作成しました。 n=50
    • モデルはの変数のみで構成されているため、200個の変数のうち190個が過剰適合を生成する可能性があります。tm=10
    • モデル係数はランダムに決定されます

この例の場合、オーバーフィッティングがいくらかありますが、真のモデルに属するパラメーターの係数はより高い値を持っています。したがって、R ^ 2には正の値が含まれる場合があります。

以下の画像(およびそれを生成するコード)は、過剰適合が制限されていることを示しています。200個のパラメーターの推定モデルに関連するドット。赤い点は、「真のモデル」にも存在するパラメーターに関連しており、より高い値を持っていることがわかります。したがって、ある程度実際のモデルに近づき、R ^ 2が0を超えています。

  • 直交変数(サイン関数)を使用したモデルを使用したことに注意してください。パラメータが相関している場合、それらは比較的非常に高い係数でモデル内で発生し、最小ノルムOLSでよりペナルティが課せられる可能性があります。
  • データを考慮すると、「直交変数」は直交しないことに注意してください。の内積は、空間全体を積分するとゼロになり、サンプルが少数の場合にはゼロになりません。その結果、ノイズがゼロの場合でもオーバーフィッティングが発生します(そして、R ^ 2値はノイズを除いて多くの要因に依存するようです。もちろんとの関係がありますが、変数の数も重要です真のモデルとその数がフィッティングモデルに含まれています)。sin(ax)sin(bx)xxnp

過剰適合の削減の例

library(MASS)

par(mar=c(5.1, 4.1, 9.1, 4.1), xpd=TRUE)

p <- 200       
l <- 24000
n <- 50
tm <- 10

# generate i sinus vectors as possible parameters
t <- c(1:l)
xm <- sapply(c(0:(p-1)), FUN = function(x) sin(x*t/l*2*pi))

# generate random model by selecting only tm parameters
sel <- sample(1:p, tm)
coef <- rnorm(tm, 2, 0.5)

# generate random data xv and yv with n samples
xv <- sample(t, n)
yv <- xm[xv, sel] %*% coef + rnorm(n, 0, 0.1)

# generate model
M <- ginv(t(xm[xv,]) %*% xm[xv,])

Bsol <- M %*% t(xm[xv,]) %*% yv
ysol <- xm[xv,] %*% Bsol

# plotting comparision of model with true model
plot(1:p, Bsol, ylim=c(min(Bsol,coef),max(Bsol,coef)))
points(sel, Bsol[sel], col=1, bg=2, pch=21)
points(sel,coef,pch=3,col=2)

title("comparing overfitted model (circles) with true model (crosses)",line=5)
legend(0,max(coef,Bsol)+0.55,c("all 100 estimated coefficients","the 10 estimated coefficients corresponding to true model","true coefficient values"),pch=c(21,21,3),pt.bg=c(0,2,0),col=c(1,1,2))

リッジ回帰に関連した切り捨てベータ技法

PythonコードをAmoebaからRに変換し、2つのグラフを結合しました。ノイズ変数を追加した最小ノルムOLS推定値ごとに、ベクトルと同じ(およそ) -normのリッジ回帰推定値を一致させます。l2β

  • 切り捨てられたノイズモデルはほとんど同じように見えます(計算が少し遅くなるだけで、多分少し良くないことがあります)。
  • ただし、切り捨てがない場合、効果はそれほど強くありません。
  • パラメーターの追加とリッジのペナルティーとのこの対応は、過適合がない場合の必ずしも最も強力なメカニズムではありません。これは特に、1000p曲線(質問の画像内)でほぼ0.3になり、pが異なる他の曲線は、リッジ回帰パラメーターが何であっても、このレベルに達しません。その実際の場合、追加のパラメーターはリッジパラメーターのシフトと同じではありません(これは、追加のパラメーターがより良い、より完全なモデルを作成するためだと思います)。

  • ノイズパラメーターは、一方で(ノルム回帰と同様に)ノルムを低下させますが、追加のノイズも導入します。ブノワ・サンチェスは、より小さな偏差で多くの多くのノイズパラメータを追加すると、最終的にはリッジ回帰と同じになることを示しています(ノイズパラメータの数が増えると互いに相殺されます)。しかし、同時に、より多くの計算が必要です(ノイズの偏差を増やして、より少ないパラメーターを使用して計算を高速化できるようにすると、差が大きくなります)。

ロー= 0.2 切り捨てられたノイズとリッジ回帰の比較

ロー= 0.4 切り捨てられたノイズとリッジ回帰の比較

Rho = 0.2ノイズパラメーターの分散を2に増加 切り捨てられたノイズとリッジ回帰の比較

コード例

# prepare the data
set.seed(42)
n = 80
p = 40
rho = .2
y = rnorm(n,0,1)
X = matrix(rep(y,p), ncol = p)*rho + rnorm(n*p,0,1)*(1-rho^2)

# range of variables to add
ps = c(0, 5, 10, 15, 20, 40, 45, 50, 55, 60, 70, 80, 100, 125, 150, 175, 200, 300, 400, 500, 1000)
#ps = c(0, 5, 10, 15, 20, 40, 60, 80, 100, 150, 200, 300) #,500,1000)

# variables to store output (the sse)
error   = matrix(0,nrow=n, ncol=length(ps))
error_t = matrix(0,nrow=n, ncol=length(ps))
error_s = matrix(0,nrow=n, ncol=length(ps))

# adding a progression bar
pb <- txtProgressBar(min = 0, max = n, style = 3)

# training set by leaving out measurement 1, repeat n times 
for (fold in 1:n) {
    indtrain = c(1:n)[-fold]

    # ridge regression
    beta_s <- glmnet(X[indtrain,],y[indtrain],alpha=0,lambda = 10^c(seq(-4,2,by=0.01)))$beta
    # calculate l2-norm to compare with adding variables
    l2_bs <- colSums(beta_s^2)

    for (pi in 1:length(ps)) {
        XX = cbind(X, matrix(rnorm(n*ps[pi],0,1), nrow=80))
        XXt = XX[indtrain,]

        if (p+ps[pi] < n) {
            beta = solve(t(XXt) %*% (XXt)) %*% t(XXt) %*% y[indtrain]
        }
        else {
            beta = ginv(t(XXt) %*% (XXt)) %*% t(XXt) %*% y[indtrain]
        }

        # pickout comparable ridge regression with the same l2 norm      
        l2_b <- sum(beta[1:p]^2)
        beta_shrink <- beta_s[,which.min((l2_b-l2_bs)^2)] 

        # compute errors
        error[fold, pi] = y[fold] - XX[fold,1:p] %*% beta[1:p]
        error_t[fold, pi] = y[fold] - XX[fold,] %*% beta[]
        error_s[fold, pi] = y[fold] - XX[fold,1:p] %*% beta_shrink[]
    }
    setTxtProgressBar(pb, fold) # update progression bar
}

# plotting
plot(ps,colSums(error^2)/sum(y^2) , 
     ylim = c(0,2),
     xlab ="Number of extra predictors",
     ylab ="relative sum of squared error")
lines(ps,colSums(error^2)/sum(y^2))
points(ps,colSums(error_t^2)/sum(y^2),col=2)
lines(ps,colSums(error_t^2)/sum(y^2),col=2)
points(ps,colSums(error_s^2)/sum(y^2),col=4)
lines(ps,colSums(error_s^2)/sum(y^2),col=4)

title('Extra pure noise predictors')

legend(200,2,c("complete model with p + extra predictors",
               "truncated model with p + extra predictors",
               "ridge regression with similar l2-norm",
               "idealized model uniform beta with 1/p/rho"),
       pch=c(1,1,1,NA), col=c(2,1,4,1),lt=c(1,1,1,2))

# idealized model (if we put all beta to 1/rho/p we should theoretically have a reasonable good model)
error_op <- rep(0,n)
for (fold in 1:n) {
  beta = rep(1/rho/p,p)
    error_op[fold] = y[fold] - X[fold,] %*% beta
}
id <- sum(error_op^2)/sum(y^2)
lines(range(ps),rep(id,2),lty=2)

1
(+1)ありがとう。あなたの答えの冒頭にある直感的な議論は理にかなっていると思います。
アメーバは、

1

あなたが線形演算子に精通しているなら、現象を理解するための最も直接的な道として私の答えが好きかもしれません:なぜノルム回帰は完全に失敗しないのですか?理由は、あなたの問題()が不適切な逆問題であり、擬似逆問題がそれを解決する方法の1つだからです。ただし、正規化は改善されています。np

この論文はおそらく、最もコンパクトで関連性の高い説明です。LorenzoRosasco et al、Learning、Regularization and Ill-Posed Inverse Problem。彼らは、式3を参照して、学習としてあなた回帰問題を設定し、パラメータの数が観測数超える場合: ヒルベルト空間との線形演算子である -ノイズの多いデータを。

Ax=gδ,
Agδ

明らかに、これは不適切な逆問題です。したがって、SVDまたはMoore-Penroseの逆関数を使用して解決できます。これにより、実際に最小の標準解が得られます。したがって、すべきではない、あなたの少なくともノルム解が完全に失敗していないことは驚くべきこと。

ただし、この論文に従うと、リッジ回帰が上記の改善になることがわかります。Moore-Penroseのソリューションは必ずしも制限されていないため、改善は実際には推定器のより良い動作です。

更新

不適切な問題が過剰適合につながることを明確にしていないことに気付きました。これは、バンガJRの論文GáborAからの引用です。生体系の動的モデルにおける堅牢で効率的なパラメータ推定。BMC Systems Biology。2015; 9:74。doi:10.1186 / s12918-015-0219-2:

これらの問題の不適切な条件は、通常、(i)多数のパラメーターを持つモデル(過剰パラメーター化)、(ii)実験データの不足、および(iii)重大な測定誤差[19、40]から発生します。結果として、このような運動モデルの過剰適合、つまり、利用可能なデータに合理的に適合しているが一般化の能力が低い(予測値が低い)較正モデルが得られることがよくあります。

したがって、私の議論は次のように述べることができます。

  • 不適切な問題が過剰適合につながる
  • (n <p)ケースは非常に不適切な逆問題です
  • 質問でと呼ぶMoore-Penroseの擬似逆関数(またはSVDのような他のツール)は、不適切な問題を解決します。X+
  • したがって、少なくともある程度は過剰適合を処理します。通常のOLSとは異なり、完全に失敗しないことは驚くべきことではありません。

繰り返しますが、正則化はさらに堅牢なソリューションです。


1
(+1)感謝しますが、この論文がどのように関連するのかよくわかりません。明日、もっと詳しく見ていきます。最小ノルムOLSソリューションはオーバーフィットしない、またはその最小ノルム要件は正則化と見なすことができると、彼らは正確にどこで言いますか?
アメーバは、モニカを復活させる

1
論文を読んだときに議論しましょう。彼らは、疑似逆が正則化であるとは言いません。彼らが言うことは、それが悪い問題の解決策だということです。私が言っているのは、過剰適合は問題の不適切な状態によるものであるため、後者に対処することで、正規化ではなく前者を処理します。
アクサカル

1
不可解なことは、最小ノルムソリューションがある程度過剰適合を改善しないということではなく、正則化を追加してもそれ以上改善しないということです。また、フィーチャの数が増えるにつれて最小ノルムソリューションがより効果的である理由。私の直感では、より多くのパラメーターを持つ問題では、より少ない数ではなく、より多くの正則化(他のすべてのものが等しい)が必要です。これは非常に興味深い問題であり、たとえば、正規化されていないニューラルネットワークでさえ、期待するほど過剰適合しない理由を説明するのに役立つかもしれません。
ディクランMarsupial

1
@Dikran実際には、他の形式または正則化によってパフォーマンスを改善できます。たとえば、主成分回帰またはエラスティックネットを使用して(最小ノルムOLSと比較して)パフォーマンスを改善できます。リッジの正則化が役に立たなくなるというだけです。ニューラルネットワークへの類推は、私の心を越えていない魅力的な思考です。私は何でしたけれどもについて最近考えて、なぜバッチ正規のようなトリッキーな深い学習物事は本当に仕事も不思議の誰もが統計101からでも線形リッジ回帰はとても不可解なことができることを考えると、理解していないということです:-)
アメーバは回復モニカ言う

2
これは目前の主な質問ではありませんが、それ以外の点では優れた一連の質問、回答、コメントが、相互検証をもたらすことによって回避されたと思います。この説明では、データのシミュレーションに使用されたから母集団線形予測子を計算し、線形予測子の推定器のMSEを計算する方がはるかに簡単です。また、場合、リッジ回帰(R パッケージ関数)に最適な修正AICが見つからない場合があります。しかし、真の線形予測子をゴールドスタンダードとして使用して、再実行する必要があります。βn<<prmsols
フランクハレル
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.