機械学習の精度評価

MikuHatsune2013-01-26

機械学習を用いてスリーサイズ推定問題を解いていたのだが、これを見た友人が

どれくらいの精度で予測できるのでしょうか?

 
という至極まっとうな質問をしてきたので考える。
声優統計第一号では
 

評価指標はMSE(予測値と実際の値と二乗和をデータ数で割ったもの)であり、これが低ければ低いほどモデルの精度が良い。また、評価には10-fold Cross-Validationを行い、MSEの平均値を用いた。
学習用データ396件を10分割(これを便宜上ブロックと呼ぶ)し、ある1ブロックを精度確認用として取り除き、残り9ブロックでモデルを構築し、取り除いた1ブロックで予測誤差を計算する、という作業を10回行い、その誤差の平均値を取った。

 
とのことである。交差検証はよく使うと思う。
回帰したモデルのMSEはここによくまとまっている
MSEは単位が自乗なので、平方をとれば単位がそろう。\sqrt{MSE}を誤差と言っている。
たぶんこれはSDに相当するものである。
データ数が6の倍数だったので、6-foldでやることにしよう。
 

data0 <- read.csv("imasPCA.csv", header=TRUE)
data2 <- cbind(data0$B, data0$W, data0$H, data0$age, data0$height, data0$weight)

ng <- 6 # n-fold
g0 <- matrix(sample(1:nrow(data2)), nr=ng) #検証用のグループ
CVm <- matrix(0, ng, 3)
for(ng0 in seq(ng)){
	for(i in seq(3)){
		glmnet1 <- glmnet(data2[-g0[ng0, ], 4:ncol(data1)], data2[-g0[ng0, ], i])
		cv.glmnet1 <- cv.glmnet(data2[-g0[ng0, ], 4:ncol(data1)], data2[-g0[ng0, ], i])
		prd1<- predict(glmnet1, data1[g0[ng0, ], 4:ncol(data1)], s=cv.glmnet1$lambda.min)
		
		#plot(data1[g0[ng0, ], i], prd1)
		CVm[ng0, i] <- sqrt(mean((data1[g0[ng0, ], i]-prd1)^2))
	}
}
colMeans(CVm)
[1] 3.520290 1.852279 2.886381

バスト・ウエスト・ヒップがそれぞれ3.52cm, 1.85cm, 2.89cmの誤差で推定できそう。