仔細評估模型預測

仔細評估模型預測

2016年12月2日
約翰·摩

(本文首次發表于的R -贏矢量博客 ,并親切地促進了R-博客)

有一件事我教的是:評估回歸模型的性能時, 你不應該使用關聯作為你的分數
這是因為相關性告訴你結果的重新縮放是否有用,但是你想知道手中的結果是否真的有用。 例如:火星氣候軌道器軟件在磅-秒為單位期待的命令發出推力命令,發動機是在牛頓秒為單位 。 這兩個量通過1.4881639的常數比相關,因此以磅 - 秒為單位測量的任何值與以牛頓 - 秒為單位的相同測量值具有1.0的相關性。 然而,一個不是另一個,區別是為什么火星氣候軌道器“遇到火星在低于預期的高度和由于大氣壓力分解。
需要毫無意外地引發了與計算相關相關的隱式重新縮放方便的直接F-測試是我們提供的原因之一SIGR [- R庫。 然而,即使事情可能變得混亂。

請閱讀一個討厭的小例子。

考慮以下“無害數據幀”。

d <-data.frame(prediction = c(0,0,-1,-2,0,0,-1,-2), actual = c(2,3,1,2,2,3,1,2))

檢查“的質量推薦的測試prediction
相關的”,“ actual
”是F-檢驗(這是測試stats::lm
使用)。 我們可以直接運行該測試sigr
(假設我們已經安裝包),如下所示:

sigr :: formatFTest(d,'prediction','actual',format ='html')$ formatStr

F測試總結*:(R 2

  • = -16,F(1,6)= - 5.6,P = NS)。

sigr
報告的R平方-16(請參閱這里的R平方的一些討論)。 這可能是混亂的,但它正確傳達我們沒有模式,實際上是“ prediction
”是比只使用平均(一個非常傳統的空模型)差。
然而, cor.test
似乎認為“ prediction
”是一個可用的模型:

cor.test(d $ prediction,d $ actual) Pearson的乘積矩相關 data:d $ prediction和d $ actual t = 1.1547,df = 6,p值= 0.2921備選假設:真相關不等于0 95%的置信區間: -0.3977998 0.8697404樣本估計: 科爾 0.4264014

這是所有的預測,其中sum((d$actual-d$prediction)^2)==66
比大sum((d$actual-mean(d$actual))^2)==4
。 我們專注于影響措施(如R平方),因為我們可以通過添加更多的數據行來驅動p值。 我們的觀點是:使用這個模型比使用實際(2)的平均值作為常數預測器更糟糕。 在我看來,這不是一個好的預測。 和lm
似乎同樣興奮的“ prediction
”。

summary(lm(actual?prediction,data = d))呼叫: lm(公式=實際預測,數據= d)殘留: 最小1Q中位數3Q最大 -0.90909 -0.43182 0.09091 0.52273 0.72727 系數: 估計標準 誤差t值Pr(> | t |) (截距)2.2727 0.3521 6.455 0.000655 預測值0.3636 0.3149 1.155 0.292121 --- --- Signif。 代碼:0''0.001'*'0.01''0.05'。 0.1“1殘余標準誤差:在6自由度上為0.7385多次R平方:0.1818,調整R平方:0.04545 F統計:1.333對1和6DF,p-值:0.2921

一個理由不相信lm
的結果是沒有得分“質量prediction
”。 它拿下的質量“ 0.3636prediction + 2.2727
”。它可以是“案件0.3636
prediction + 2.2727
”實際上是一個很好的預測。 但 這并不能幫助我們,如果是“ prediction
”即將展現在我們的老板或投產。 我們可以嘗試通過堅持以緩解這種lm
盡量呆在通過關閉攔截更接近原始或使用“偏移0+
”符號。 這看起來像下面。

summary(lm(actual?0 + prediction,data = d))呼叫: lm(公式=實際?0 +預測,數據= d)殘留: 最小1Q中位數3Q最大 0.00 0.00 1.00 2.25 3.00 系數: 估計標準 誤差t值Pr(> | t |)預測-1.0000 0.6094 -1.641 0.145殘余標準誤差:1.927在7自由度上多次R平方:0.2778,調整R平方:0.1746 F統計:2.692對1和7DF,p-值:0.1448

即使是lm(0+)
的調整后的預測是不好的,因為我們看到如下:

d $ lmPred <-predict(lm(actual?0 + prediction,data = d)) sum((d $ actual-d $ lmPred)^ 2) [1] 26

是的, lm(0+)
找到了一種方法,提高了預測; 但是改進的預測仍然非常糟糕(比使用良好選擇的常數更差)。 它是很難說“ -prediction
”是同一型號為“ prediction
”。
現在sigr
是相當新的代碼,因此它是一個有點大膽的說,這是正確的,當它與標準方法不同意。 然而sigr
就在這種情況下。 標準方法沒有那么多錯誤,因為兩個原因:
他們正在回答不同的問題。 F檢驗旨在檢查手中的預測是否好; “cor.test
”和“ lm %>% summary
”被設計為檢查預測的任何重新縮放是實際上良好。 這些是不同的問題。 使用“ cor.test
”或“ lm %>% summary
”來測試潛在變量的工具是一個不錯的主意。 在這些測試中隱藏的重新處理與稍后在模型中使用變量一致。使用它們來評分應該直接使用的模型結果是錯誤的。
從標準R代碼的角度來看,什么是正確的“空模型”是不明顯的。還記得我們最初的觀點:對質量的措施lm(0+)
的設計,看看如何lm(0+)
工作。 這意味著lm(0+)
得分它的輸出(而不是它的輸入)的質量,它得到信貸的預測翻轉跡象。 它也認為自然零模型是一個它可以形成沒有可變驅動效應。 由于在這些模型中沒有攔截或“DC-術語”(由“引發0+
”符號)盛大平均不被視為一個似是而非的空模式,因為它是不是在建模情況的概念空間lm
被提交。 或者從help(summary.lm)
R ^ 2,'由模型解釋的方差分數', R ^ 2 = 1-Sum(R [i] ^ 2)/ Sum((y [i] -y *)^ 2) 其中y *是y [i]的平均值,否則為0。

我承認,這非常令人困惑。 但它對應于文檔,從建模的角度來看是有意義的。 它是正確的。 空模型從平均值到零的無聲切換在其定義的上下文中是有意義的。對于測試我們的預測沒有意義,但是這只是使用正確的F檢驗而不是試圖攻擊的另一個原因“ cor.test
”或“ lm(0+) %>% summary
”來計算它。
而這正是sigr
大概是:標準測試(使用R
提供的實現)略有不同的調用約定,以便更好地意向文件(在我們的情況下,幾乎總是測量模型,從模型構建單獨的質量)。 它是一個新的庫,所以它還沒有實現其目標所需的文檔,但我們最終會到達那里。

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內容

  • 最近總是習慣了夜晚,閉上眼,腦袋里會蹦出很多光怪陸離的事情,大腦一開始運轉,就沒來由的亢奮,夜不能寐。 以前我總是...
    CHINCHINFU閱讀 327評論 0 0
  • 的確可能在今年的s7世界總決賽上EDG的表現不是特別的好,打了一個0杠三的成績,大家都感覺edg應該沒有什么希望了...
    黃銅刀閱讀 202評論 0 0
  • 回家的路上,躺著一只被壓死的貓 我從旁邊過去,看了它一眼 然后繼續向前。我也不記得在馬路...
    ladidada閱讀 207評論 0 0
  • 我還真是蠻拼的。。。。。。 晚上我要去吃薯條和漢堡。。。。。。 沒有別的什么事情了。。。。。。 快放假了。。。。。...
    豬耗菌閱讀 987評論 14 7