監督學習-迴歸分析

1、數學建模概述

監督學習:經過已有的訓練樣本進行訓練獲得一個最優模型,再利用這個模型將全部的輸入映射爲相應的輸出。監督學習根據輸出數據又分爲迴歸問題(regression)和分類問題(classfication),迴歸問題的輸出一般是連續的數值,分類問題的輸出一般是幾個特定的數值。python

非監督學習:根據類別未知的訓練樣本,解決模式識別中的各類問題,主要爲聚類問題(cluster analysis)。dom

 

2、迴歸分析概述 

在統計學中,迴歸分析(regression analysis)指的是肯定兩種或兩種以上變量間互相依賴的定量關係的一種統計分析方法。函數

根據自變量和因變量之間的關係類型,可分爲線性迴歸分析和非線性迴歸分析。學習

 

線性迴歸linear analys

線性迴歸一般是學習預測模型時首選的技術之一。在線性迴歸中,因變量是連續的,而自變量能夠是連續的的也能夠是離散的,迴歸線的性質是線性的。spa

線性迴歸使用最佳的擬合直線(即迴歸線)在因變量y和一個或多個自變量x之間創建一種關係,簡單線性迴歸(一元線性迴歸)可表示爲y=a+b*x.net

多元線性迴歸可表示爲y=a+b1*x1+b2*x2。線性迴歸能夠根據給定的預測變量s來預測目標變量的值。ssr

    

  

 

3、使用python實現線性迴歸分析

須要先安裝sklearn模塊,並導入其中的線性迴歸類from sklearn.linear_model import LinearRegressioncode

model = LinearRegression()  建立模型blog

model.fit(x,y)  將樣本導入模型,x須要是列變量ci

print('斜率和截距分別爲:',model.coef_,model.intercept_)

y_pre = model.predict(x_pre)   經過模型預測給定的自變量對應的因變量

 

1.一元線性迴歸

rng = np.random.RandomState(1)  #生成隨機數種子,種子相同每次生成的隨機數相同
x = 10 * rng.rand(30)  #經過隨機數種子生成隨機數
y = 8 + 4 * x + rng.rand(30)  # rng.rand(30)表示偏差
#生成隨機數x和y,擬合樣本關係y = 8 + 4*x

fig = plt.figure(figsize=(10,4))
ax1 = fig.add_subplot(121)
plt.scatter(x,y,s = 10)
plt.title('樣本散點圖')

model = LinearRegression()  # 建立線性迴歸模型
model.fit(x[:,np.newaxis],y)   # 給模型導入樣本值,第一個參數爲自變量,第二個參數爲因變量,x[:,np.newaxis]表示給x在列上增長一個維度,不能直接使用x
print('斜率爲%f,截距爲%f'%(model.coef_,model.intercept_))
# 斜率爲4.004484,截距爲8.447659

xtest = np.linspace(0,10,1000)
ytest = model.predict(xtest[:,np.newaxis])   # 經過模型預測自變量對應的因變量
ax1 = fig.add_subplot(122)
plt.scatter(x,y,s = 10)
plt.plot(xtest,ytest,color = 'red')  #擬合線性迴歸直線
plt.title('線性迴歸擬合圖')

 

偏差,即樣本實際值與擬合獲得的樣本值的差

rng = np.random.RandomState(2)
x = 10 * rng.rand(20)
y = 8 + 4 * x + rng.rand(20)*30   #偏差乘以20是爲了在圖表中明顯顯示
model = LinearRegression()
model.fit(x[:,np.newaxis],y)
xtest = np.linspace(0,10,1000)
ytest = model.predict(xtest[:,np.newaxis])

plt.plot(xtest,ytest,color = 'r',alpha = 0.7)   # 擬合線性迴歸直線
plt.scatter(x,y,s = 10,color='green')  # 樣本散點圖
y2 = model.predict(x[:,np.newaxis])  # 樣本x在擬合直線上的y值
plt.scatter(x,y2,marker = '+',color = 'k')   # 樣本x擬合y的散點圖
plt.plot([x,x],[y,y2],color = 'gray')   #偏差線
plt.title('偏差線')

 

 2.多元線性迴歸

矩陣點積參考https://blog.csdn.net/skywalker1996/article/details/82462499

