R語言中迴歸和分類模型選擇的性能指標

原文鏈接:http://tecdat.cn/?p=11334

有多種性能指標來描述機器學習模型的質量。但是,問題是,對於哪個問題正確的方法是什麼?在這裏,我討論了選擇迴歸模型和分類模型時最重要的性能指標。請注意,此處介紹的性能指標不應用於特徵選擇,因爲它們沒有考慮模型的複雜性。

迴歸的績效衡量

對於基於相同函數集的模型,RMSE和R2 通常用於模型選擇。

均方誤差

均方誤差由比較預測y ^ y ^與觀察到的結果yy所得的殘差平方和確定:

 

由於MSE是基於殘差平方的,因此它取決於結果平方 。因此,MSE的根 通常用於報告模型擬合:

 

均方誤差的一個缺點是它不是很容易解釋,因爲MSE取決於預測任務,因此無法在不同任務之間進行比較。例如,假設一個預測任務與估計卡車的重量有關,而另一項與估計蘋果的重量有關。然後,在第一個任務中,好的模型可能具有100 kg的RMSE,而在第二個任務中,好的模型可能具有0.5 kg的RMSE。因此,雖然RMSE可用於模型選擇,但很少報告,而使用R2R2。

皮爾遜相關係數

由於確定係數可以用皮爾遜相關係數來解釋,因此我們將首先介紹該數量。令Y ^ Y ^表示模型估計,而YY表示觀察到的結果。然後,相關係數定義爲

 

其中Cov(⋅,⋅)∈RCov(⋅,⋅)∈R是協方差,而σσ是標準偏差。協方差定義爲

 

其中,μμ表示平均值。在離散設置中,可以將其計算爲

 

這意味着,如果預測和結果與平均值的偏差相似,則它們的協方差將爲正;如果與平均值具有相對的偏差,則它們之間的協方差將爲負。

標準偏差定義爲

 

在離散設置下,可以計算爲

請注意,R函數  sd 計算總體標準差,該標準差用於獲得無偏估計量。如果分佈較寬(均值附近的寬分佈),則σσ高;如果分佈較窄(均值周圍的較小分佈),則σσ小。

關聯 :協方差和標準差

爲了更好地理解協方差,我們創建了一個繪製測量值與均值偏差的函數:

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")  
 
}

然後,我們生成代表三種協方差的數據:正協方差,負協方差和無協方差:

# 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)

 

 

注意離羣值(與均值的高偏差)對協方差的影響大於與均值接近的值。此外,請注意,協方差接近0表示變量之間在任何方向上似乎都沒有關聯(即各個貢獻項被抵消了)。

由於協方差取決於數據的散佈,因此具有高標準偏差的兩個變量之間的絕對協方差通常高於具有低方差的變量之間的絕對協方差。讓我們可視化此屬性:

 
plot.mean.deviation(y, y.hat, label = "Positive Covariance")

 

df.high <- data.frame(Y = y, Y_Hat = y.hat)

因此,協方差本身不能得出關於兩個變量的相關性的結論。這就是爲什麼Pearson的相關係數通過兩個變量的標準偏差將協方差歸一化的原因。由於這將相關性標準化到範圍[-1,1] ,因此即使變量具有不同的方差,也可以使相關性具有可比性。值-1表示完全負相關,值1表示完全正相關,而值0表示沒有相關。

R2確定係數

確定係數R2 定義爲

其中  是平方的殘差和,是平方   的總和。對於模型選擇,R2R2等效於RMSE,因爲對於基於相同數據的模型,具有最小MSE的模型也將具有最大值     。

可以根據相關係數或根據解釋的方差來解釋確定係數。

用相關係數解釋

R平方通常爲正,因爲具有截距的模型會產生SSres <SStotSSres <SStot的預測Y ^ Y ^,因爲模型的預測比平均結果更接近結果。因此,只要存在截距,確定係數就是相關係數的平方:

 

用解釋方差解釋

在平方總和分解爲殘差平方和迴歸平方和的情況下  ,

 

然後

 

這意味着R2 表示模型所解釋的方差比。因此,R2 = 0.7R2 = 0.7的模型將解釋70% 的方差,而剩下30% 的方差無法解釋。

 確定係數

