線性迴歸實現及模型評估

目錄

簡單線性迴歸

多元線性迴歸

線性迴歸模型評估 


線性迴歸通常是人們在學習預測模型時首選的技術之一,在這種技術中,因變量是連續的,自變量可以是連續的也可以是離散的,迴歸線的性質是線性的。
線性迴歸使用最佳的擬合直線(也就是迴歸線)在因變量(Y)和一個或多個自變量(X)之間建立一種關係。

主要有有簡單線性迴歸 / 多元線性迴歸

導入常見模塊

import numpy as np
import pandas as pd
import matplotlib.pyplot as plt

 

簡單線性迴歸

from sklearn.linear_model import LinearRegression
# 導入線性迴歸模塊

rng = np.random.RandomState(2)
xtrain =10*rng.rand(30)
ytrain = 8 + 4*xtrain + rng.rand(30)
#np.random.RandomState ->隨機數種子,對於一個隨機數發生器,只要該種子相同,產生的隨機數序列就是相同的
# 生成隨機數據x與y
# 樣本關係:y = 8 + 4*x

fig = plt.figure(figsize=(12,3))
ax1 = fig.add_subplot(1,2,1)
plt.scatter(xtrain,ytrain,marker='.',color='K')
plt.grid()
plt.title('Sample data charts')
#生成散點圖
#xtrain[:,np.newaxis]

model = LinearRegression()
model.fit(xtrain[:,np.newaxis],ytrain)

print(model.coef_) #擬合斜率
print(model.intercept_) #擬合截距
#擬合曲線 y = 3.99x + 8.53

xtest = np.linspace(0,10,1000)
ytest = model.predict(xtest[:,np.newaxis])

ax2 = fig.add_subplot(1,2,2)
plt.scatter(xtrain,ytrain,marker='.',color='K')
plt.plot(xtest,ytest,color = 'r')
plt.grid()
plt.ylim(10,40)
plt.title('Predict data chart')

          

誤差

# 誤差
rng = np.random.RandomState(8)
xtrain = 10 * rng.rand(15)
ytrain = 8 + 4 * xtrain + rng.rand(15)*30
model.fit(xtrain[:,np.newaxis],ytrain)
xtest = np.linspace(0,10,1000)
ytest = model.predict(xtest[:,np.newaxis])
#創建巖本數據並進行擬合

plt.plot(xtest,ytest,color = 'r',linestyle = '--') # 擬合直線
plt.scatter(xtrain,ytrain,marker='.',color = 'k') #樣本數據散點圖
ytest2 = model.predict(xtrain[:,np.newaxis]) #樣本數據x在擬合直線上的y值
plt.scatter(xtrain,ytest2,marker='x',color='g') # ytest2的散點圖
plt.plot([xtrain,xtrain],[ytrain,ytest2],color = 'gray') # 誤差線
plt.grid()
plt.title('error') #誤差

                                  

多元線性迴歸

rng = np.random.RandomState(5)
xtrain = 10 * rng.rand(150,4)
ytrain = 20 + np.dot(xtrain,[1.5,2,-4,3]) + rng.rand(150) #np.dot() 內積
df = pd.DataFrame(xtrain,columns=['b1','b2','b3','b4'])
df['y'] = ytrain

pd.scatter_matrix(df[['b1','b2','b3','b4']],figsize=(10,6),diagonal='kde',alpha=0.8,range_padding=0.1) #查看多元變量之間是否存在線性相關
model = LinearRegression()
model.fit(df[['b1','b2','b3','b4']],df['y'])
print('斜率a爲:',model.coef_)
print('截距b爲:%.4f'%model.intercept_)
print('線性迴歸函數爲:/ny = %.1fx1 + %.1fx2 + %.1fx3 + %.1fx4 + %.1f'%(model.coef_[0],model.coef_[1],model.coef_[2],model.coef_[3],model.intercept_))
斜率a爲: [ 1.501989    1.99186894 -4.00453124  3.00278851]
截距b爲:20.5319
線性迴歸函數爲:/ny = 1.5x1 + 2.0x2 + -4.0x3 + 3.0x4 + 20.5

觀察多元變量之間有無線性關係

線性迴歸模型評估 

評估參數主要有

SSE(和方差,誤差平方和)
    擬合數據和原始數據對應點的誤差平方和
MSE(均方差)
    預測數據和原始數據誤差平方和的均值,SSE/n
RMSE(均方根)
    MSE的平方根
R-square(確定係數)
    1.SSR:預測數據與原始數據的均值之差的平方和
    2.SST:原始數據與原始數據的均值之差的平方和

    R-square是SSR與SST的比值,越接近1表示擬合能力越強

#模型評價
# MSE,RMSE,R-square

from sklearn import metrics

rng = np.random.RandomState(1)
xtrain = 10*rng.rand(30)
ytrain = 8 + 4*xtrain + rng.rand(30)*3
#創建數據

model = LinearRegression()
model.fit(xtrain[:,np.newaxis],ytrain)
#多元迴歸擬合

ytest = model.predict(xtrain[:,np.newaxis])#求出預測數據
mse = metrics.mean_squared_error(ytrain,ytest)#求出均方差
rmse = np.sqrt(mse) #求出均方根

ssr = ((ytest - ytrain.mean())**2).sum() #求出預測數據與原始數據均值之差的平方和
sst = ((ytrain - ytrain.mean())**2).sum()#求出原始數據和均值之差的平方和
rsq = ssr/sst #求出確定係數
print(rsq)
#0.9946452159695

rsq2 = model.score(xtrain[:,np.newaxis],ytrain)#兩種方法所求r-square值一樣
print(rq2)
#0.9946452159694995

 

發佈了67 篇原創文章 · 獲贊 49 · 訪問量 4萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章