迴歸模型效果評估系列3-R平方

決定係數(coefficient of determination,R2)是反映模型擬合優度的重要的統計量,爲迴歸平方和與總平方和之比。R2取值在0到1之間,且無單位,其數值大小反映了迴歸貢獻的相對程度,即在因變量Y的總變異中迴歸關係所能解釋的百分比。 R2是最經常使用於評價迴歸模型優劣程度的指標,R2越大(接近於1),所擬合的迴歸方程越優。網絡

 

假設一數據集包括y1,...,yn共n個觀察值,相對應的模型預測值分別爲f1,...,fn。定義殘差ei = yi  fi,平均觀察值爲app

 

 

雖然R2能夠用來評價迴歸方程的優劣,但隨着自變量個數的增長,R2將不斷增大(由於自變量個數的增長,意味着模型的複雜度升高,對樣本數據的擬合程度會提升)。spa

若對兩個具備不一樣個數自變量的迴歸方程進行比較時,不能簡單地用R2做爲評價迴歸方程的標準,還必須考慮方程所包含的自變量個數的影響,此時可用校訂的決定係數(R2-adjusted)code

                                             

              其中n是樣本數量,p是模型中變量的個數,當變量個數爲0時,修正和原始的R方是同樣的blog

就是至關於給變量的個數加懲罰項。換句話說,若是兩個模型,樣本數同樣,R2同樣,那麼從修正R2的角度看,使用變量個數少的那個模型更優。ip

至於R2大於多少纔有意義呢?這時咱們能夠看另一個指標:複相關係數(Multiple correlation coefficient)R,R是決定係數R2的平方根,可用來度量因變量Y與多個自變量間的線性相關程度,即觀察值Y與估計值之間的相關程度。ci

相關係數要在0.7~0.5纔有意義,所以,R2應大於0.5*0.5=0.25,因此有種觀點認爲,在直線迴歸中應R2大於0.3纔有意義。it

仍是來看下一個簡單的例子,看下簡單的平滑預測的R平方有多少io

 

import numpy as np 

def r_square(y,f):
    y,f = np.array(y),np.array(f)
    y_mean = y.mean()
    SStot  = sum(np.power((y-y_mean),2))
    SSres  = sum(np.power(y-f,2))
    return 1.0 - 1.0*SSres/SStot

def smooth_(squences,period=5):
    res = []
    gap = period/2
    right = len(squences)
    for i in range(right):
        res.append(np.mean(squences[i-gap if i-gap > 0 else 0:i+gap if i+gap < right else right]))
    return res 

httpspeedavg = np.array([1821000, 2264000, 2209000, 2203000, 2306000, 2005000, 2428000,
       2246000, 1642000,  721000, 1125000, 1335000, 1367000, 1760000,
       1807000, 1761000, 1767000, 1723000, 1883000, 1645000, 1548000,
       1608000, 1372000, 1532000, 1485000, 1527000, 1618000, 1640000,
       1199000, 1627000, 1620000, 1770000, 1741000, 1744000, 1986000,
       1931000, 2410000, 2293000, 2199000, 1982000, 2036000, 2462000,
       2246000, 2071000, 2220000, 2062000, 1741000, 1624000, 1872000,
       1621000, 1426000, 1723000, 1735000, 1443000, 1735000, 2053000,
       1811000, 1958000, 1828000, 1763000, 2185000, 2267000, 2134000,
       2253000, 1719000, 1669000, 1973000, 1615000, 1839000, 1957000,
       1809000, 1799000, 1706000, 1549000, 1546000, 1692000, 2335000,
       2611000, 1855000, 2092000, 2029000, 1695000, 1379000, 2400000,
       2522000, 2140000, 2614000, 2399000, 2376000])
httpavg = np.round((1.0*httpspeedavg/1024/1024).tolist(),2)
smooth = np.round(smooth_((1.0*httpspeedavg/1024/1024).tolist(),5),2)

print r_square(httpavg,smooth)
# 0.711750424322

 

也就是71%的網絡變化狀況能夠用平滑預測來解釋class

相關文章
相關標籤/搜索