rng = np.random.RandomState(3)
x = 10 * rng.rand(100,4)
y = 20 + np.dot(x,[1.5,2,-4,3]) + rng.rand(100)
df = pd.DataFrame(x,columns=['b1','b2','b3','b4'])
df['y'] = y
df.head()
pd.plotting.scatter_matrix(df[['b1','b2','b3','b4']],figsize = (10,10),diagonal='kde')  #根據矩陣散點圖判斷4個變量之間相互獨立,不需降維
model = LinearRegression()
model.fit(df[['b1','b2','b3','b4']],df['y'])
print('斜率爲:',model.coef_,type(model.coef_))
print('截距爲:',model.intercept_)
print('線性迴歸函數爲y = %.1fx1 + %.1fx2 + %.1fx3 + %.1fx4 + %.1f'%(model.coef_[0],model.coef_[1],model.coef_[2],model.coef_[3],model.intercept_))
# 斜率爲: [ 1.50321961  2.0000257  -3.99067203  2.99358669] <class 'numpy.ndarray'>
# 截距爲: 20.489657423197222
# 線性迴歸函數爲y = 1.5x1 + 2.0x2 + -4.0x3 + 3.0x4 + 20.5

 

4、線性迴歸模型評估

經過幾個參數驗證迴歸模型

  • SSE:和方差、偏差平方和,the sum of squares due to error
  • MSE:均方差、方差,mean squared error
  • RMSE:均方根、標準差,root mean squared error
  • R-square:肯定係數,coefficient of determination

1.SSE(和方差)

該統計參數計算的是擬合數據和原始數據對應點的偏差的平方和,計算公式以下。

SSE越接近於0,說明模型選擇和擬合更好,數據預測也越成功。接下來的MSE和RMSE由於和SSE同出一宗,效果同樣。

2.MSE(均方差)

該統計參數是預測數據和原始數據對應點偏差的平方和的均值,也就是SSE/n,和SSE沒有太大的區別,計算公式以下。

3.RMSE(均方根)

該統計參數也叫回歸系統的擬合標準差,是MSE的平方根,就算公式以下

在這以前,偏差參數都是基於預測值和原始值之間的偏差(即點對點),而下面的偏差是相對原始數據平均值而展開的(即點對全)。

4.R-square(肯定係數)

①SSR:Sum of squares of the regression,即預測數據與原始數據均值之差的平方和,公式以下。

②SST:Total sum of squares,即原始數據和均值之差的平方和,公式以下。

細心的網友會發現,SST=SSE+SSR,而「肯定係數」是定義爲SSR和SST的比值,故

其實「肯定係數」是經過數據的變化來表徵一個擬合的好壞。由上面的表達式能夠知道「肯定係數」的正常取值範圍爲[0,1],越接近1代表方程的變量對y的解釋能力越強,這個模型對數據擬合的也較好。

from sklearn import metrics

rng = np.random.RandomState(6)  
x = 10 * rng.rand(30)
y = 8 + 4 * x + rng.rand(30) * 3

model = LinearRegression()
model.fit(x[:,np.newaxis],y)  # 迴歸擬合

ytest = model.predict(x[:,np.newaxis])  # 求出預測數據

sse = ((ytest - y)**2).sum() # 求SSE,也可經過該方法獲得SSE,再除以len(x)獲得MSE
mse = metrics.mean_squared_error(ytest,y)  # 求均方差MSE,也可經過該方法算出MSE,再乘以len(x)獲得SSE
rmse = np.sqrt(mse)  # 求均方根RMSE

# ssr = ((ytest - y.mean())**2).sum()  # 求預測數據與原始數據均值之差的平方和
# sst = ((y - y.mean())**2).sum()  # 求原始數據和原始數據均值之差的平方和
# rr = ssr / sst # 求肯定係數 
r = model.score(x[:,np.newaxis],y)  # 求出肯定係數


print('和方差SSE爲:%.5f'%sse)
print('均方差MSE爲: %.5f'% mse)
print('均方根RMSE爲: %.5f'% rmse)
print('肯定係數R-square爲: %.5f'% r)
# 和方差SSE爲:16.54050
# 均方差MSE爲: 0.55135
# 均方根RMSE爲: 0.74253
# 肯定係數R-square爲: 0.99512

 

5.線性迴歸模型評估總結

主要是用MSE和 R_square。

若是是對一個樣本作兩個迴歸模型,能夠分別判斷哪一個MSE更小哪一個就更好、哪一個R接近於1哪一個就更好。若是隻有一個迴歸模型,判斷R是否接近1,大於0.六、0.8就很是不錯了。同時在後續作組成成分分析,假若有10個參數,作一個迴歸模型後作一個R模型評估,好比說R爲0.85,把這10個參數降維爲3個主成分,再作一個3元的線性迴歸,R爲0.92,則3元線性迴歸模型的R爲0.92更好,相互比較作出最優比較。

相關文章
相關標籤/搜索