溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點(diǎn)擊 登錄注冊 即表示同意《億速云用戶服務(wù)條款》

python 線性回歸分析模型檢驗(yàn)標(biāo)準(zhǔn)--擬合優(yōu)度詳解

發(fā)布時間:2020-09-14 12:38:47 來源:腳本之家 閱讀:268 作者:J符離 欄目:開發(fā)技術(shù)

建立完回歸模型后,還需要驗(yàn)證咱們建立的模型是否合適,換句話說,就是咱們建立的模型是否真的能代表現(xiàn)有的因變量與自變量關(guān)系,這個驗(yàn)證標(biāo)準(zhǔn)一般就選用擬合優(yōu)度。

擬合優(yōu)度是指回歸方程對觀測值的擬合程度。度量擬合優(yōu)度的統(tǒng)計(jì)量是判定系數(shù)R^2。R^2的取值范圍是[0,1]。R^2的值越接近1,說明回歸方程對觀測值的擬合程度越好;反之,R^2的值越接近0,說明回歸方程對觀測值的擬合程度越差。

擬合優(yōu)度問題目前還沒有找到統(tǒng)一的標(biāo)準(zhǔn)說大于多少就代表模型準(zhǔn)確,一般默認(rèn)大于0.8即可

擬合優(yōu)度的公式:R^2 = 1 - RSS/TSS

注: RSS 離差平方和 ; TSS 總體平方和

理解擬合優(yōu)度的公式前,需要先了解清楚幾個概念:總體平方和、離差平方和、回歸平方和。

一、總體平方和、離差平方和、回歸平方和

回歸平方和 ESS,殘差平方和 RSS,總體平方和 TSS

TSS(Total Sum of Squares)表示實(shí)際值與期望值的離差平方和,代表變量的總變動程度

ESS(Explained Sum of Squares)表示預(yù)測值與期望值的離差平方和,代表預(yù)測模型擁有的變量變動程度

RSS(Residual Sum of Squares)表示實(shí)際值與預(yù)測值的離差平方和,代表變量的未知變動程度

各個平方和的計(jì)算公式如下:

python 線性回歸分析模型檢驗(yàn)標(biāo)準(zhǔn)--擬合優(yōu)度詳解

二、擬合優(yōu)度

接上一節(jié)內(nèi)容可知,我們拿實(shí)際值與期望值的離差平方和作為整體變量的總變動程度,這個變動程度就是我們建模型的目的,我們建立模型就是為了模擬這個變動程度。

建立模型后,整體變量的總變動程度(TSS)可以劃分為兩部分:模型模擬的變動程度(ESS)和未知的變動程度(RSS)

通常來說,預(yù)測模型擁有的變量變動程度在總變動程度中的占比越高,代表模型越準(zhǔn)確,當(dāng)RSS=0時,表示模型能完全模擬變量的總變動。

回到文章開頭的擬合優(yōu)度公式:R^2 = 1 - RSS/TSS 。是不是很好理解了!

假設(shè)R^2 = 0.8,意味著咱們建立的模型擁有的變動程度能模擬80%的總變動程度,剩下20%為未知變動。

三、例子

對于學(xué)生而言,現(xiàn)在要探索一下學(xué)生的學(xué)習(xí)成績與單一的學(xué)習(xí)時間是否有關(guān)系,給出兩組數(shù)據(jù)如下:

'學(xué)習(xí)時間':[0.50,0.75,1.00,1.25,1.50,1.75,1.75, 2.00,2.25,2.50,2.75,3.00,3.25,3.50,4.00,4.25,4.50,4.75,5.00,5.50],

'分?jǐn)?shù)':[10,22,13,43,20,22,33,50,62,48,55,75,62,73,81,76,64,82,90,93]

常識理解,學(xué)習(xí)時間越長,分?jǐn)?shù)一般都會越高,兩者是正比關(guān)系,因?yàn)榫鸵粋€自變量,直接用sklearn,算出截距和斜率即可

import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
from pandas import DataFrame,Series
from sklearn.cross_validation import train_test_split
from sklearn.linear_model import LinearRegression
 
#創(chuàng)建數(shù)據(jù)集
examDict = {'學(xué)習(xí)時間':[0.50,0.75,1.00,1.25,1.50,1.75,1.75,
           2.00,2.25,2.50,2.75,3.00,3.25,3.50,4.00,4.25,4.50,4.75,5.00,5.50],
       '分?jǐn)?shù)':[10,22,13,43,20,22,33,50,62,
          48,55,75,62,73,81,76,64,82,90,93]}
 
#轉(zhuǎn)換為DataFrame的數(shù)據(jù)格式
examDf = DataFrame(examDict)
#examDf
#繪制散點(diǎn)圖
plt.scatter(examDf.分?jǐn)?shù),examDf.學(xué)習(xí)時間,color = 'b',label = "Exam Data")
 
