線形予測の誤差の原因と比較して、分類予測の誤差の原因を見てみましょう。分類すると、2つのエラーの原因があります。
- 間違ったビンに分類することによるエラー
- ビンの中央値と目標値(「ゴールドの場所」)の違いによるエラー
データのノイズが少ない場合、通常は正しいビンに分類します。ビンも多数ある場合は、2番目のエラーの原因は少なくなります。逆に、あなたは高ノイズのデータを持っている場合は、多くの場合、間違ったビンに誤分類かもしれないが、これは全体の誤差を支配かもしれない-エラーの第2のソースが小さいので、あなたは、多くの小さなビンを持っている場合でも場合、あなたは正しく分類します。また、ビンが少ない場合は、正しく分類する頻度が高くなりますが、ビン内のエラーは大きくなります。
最後に、それはおそらくノイズとビンサイズの間の相互作用に帰着します。
これは、200回のシミュレーションで実行した小さなおもちゃの例です。ノイズと2つのビンのみの単純な線形関係:
さて、これを低ノイズまたは高ノイズで実行してみましょう。(上記のトレーニングセットには高いノイズがありました。)いずれの場合も、線形モデルと分類モデルからMSEを記録します。
nn.sample <- 100
stdev <- 1
nn.runs <- 200
results <- matrix(NA,nrow=nn.runs,ncol=2,dimnames=list(NULL,c("MSE.OLS","MSE.Classification")))
for ( ii in 1:nn.runs ) {
set.seed(ii)
xx.train <- runif(nn.sample,-1,1)
yy.train <- xx.train+rnorm(nn.sample,0,stdev)
discrete.train <- yy.train>0
bin.medians <- structure(by(yy.train,discrete.train,median),.Names=c("FALSE","TRUE"))
# plot(xx.train,yy.train,pch=19,col=discrete.train+1,main="Training")
model.ols <- lm(yy.train~xx.train)
model.log <- glm(discrete.train~xx.train,"binomial")
xx.test <- runif(nn.sample,-1,1)
yy.test <- xx.test+rnorm(nn.sample,0,0.1)
results[ii,1] <- mean((yy.test-predict(model.ols,newdata=data.frame(xx.test)))^2)
results[ii,2] <- mean((yy.test-bin.medians[as.character(predict(model.log,newdata=data.frame(xx.test))>0)])^2)
}
plot(results,xlim=range(results),ylim=range(results),main=paste("Standard Deviation of Noise:",stdev))
abline(a=0,b=1)
colMeans(results)
t.test(x=results[,1],y=results[,2],paired=TRUE)
見てわかるように、この例では、分類によって精度が向上するかどうかがノイズレベルにまで及びます。
シミュレーションデータを使用したり、ビンサイズを変えたりして、少し遊んでみてください。
最後に、さまざまなビンサイズを試し、パフォーマンスが最も良いものを維持している場合、線形モデルよりもパフォーマンスが優れていることに驚かないでください。結局のところ、本質的に自由度を追加しているので、注意しないと(相互検証!)、ビンが過剰に適合してしまうことになります。