爲了獲得有關R2 ,我們定義了以下函數,利用它們可以繪製線性模型的擬合。理想模型將位於曲線的對角線上,並且將殘差表示爲與該對角線的偏差。

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 但不能很好地擬合數據(R平方爲0.009)。

R平方的侷限性

僅基於R平方盲目選擇模型通常是個壞主意。首先,R平方不一定能告訴我們一些關於擬合優度的信息。例如,考慮具有指數分佈的數據:


plot(x,y)   

 

讓我們爲基於這些數據的線性模型計算R 2:

## [1] 0.9

如我們所見,R平方非常高。儘管如此,該模型仍無法很好地擬合,因爲它不遵守數據的指數分佈。

R2R2的另一個屬性是它取決於值範圍。R2R2通常在XX的寬值範圍內較大,這是因爲協方差的增加是由標準偏差調整的,該標準偏差的縮放速度比1N 項引起的協方差的縮放速度慢。

## [1] "R squared: 0.924115453794893, MSE:0.806898017781999"
## [1] "R squared: 0.0657969487417489, MSE:0.776376454723889"

我們可以看到,即使兩個模型的殘差平方和相似,第一個模型的R2 也更高。

分類模型的績效指標

二進制分類的許多性能度量均依賴於混淆矩陣。假設有兩個類別,00和11,其中11表示特徵的存在(正類),00表示特徵的不存在(負類)。相應的混淆矩陣是具有以下結構的2×22×2表:

預測/參考 0 1個
0 TN FN
1個 FP TP

其中TN表示真實否定的數量(模型正確預測否定類別),FN表示假否定的數量(模型錯誤地預測否定類別),FP表示錯誤肯定的數量(模型錯誤地預測肯定類別),TP表示真實陽性的數量(模型正確預測陽性類別)。

準確性與敏感性和特異性

基於混淆矩陣,可以計算準確性,敏感性(真陽性率,TPR)和特異性(1-假陽性率,FPR):

 

準確性表示正確預測的總體比率。準確性的聲譽很差,因爲如果類別標籤不平衡,它就不合適。例如,假設您要預測稀有腫瘤的存在(1類)與不存在的罕見腫瘤(0類)。讓我們假設只有10%的數據點屬於肯定類別,而90%的數據屬於正面類別。總是預測陰性分類(即未發現腫瘤)的分類器的準確性如何?這將是90%。但是,這可能不是一個非常有用的分類器。因此,靈敏度和特異性通常優於準確性。

敏感性表示正確預測的觀察到的陽性結果的比率,而特異性表示與陽性分類相混淆的觀察到的陰性結果的比率。這兩個數量回答以下問題:

  • 敏感性:如果事件發生,則模型檢測到事件的可能性有多大?
  • 特異性:如果沒有事件發生,那麼該模型識別出沒有事件發生的可能性有多大?

我們始終需要同時考慮敏感性和特異性,因爲這些數量本身對模型選擇沒有用。例如,始終預測陽性類別的模型將使靈敏度最大化,而始終預測陰性類別的模型將使特異性最大化。但是,第一個模型的特異性較低,而第二個模型的靈敏度較低。因此,敏感性和特異性可以解釋爲蹺蹺板,因爲敏感性的增加通常導致特異性的降低,反之亦然。

通過計算平衡精度,可以將靈敏度和特異性合併爲一個數量 

平衡精度是更適合於類別不平衡的問題的度量。

ROC曲線下方的區域

評分分類器是爲每個預測分配一個數值的分類器,可用作區分這兩個類的臨界值。例如,二進制支持向量機將爲正類分配大於1的值,爲負類分配小於-1的值。對於評分分類器,我們通常希望確定的模型性能不是針對單個臨界值而是針對多個臨界值。

這就是AUC(ROC曲線下方的區域)出現的位置。此數量表示在幾個截止點的靈敏度和特異性之間進行權衡。這是因爲接收器工作特性(ROC)曲線只是TPR與FPR的關係圖,而AUC是由該曲線定義的面積,範圍爲[0,而AUC是由該曲線定義的面積,其中在[0,1]範圍內。

使用R,我們可以使用ROCR 包來計算AUC  。讓我們首先創建一個用於繪製分類器及其AUC得分的函數:

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。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章