python 線性回歸分析模型檢驗(yàn)標(biāo)準(zhǔn)--擬合優(yōu)度詳解
建立完回歸模型后,還需要驗(yàn)證咱們建立的模型是否合適,換句話說(shuō),就是咱們建立的模型是否真的能代表現(xiàn)有的因變量與自變量關(guān)系,這個(gè)驗(yàn)證標(biāo)準(zhǔn)一般就選用擬合優(yōu)度。
擬合優(yōu)度是指回歸方程對(duì)觀測(cè)值的擬合程度。度量擬合優(yōu)度的統(tǒng)計(jì)量是判定系數(shù)R^2。R^2的取值范圍是[0,1]。R^2的值越接近1,說(shuō)明回歸方程對(duì)觀測(cè)值的擬合程度越好;反之,R^2的值越接近0,說(shuō)明回歸方程對(duì)觀測(cè)值的擬合程度越差。
擬合優(yōu)度問(wèn)題目前還沒(méi)有找到統(tǒng)一的標(biāo)準(zhǔn)說(shuō)大于多少就代表模型準(zhǔn)確,一般默認(rèn)大于0.8即可
擬合優(yōu)度的公式:R^2 = 1 - RSS/TSS
注: RSS 離差平方和 ; TSS 總體平方和
理解擬合優(yōu)度的公式前,需要先了解清楚幾個(gè)概念:總體平方和、離差平方和、回歸平方和。
一、總體平方和、離差平方和、回歸平方和
回歸平方和 ESS,殘差平方和 RSS,總體平方和 TSS
TSS(Total Sum of Squares)表示實(shí)際值與期望值的離差平方和,代表變量的總變動(dòng)程度
ESS(Explained Sum of Squares)表示預(yù)測(cè)值與期望值的離差平方和,代表預(yù)測(cè)模型擁有的變量變動(dòng)程度
RSS(Residual Sum of Squares)表示實(shí)際值與預(yù)測(cè)值的離差平方和,代表變量的未知變動(dòng)程度
各個(gè)平方和的計(jì)算公式如下:
二、擬合優(yōu)度
接上一節(jié)內(nèi)容可知,我們拿實(shí)際值與期望值的離差平方和作為整體變量的總變動(dòng)程度,這個(gè)變動(dòng)程度就是我們建模型的目的,我們建立模型就是為了模擬這個(gè)變動(dòng)程度。
建立模型后,整體變量的總變動(dòng)程度(TSS)可以劃分為兩部分:模型模擬的變動(dòng)程度(ESS)和未知的變動(dòng)程度(RSS)
通常來(lái)說(shuō),預(yù)測(cè)模型擁有的變量變動(dòng)程度在總變動(dòng)程度中的占比越高,代表模型越準(zhǔn)確,當(dāng)RSS=0時(shí),表示模型能完全模擬變量的總變動(dòng)。
回到文章開(kāi)頭的擬合優(yōu)度公式:R^2 = 1 - RSS/TSS 。是不是很好理解了!
假設(shè)R^2 = 0.8,意味著咱們建立的模型擁有的變動(dòng)程度能模擬80%的總變動(dòng)程度,剩下20%為未知變動(dòng)。
三、例子
對(duì)于學(xué)生而言,現(xiàn)在要探索一下學(xué)生的學(xué)習(xí)成績(jī)與單一的學(xué)習(xí)時(shí)間是否有關(guān)系,給出兩組數(shù)據(jù)如下:
'學(xué)習(xí)時(shí)間':[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]
常識(shí)理解,學(xué)習(xí)時(shí)間越長(zhǎng),分?jǐn)?shù)一般都會(huì)越高,兩者是正比關(guān)系,因?yàn)榫鸵粋€(gè)自變量,直接用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í)時(shí)間':[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í)時(shí)間,color = 'b',label = "Exam Data") #添加圖的標(biāo)簽(x軸,y軸) plt.xlabel("Hours") plt.ylabel("Score") #顯示圖像 plt.show() #將原數(shù)據(jù)集拆分訓(xùn)練集和測(cè)試集 exam_X = examDf.學(xué)習(xí)時(shí)間 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為測(cè)試數(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, ",測(cè)試數(shù)據(jù)特征:",X_test.shape) print("原始數(shù)據(jù)標(biāo)簽:",exam_Y.shape, ",訓(xùn)練數(shù)據(jù)標(biāo)簽:",Y_train.shape, ",測(cè)試數(shù)據(jù)標(biāo)簽:",Y_test.shape) model = LinearRegression() #對(duì)于模型錯(cuò)誤我們需要把我們的訓(xùn)練集進(jìn)行reshape操作來(lái)達(dá)到函數(shù)所需要的要求 # model.fit(X_train,Y_train) #reshape如果行數(shù)=-1的話可以使我們的數(shù)組所改的列數(shù)自動(dòng)按照數(shù)組的大小形成新的數(shù)組 #因?yàn)閙odel需要二維的數(shù)組來(lái)進(jìn)行擬合但是這里只有一個(gè)特征所以需要reshape來(lái)轉(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)
接下來(lái)算出擬合優(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)
如果需要,可以把所有點(diǎn)和回歸直線畫出來(lái),直觀感受一下
#訓(xùn)練數(shù)據(jù)的預(yù)測(cè)值 y_train_pred = model.predict(X_train) #繪制最佳擬合線:標(biāo)簽用的是訓(xùn)練數(shù)據(jù)集中的極值預(yù)測(cè)值 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") #測(cè)試數(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)度詳解就是小編分享給大家的全部?jī)?nèi)容了,希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。
相關(guān)文章
python利用蒙版摳圖(使用PIL.Image和cv2)輸出透明背景圖
這篇文章主要介紹了python利用蒙版摳圖(使用PIL.Image和cv2)輸出透明背景圖,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2020-08-08使用Python進(jìn)行數(shù)據(jù)可視化實(shí)現(xiàn)引人注目的視覺(jué)效果
這篇文章主要介紹了使用Python進(jìn)行數(shù)據(jù)可視化實(shí)現(xiàn)引人注目的視覺(jué)效果,您將了解基本的數(shù)據(jù)可視化概念,以及如何創(chuàng)建各種引人注目的圖表和圖形,從而更好地理解和呈現(xiàn)數(shù)據(jù)2023-04-04一篇文章帶你了解python標(biāo)準(zhǔn)庫(kù)--os模塊
在本篇內(nèi)容里小編給大家整理的是關(guān)于Python中os模塊及用法相關(guān)知識(shí)點(diǎn),有興趣的朋友們可以學(xué)習(xí)下,希望能給你帶來(lái)幫助2021-08-08對(duì)python中詞典的values值的修改或新增KEY詳解
今天小編就為大家分享一篇對(duì)python中詞典的values值的修改或新增KEY詳解,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2019-01-01Python3自帶工具2to3.py 轉(zhuǎn)換 Python2.x 代碼到Python3的操作
Python3自帶工具2to3.py 轉(zhuǎn)換 Python2.x 代碼到Python3的操作方式,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2021-03-03numpy.bincount用于復(fù)數(shù)權(quán)重的方法
numpy.bincount是NumPy庫(kù)中的一個(gè)函數(shù),它用于計(jì)算整數(shù)數(shù)組中每個(gè)值的出現(xiàn)次數(shù),numpy.bincount函數(shù)在統(tǒng)計(jì)整數(shù)數(shù)組中每個(gè)值的出現(xiàn)次數(shù)或權(quán)重和時(shí)非常有用,本文給大家介紹numpy.bincount如何用于復(fù)數(shù)權(quán)重,感興趣的朋友跟隨小編一起看看吧2023-11-11Python數(shù)學(xué)建模庫(kù)StatsModels統(tǒng)計(jì)回歸簡(jiǎn)介初識(shí)
這篇文章主要為大家介紹了Python數(shù)學(xué)建模庫(kù)StatsModels統(tǒng)計(jì)回歸的基本概念,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝打擊多多進(jìn)步2021-10-10