どのようにして最も簡単にオーバーフィットできますか?


7

これは奇妙な質問です。

私は初心者で、さまざまな分類子オプションとその機能について学びたいと思っています。だから私は質問をしています:

各観測をn3バケットに分類できるn1次元とn2観測のデータセットが与えられた場合、どのアルゴリズムが(理想的には1回のトレーニング反復で)データセット内のすべての観測を完全に分類するモデル(分類境界)を最も効率的に生成します(完全にオーバーフィット)?

言い換えれば、どのようにして最も簡単にオーバーフィットできますか?

(「オーバーフィッティングをしない」について私に教えないでください。これは理論上の教育目的のためだけです。)

「そうですね、次元の数が観測の数よりも多い場合は、Xアルゴリズムを使用して境界を描画します。それ以外の場合はYアルゴリズムを使用します。」

また、答えは「滑らかな境界線を描くことはできますが、分類されたすべての異なる観測値の間に直線を描くよりも計算コストがかかる」という疑いもあります。

しかし、それは私の直感が私を導く限りです。手伝ってくれますか?

バイナリ分類を使用して2Dで話していると思うことの手描きの例があります。

基本的に、違いを分けるだけですよね?これはn次元でどのアルゴリズムを効率的に実行しますか?

基本的には違いを分割するだけですよね? これはどのアルゴリズムで効率的に行われますか?


5
knn ?k=1
shimao

@shimaoうまくいくと思いませんか?ええ、なぜかわかりません。どうもありがとうございました!
合法スタック2019

@shimaoそれは境界をエンコードする最も効率的な方法ですか?おそらく正しいですか?データが完全にランダムであるかどうかはわからないので、データ自体をKNNアルゴリズムでエンコードされたモデルとして使用するのが、おそらく一般的にできる最善の方法です。正しい?
合法スタック2019

2
@shimao:コメントを回答として投稿しますか(おそらくもう少し詳しく)?
Stephan Kolassa、

タイトルはコンテンツについてあまり情報を提供しません。回答を求めてこのページにアクセスするユーザーの大多数は、実際の質問が期待したものとは大きく異なることに気づくでしょう。改訂してください。
OrangeSherbet

回答:


7

すべての観測値が一意である限り、Kが1に設定され、任意の有効な距離メトリックを持つK最近傍は、トレーニングセットに完全に適合する分類子を提供します(トレーニングセット内のすべての点の最も近い近傍は自明であるため) 、それ自体)。また、トレーニングがまったく必要ないため、おそらく最も効率的です。

それは境界をエンコードする最も効率的な方法ですか?おそらく正しいですか?データが完全にランダムであるかどうかはわからないので、データ自体をKNNアルゴリズムでエンコードされたモデルとして使用するのが、おそらく一般的にできる最善の方法です。正しい?

これは最も時間効率が良いですが、必ずしも最もスペース効率が良いとは限りません。


スペース効率が必要な場合は、ハッシュコードを保管してください。また、N-1バケットのみを分析する必要があることにも注意してください。
Mooing Duck

1
境界を取得する場合は、ボロノイテッセレーションを計算できます。
Davidmh

5

できません。

任意のデータと任意の次元で完全にフィットしたい場合は、少なくとも一般的には、必要な程度まで。

例として、予測子ディメンション(つまり、何もない)と、観測値がバケットに分類されているとします。2つの観測値は、「チョコレート」と「バニラ」という2つの異なるバケットに分類されます。n1=0n2=2n3=2

予測子がないため、期間を完全に分類することはできません。


観測ごとに異なる値をとる予測子少なくとも1つある場合、数値予測子に任意の高さの多項式次数を使用するだけで、実際に任意にひどく過剰適合させることができます(予測子が各観測で異なる値を持つカテゴリカルである場合、変換する必要さえあります)。ツールまたはモデルは、ほとんど二次的なものです。はい、オーバーフィットするのは簡単です。

ここに例があります。10個の観測値は、単一の数値予測子から完全に独立しています。ますます複雑になるロジスティック回帰または予測子の検出力を当てはめ、0.5のしきい値を使用して分類します(これは適切な方法ではありません)。正しくフィットした点は緑でマークされ、正しくフィットしなかった点は赤でマークされます。

過適合

Rコード:

nn <- 10
set.seed(2)

predictor <- runif(nn)
outcome <- runif(nn)>0.5

plot(predictor,outcome,pch=19,yaxt="n",ylim=c(-0.1,1.6))
axis(2,c(0,1),c("FALSE","TRUE"))

orders <- c(1,2,3,5,7,9)
xx <- seq(min(predictor),max(predictor),0.01)

par(mfrow=c(3,2))
for ( kk in seq_along(orders) ) {
    plot(predictor,outcome,pch=19,yaxt="n",ylim=c(-0.2,1.2),main=paste("Order:",orders[kk]))
    axis(2,c(0,1),c("FALSE","TRUE"))

    model <- glm(outcome~poly(predictor,orders[kk]),family="binomial")
    fits_obs <- predict(model,type="response")
    fits <- predict(model,newdata=data.frame(predictor=xx),type="response")

    lines(xx,fits)
    correct <- (fits_obs>0.5 & outcome) | ( fits_obs<0.5 & !outcome)
    points(predictor[correct],outcome[correct],cex=1.4,col="green",pch="o")
    points(predictor[!correct],outcome[!correct],cex=1.4,col="red",pch="o")
}
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.