R語言中回歸和分類模型選擇的性能指標(biāo)
原文鏈接:http://tecdat.cn/?p=11334
有多種性能指標(biāo)來描述機(jī)器學(xué)習(xí)模型的質(zhì)量。但是,問題是,對于哪個問題正確的方法是什么?在這里,我討論了選擇回歸模型和分類模型時最重要的性能指標(biāo)。請注意,此處介紹的性能指標(biāo)不應(yīng)用于特征選擇,因為它們沒有考慮模型的復(fù)雜性。
回歸的績效衡量
對于基于相同函數(shù)集的模型,RMSE和R2 通常用于模型選擇。
均方誤差
均方誤差由比較預(yù)測y ^ y ^與觀察到的結(jié)果yy所得的殘差平方和確定:
?
由于MSE是基于殘差平方的,因此它取決于結(jié)果平方 。因此,MSE的根 通常用于報告模型擬合:
?
均方誤差的一個缺點是它不是很容易解釋,因為MSE取決于預(yù)測任務(wù),因此無法在不同任務(wù)之間進(jìn)行比較。例如,假設(shè)一個預(yù)測任務(wù)與估計卡車的重量有關(guān),而另一項與估計蘋果的重量有關(guān)。然后,在第一個任務(wù)中,好的模型可能具有100 kg的RMSE,而在第二個任務(wù)中,好的模型可能具有0.5 kg的RMSE。因此,雖然RMSE可用于模型選擇,但很少報告,而使用R2R2。
皮爾遜相關(guān)系數(shù)
由于確定系數(shù)可以用皮爾遜相關(guān)系數(shù)來解釋,因此我們將首先介紹該數(shù)量。令Y ^ Y ^表示模型估計,而YY表示觀察到的結(jié)果。然后,相關(guān)系數(shù)定義為
?
其中Cov(?,?)∈RCov(?,?)∈R是協(xié)方差,而σσ是標(biāo)準(zhǔn)偏差。協(xié)方差定義為
?
其中,μμ表示平均值。在離散設(shè)置中,可以將其計算為
?
這意味著,如果預(yù)測和結(jié)果與平均值的偏差相似,則它們的協(xié)方差將為正;如果與平均值具有相對的偏差,則它們之間的協(xié)方差將為負(fù)。
標(biāo)準(zhǔn)偏差定義為
?
在離散設(shè)置下,可以計算為
請注意,R函數(shù)??sd
?計算總體標(biāo)準(zhǔn)差,該標(biāo)準(zhǔn)差用于獲得無偏估計量。如果分布較寬(均值附近的寬分布),則σσ高;如果分布較窄(均值周圍的較小分布),則σσ小。
關(guān)聯(lián) :協(xié)方差和標(biāo)準(zhǔn)差
為了更好地理解協(xié)方差,我們創(chuàng)建了一個繪制測量值與均值偏差的函數(shù):
plot.mean.deviation <- function(y, y.hat, label) {
means <- c(mean(y), mean(y.hat))
df <- data.frame("N" = c(seq_along(y), seq_along(y)),
"Deviation" = c(y.deviation, y.hat.deviation),
"Variable" = c(rep("Y", length(y)),
rep("Y_Hat", length(y.hat))))
ggplot() +
geom_segment(size = 2, data = segment.df,
aes(x = N, xend = N, y = Y, yend = Yend, color = Contribution)) ?+
geom_point(data = df, alpha = 0.8, size = 2,
aes(x = N, y = Deviation, shape = Variable)) +
xlab("Measurement i of N") + ylab("Deviation from mean value")
}
然后,我們生成代表三種協(xié)方差的數(shù)據(jù):正協(xié)方差,負(fù)協(xié)方差和無協(xié)方差:
# covariance
set.seed(1501)
df.low <- data.frame(Y = y, Y_Hat = y.hat)
p1 <- plot.mean.deviation(y, y.hat, label = "Positive Covariance")
# negative covariance: contrasting spread around mean
y.hat <- y - 2 * (y - y.mean) + noise
p2 <- plot.mean.deviation(y, y.hat, "Negative Covariance")
# no covariance
y.hat <- runif(N, -0.1, 0.1)
grid.arrange(p1, p2, p3, nrow = 3)
?
?
注意離群值(與均值的高偏差)對協(xié)方差的影響大于與均值接近的值。此外,請注意,協(xié)方差接近0表示變量之間在任何方向上似乎都沒有關(guān)聯(lián)(即各個貢獻(xiàn)項被抵消了)。
由于協(xié)方差取決于數(shù)據(jù)的散布,因此具有高標(biāo)準(zhǔn)偏差的兩個變量之間的絕對協(xié)方差通常高于具有低方差的變量之間的絕對協(xié)方差。讓我們可視化此屬性:
plot.mean.deviation(y, y.hat, label = "Positive Covariance")
?
df.high <- data.frame(Y = y, Y_Hat = y.hat)
因此,協(xié)方差本身不能得出關(guān)于兩個變量的相關(guān)性的結(jié)論。這就是為什么Pearson的相關(guān)系數(shù)通過兩個變量的標(biāo)準(zhǔn)偏差將協(xié)方差歸一化的原因。由于這將相關(guān)性標(biāo)準(zhǔn)化到范圍[-1,1] ,因此即使變量具有不同的方差,也可以使相關(guān)性具有可比性。值-1表示完全負(fù)相關(guān),值1表示完全正相關(guān),而值0表示沒有相關(guān)。
R2確定系數(shù)
確定系數(shù)R2 定義為
其中? 是平方的殘差和,是平方? ?的總和。對于模型選擇,R2R2等效于RMSE,因為對于基于相同數(shù)據(jù)的模型,具有最小MSE的模型也將具有最大值? ? ?。
可以根據(jù)相關(guān)系數(shù)或根據(jù)解釋的方差來解釋確定系數(shù)。
用相關(guān)系數(shù)解釋
R平方通常為正,因為具有截距的模型會產(chǎn)生SSres <SStotSSres <SStot的預(yù)測Y ^ Y ^,因為模型的預(yù)測比平均結(jié)果更接近結(jié)果。因此,只要存在截距,確定系數(shù)就是相關(guān)系數(shù)的平方:
?
用解釋方差解釋
在平方總和分解為殘差平方和回歸平方和的情況下? ,
?
然后
?
這意味著R2 表示模型所解釋的方差比。因此,R2 = 0.7R2 = 0.7的模型將解釋70% 的方差,而剩下30% 的方差無法解釋。
?確定系數(shù)
為了獲得有關(guān)R2 ,我們定義了以下函數(shù),利用它們可以繪制線性模型的擬合。理想模型將位于曲線的對角線上,并且將殘差表示為與該對角線的偏差。
rsquared <- function(test.preds, test.labels) {
return(round(cor(test.preds, test.labels)^2, 3))
}
plot.linear.model <- function(model, test.preds = NULL, test.labels = NULL,
test.only = FALSE) {
# ensure that model is interpreted as a GLM
pred <- model$fitted.values
obs <- model$model[,1]
if (test.only) {
} else {
plot.df <- data.frame("Prediction" = pred, "Outcome" = obs,
"DataSet" = "training")
}
r.squared <- NULL
if (!is.null(test.preds) && !is.null(test.labels)) {
# store predicted points:
test.df <- data.frame("Prediction" = test.preds,
"Outcome" = test.labels, "DataSet" = "test")
plot.df <- rbind(plot.df, test.df)
}
#######
library(ggplot2)
p <- ggplot() +
# plot training samples
geom_point(data = plot.df,
aes(x = Outcome, y = Prediction, color = DataSet))
return(p)
}
例如,比較以下模型
?
?
盡管基于的模型??df.low
?具有足夠的擬合度(R平方為0.584),??df.low
?但不能很好地擬合數(shù)據(jù)(R平方為0.009)。
R平方的局限性
僅基于R平方盲目選擇模型通常是個壞主意。首先,R平方不一定能告訴我們一些關(guān)于擬合優(yōu)度的信息。例如,考慮具有指數(shù)分布的數(shù)據(jù):
plot(x,y)
?
讓我們?yōu)榛谶@些數(shù)據(jù)的線性模型計算R 2:
## [1] 0.9
如我們所見,R平方非常高。盡管如此,該模型仍無法很好地擬合,因為它不遵守數(shù)據(jù)的指數(shù)分布。
R2R2的另一個屬性是它取決于值范圍。R2R2通常在XX的寬值范圍內(nèi)較大,這是因為協(xié)方差的增加是由標(biāo)準(zhǔn)偏差調(diào)整的,該標(biāo)準(zhǔn)偏差的縮放速度比1N 項引起的協(xié)方差的縮放速度慢。
## [1] "R squared: 0.924115453794893, MSE:0.806898017781999"
## [1] "R squared: 0.0657969487417489, MSE:0.776376454723889"
我們可以看到,即使兩個模型的殘差平方和相似,第一個模型的R2 也更高。
分類模型的績效指標(biāo)
二進(jìn)制分類的許多性能度量均依賴于混淆矩陣。假設(shè)有兩個類別,00和11,其中11表示特征的存在(正類),00表示特征的不存在(負(fù)類)。相應(yīng)的混淆矩陣是具有以下結(jié)構(gòu)的2×22×2表:
預(yù)測/參考01個0TNFN1個FPTP
其中TN表示真實否定的數(shù)量(模型正確預(yù)測否定類別),F(xiàn)N表示假否定的數(shù)量(模型錯誤地預(yù)測否定類別),F(xiàn)P表示錯誤肯定的數(shù)量(模型錯誤地預(yù)測肯定類別),TP表示真實陽性的數(shù)量(模型正確預(yù)測陽性類別)。
準(zhǔn)確性與敏感性和特異性
基于混淆矩陣,可以計算準(zhǔn)確性,敏感性(真陽性率,TPR)和特異性(1-假陽性率,F(xiàn)PR):
?
準(zhǔn)確性表示正確預(yù)測的總體比率。準(zhǔn)確性的聲譽很差,因為如果類別標(biāo)簽不平衡,它就不合適。例如,假設(shè)您要預(yù)測稀有腫瘤的存在(1類)與不存在的罕見腫瘤(0類)。讓我們假設(shè)只有10%的數(shù)據(jù)點屬于肯定類別,而90%的數(shù)據(jù)屬于正面類別??偸穷A(yù)測陰性分類(即未發(fā)現(xiàn)腫瘤)的分類器的準(zhǔn)確性如何?這將是90%。但是,這可能不是一個非常有用的分類器。因此,靈敏度和特異性通常優(yōu)于準(zhǔn)確性。
敏感性表示正確預(yù)測的觀察到的陽性結(jié)果的比率,而特異性表示與陽性分類相混淆的觀察到的陰性結(jié)果的比率。這兩個數(shù)量回答以下問題:
敏感性:如果事件發(fā)生,則模型檢測到事件的可能性有多大?
特異性:如果沒有事件發(fā)生,那么該模型識別出沒有事件發(fā)生的可能性有多大?
我們始終需要同時考慮敏感性和特異性,因為這些數(shù)量本身對模型選擇沒有用。例如,始終預(yù)測陽性類別的模型將使靈敏度最大化,而始終預(yù)測陰性類別的模型將使特異性最大化。但是,第一個模型的特異性較低,而第二個模型的靈敏度較低。因此,敏感性和特異性可以解釋為蹺蹺板,因為敏感性的增加通常導(dǎo)致特異性的降低,反之亦然。
通過計算平衡精度,可以將靈敏度和特異性合并為一個數(shù)量?
平衡精度是更適合于類別不平衡的問題的度量。
ROC曲線下方的區(qū)域
評分分類器是為每個預(yù)測分配一個數(shù)值的分類器,可用作區(qū)分這兩個類的臨界值。例如,二進(jìn)制支持向量機(jī)將為正類分配大于1的值,為負(fù)類分配小于-1的值。對于評分分類器,我們通常希望確定的模型性能不是針對單個臨界值而是針對多個臨界值。
這就是AUC(ROC曲線下方的區(qū)域)出現(xiàn)的位置。此數(shù)量表示在幾個截止點的靈敏度和特異性之間進(jìn)行權(quán)衡。這是因為接收器工作特性(ROC)曲線只是TPR與FPR的關(guān)系圖,而AUC是由該曲線定義的面積,范圍為[0,而AUC是由該曲線定義的面積,其中在[0,1]范圍內(nèi)。
使用R,我們可以使用ROCR
?包來計算AUC? 。讓我們首先創(chuàng)建一個用于繪制分類器及其AUC得分的函數(shù):
plot.scores.AUC <- function(y, y.hat) {
par(mfrow=c(1,2))
hist(y.hat[y == 0], col=rgb(1,0,0,0.5),
main = "Score Distribution",
breaks=seq(min(y.hat),max(y.hat)+1, 1), xlab = "Prediction")
hist(y.hat[y == 1], col = rgb(0,0,1,0.5), add=T,
breaks=seq(min(y.hat),max(y.hat) + 1, 1))
legend("topleft", legend = c("Class 0", "Class 1"), ?col=c("red", "blue"), lty=1, cex=1)
}
?
?
?
第一個示例顯示允許完美分離的分類器的AUC為1。不能完全分離的分類器需要犧牲特異性以提高其靈敏度。因此,它們的AUC將小于1。