1. 程式人生 > >數學建模:1.監督學習--回歸分析模型

數學建模:1.監督學習--回歸分析模型

統計學 marker sta 均值 示例 on() 8.4 sklearn 關系

技術分享圖片

1.回歸分析

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

按照自變量和因變量之間的關系類型,可分為線性回歸分析非線性回歸分析。

技術分享圖片

技術分享圖片

技術分享圖片

技術分享圖片

技術分享圖片

技術分享圖片

技術分享圖片

2.線性回歸的python實現

線性回歸的python實現方法

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

簡單線性回歸 / 多元線性回歸

2.1 簡單線性回歸 (一元線性回歸)

import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
% matplotlib inline
# 簡單線性回歸(一元線性回歸)
# (1)數據示例

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

rng = np.random.RandomState(1)  #選擇隨機數裏邊的種子1
xtrain = 10 * rng.rand(30)
ytrain 
= 8 + 4 * xtrain + rng.rand(30) # np.random.RandomState → 隨機數種子,對於一個隨機數發生器,只要該種子(seed)相同,產生的隨機數序列就是相同的 # 生成隨機數據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(樣本數據散點圖) # 生成散點圖
model = LinearRegression() #創建線性回歸模型 model.fit(xtrain[:, np.newaxis], ytrain) #填上值自變量和因變量,如果是多元線性回歸自變量給它個矩陣就可以了,model.fit(xtrain, ytrain)這樣子是不行的,要把它轉置為列的值, # xtrain.shape #(30,) # xtrain[:, np.newaxis] #預測結果就會放到這個model裏邊 # LinearRegression → 線性回歸評估器,用於擬合數據得到擬合直線 # model.fit(x,y) → 擬合直線,參數分別為x與y # x[:,np.newaxis] → 將數組變成(n,1)形狀 #print(model.coef_) #[ 4.00448414]斜率的參數 #print(model.intercept_) #8.44765949943截距的參數 xtest = np.linspace(0, 10, 1000) #測試值 ytest = model.predict(xtest[:, np.newaxis]) # 創建測試數據xtest,並根據擬合曲線求出ytest # model.predict → 預測 ax2 = fig.add_subplot(1, 2, 2) plt.scatter(xtrain, ytrain, marker = ., color = k) plt.plot(xtest, ytest, color = r) plt.grid() plt.title(線性回歸擬合) # 繪制散點圖、線性回歸擬合直線

技術分享圖片

# 簡單線性回歸(一元線性回歸)
# (2)誤差

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(誤差)
# 繪制圖表

技術分享圖片

# 簡單線性回歸(一元線性回歸)
# (3)求解a,b

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

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

print(斜率a為:%.4f % model.coef_[0])
print(截距b為:%.4f % model.intercept_)
print(線性回歸函數為:\ny = %.4fx + %.4f % (model.coef_[0],model.intercept_))
# 參數輸出

技術分享圖片

2.2 多元線性回歸

# 多元線性回歸

rng = np.random.RandomState(5)  
xtrain = 10 * rng.rand(150,4)
ytrain = 20 + np.dot(xtrain ,[1.5,2,-4,3])
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.5,
                 range_padding=0.1)
print(df.head())
# 創建數據,其中包括4個自變量
# 4個變量相互獨立

model = LinearRegression()
model.fit(df[[b1, b2, b3, b4]], df[y])
print(斜率a為:, model.coef_)
print(線性回歸函數為:\ny = %.1fx1 + %.1fx2 + %.1fx3 + %.1fx4 + %.1f 
      % (model.coef_[0],model.coef_[1],model.coef_[2],model.coef_[3],model.intercept_))
# 參數輸出

技術分享圖片

技術分享圖片

3. 線性回歸模型評估

技術分享圖片

技術分享圖片

技術分享圖片

線性回歸模型評估

通過幾個參數驗證回歸模型

SSE(和方差、誤差平方和):The sum of squares due to error
MSE(均方差、方差):Mean squared error
RMSE(均方根、標準差):Root mean squared error
R-square(確定系數) Coefficient of determination

# 模型評價
# MSE, RMES, 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)  # 求出均方差MSE
rmse = np.sqrt(mse)  # 求出均方根RMSE
print(mse)
print(rmse)

# ssr = ((ytest - ytrain.mean())**2).sum()  # 求出預測數據與原始數據均值之差的平方和
# sst = ((ytrain - ytrain.mean())**2).sum()  # 求出原始數據和均值之差的平方和
# r2 = ssr / sst # 求出確定系數 #0.99464521596949995
r2 = model.score(xtrain[:,np.newaxis],ytrain)  # 求出確定系數 #0.99464521596949995
r2

print("均方差MSE為: %.5f" % mse)
print("均方根RMSE為: %.5f" % rmse)
print("確定系數R-square為: %.5f" % r2)
# 確定系數R-square非常接近於1,線性回歸模型擬合較好

技術分享圖片

總結:

能比較的有兩個 R_square ‘確定系數‘ 、 MSE,

做兩個回歸模型可以分別判斷哪個MSE更小就好,R哪個接近於1哪個就更好。如果只有一個回歸模型,判斷是否接近1,只要是大於0.6、0.8就非常不錯了。同時在後邊做組成成分,假如現在有10個參數,做一個回歸模型,做一個R模型評估,比如說為0.85,把這10個參數降維,降維為3個主成分,再做一個3元的線性回歸,這個叫回歸模型2,為0.92,這個時候我們就選擇那個3元的線性回歸模型0.92更好,相互比較做出最優比較。

數學建模:1.監督學習--回歸分析模型