#添加圖的標(biāo)簽(x軸,y軸)
plt.xlabel("Hours")
plt.ylabel("Score")
#顯示圖像
plt.show()
 
#將原數(shù)據(jù)集拆分訓(xùn)練集和測試集
exam_X = examDf.學(xué)習(xí)時間
exam_Y = examDf.分?jǐn)?shù)
X_train,X_test,Y_train,Y_test = train_test_split(exam_X,exam_Y,train_size=0.8)
#X_train為訓(xùn)練數(shù)據(jù)標(biāo)簽,X_test為測試數(shù)據(jù)標(biāo)簽,exam_X為樣本特征,exam_y為樣本標(biāo)簽,train_size 訓(xùn)練數(shù)據(jù)占比
 
print("原始數(shù)據(jù)特征:",exam_X.shape,
   ",訓(xùn)練數(shù)據(jù)特征:",X_train.shape,
   ",測試數(shù)據(jù)特征:",X_test.shape)
 
print("原始數(shù)據(jù)標(biāo)簽:",exam_Y.shape,
   ",訓(xùn)練數(shù)據(jù)標(biāo)簽:",Y_train.shape,
   ",測試數(shù)據(jù)標(biāo)簽:",Y_test.shape)
 
model = LinearRegression()
 
#對于模型錯誤我們需要把我們的訓(xùn)練集進(jìn)行reshape操作來達(dá)到函數(shù)所需要的要求
# model.fit(X_train,Y_train)
 
#reshape如果行數(shù)=-1的話可以使我們的數(shù)組所改的列數(shù)自動按照數(shù)組的大小形成新的數(shù)組
#因?yàn)閙odel需要二維的數(shù)組來進(jìn)行擬合但是這里只有一個特征所以需要reshape來轉(zhuǎn)換為二維數(shù)組
X_train = X_train.values.reshape(-1,1)
X_test = X_test.values.reshape(-1,1)
 
model.fit(X_train,Y_train)
a = model.intercept_#截距
b = model.coef_#回歸系數(shù)
print("最佳擬合線:截距",a,",回歸系數(shù):",b)
 

接下來算出擬合優(yōu)度看看 ,擬合優(yōu)度0.83,符合要求

# 用訓(xùn)練集進(jìn)行擬合優(yōu)度,驗(yàn)證回歸方程是否合理
def get_lr_stats(x, y, model):
  message0 = '一元線性回歸方程為: '+'\ty' + '=' + str(model.intercept_)+' + ' +str(model.coef_[0]) + '*x'
  from scipy import stats
  n = len(x)
  y_prd = model.predict(x)
  Regression = sum((y_prd - np.mean(y))**2) # 回歸平方和
  Residual  = sum((y - y_prd)**2)     # 殘差平方和
  total = sum((y-np.mean(y))**2) #總體平方和
  R_square  = 1-Residual / total # 相關(guān)性系數(shù)R^2
  message1 = ('相關(guān)系數(shù)(R^2): ' + str(R_square) + ';' + '\n'+ '總體平方和(TSS): ' + str(total) + ';' + '\n')
  message2 = ('回歸平方和(RSS): ' + str(Regression) + ';' + '\n殘差平方和(ESS): ' + str(Residual) + ';' + '\n')
  return print(message0 +'\n' +message1 + message2 )
 
get_lr_stats(X_train,Y_train,model)

python 線性回歸分析模型檢驗(yàn)標(biāo)準(zhǔn)--擬合優(yōu)度詳解

如果需要,可以把所有點(diǎn)和回歸直線畫出來,直觀感受一下

#訓(xùn)練數(shù)據(jù)的預(yù)測值
y_train_pred = model.predict(X_train)
#繪制最佳擬合線:標(biāo)簽用的是訓(xùn)練數(shù)據(jù)集中的極值預(yù)測值
X_train_pred = [min(X_train),max(X_train)]
y_train_pred = [a+b*min(X_train),a+b*max(X_train)]
plt.plot(X_train_pred, y_train_pred, color='green', linewidth=3, label="best line")
 
#測試數(shù)據(jù)散點(diǎn)圖
plt.scatter(X_test, Y_test, color='red', label="test data")
plt.scatter(X_train, Y_train, color="blue", label="train data")
 
#添加圖標(biāo)標(biāo)簽
plt.legend(loc=2)
plt.xlabel("Hours")
plt.ylabel("Score")
#顯示圖像
plt.savefig("lines.jpg")
plt.show()
#計(jì)算擬合優(yōu)度
score = model.score(X_test,Y_test)
print(score)

python 線性回歸分析模型檢驗(yàn)標(biāo)準(zhǔn)--擬合優(yōu)度詳解

以上這篇python 線性回歸分析模型檢驗(yàn)標(biāo)準(zhǔn)--擬合優(yōu)度詳解就是小編分享給大家的全部內(nèi)容了,希望能給大家一個參考,也希望大家多多支持億速云。

向AI問一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI