欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

Python數(shù)據(jù)擬合與廣義線性回歸算法學(xué)習(xí)

 更新時(shí)間:2021年04月20日 09:55:42   作者:lsldd  
這篇文章主要為大家詳細(xì)介紹了Python數(shù)據(jù)擬合與廣義線性回歸算法,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下

機(jī)器學(xué)習(xí)中的預(yù)測問題通常分為2類:回歸與分類。

簡單的說回歸就是預(yù)測數(shù)值,而分類是給數(shù)據(jù)打上標(biāo)簽歸類。

本文講述如何用Python進(jìn)行基本的數(shù)據(jù)擬合,以及如何對擬合結(jié)果的誤差進(jìn)行分析。

本例中使用一個(gè)2次函數(shù)加上隨機(jī)的擾動(dòng)來生成500個(gè)點(diǎn),然后嘗試用1、2、100次方的多項(xiàng)式對該數(shù)據(jù)進(jìn)行擬合。

擬合的目的是使得根據(jù)訓(xùn)練數(shù)據(jù)能夠擬合出一個(gè)多項(xiàng)式函數(shù),這個(gè)函數(shù)能夠很好的擬合現(xiàn)有數(shù)據(jù),并且能對未知的數(shù)據(jù)進(jìn)行預(yù)測。

代碼如下:

import matplotlib.pyplot as plt 
import numpy as np 
import scipy as sp 
from scipy.stats import norm 
from sklearn.pipeline import Pipeline 
from sklearn.linear_model import LinearRegression 
from sklearn.preprocessing import PolynomialFeatures 
from sklearn import linear_model 
 
''''' 數(shù)據(jù)生成 ''' 
x = np.arange(0, 1, 0.002) 
y = norm.rvs(0, size=500, scale=0.1) 
y = y + x**2 
 
''''' 均方誤差根 ''' 
def rmse(y_test, y): 
 return sp.sqrt(sp.mean((y_test - y) ** 2)) 
 
''''' 與均值相比的優(yōu)秀程度,介于[0~1]。0表示不如均值。1表示完美預(yù)測.這個(gè)版本的實(shí)現(xiàn)是參考scikit-learn官網(wǎng)文檔 ''' 
def R2(y_test, y_true): 
 return 1 - ((y_test - y_true)**2).sum() / ((y_true - y_true.mean())**2).sum() 
 
 
''''' 這是Conway&White《機(jī)器學(xué)習(xí)使用案例解析》里的版本 ''' 
def R22(y_test, y_true): 
 y_mean = np.array(y_true) 
 y_mean[:] = y_mean.mean() 
 return 1 - rmse(y_test, y_true) / rmse(y_mean, y_true) 
 
 
plt.scatter(x, y, s=5) 
degree = [1,2,100] 
y_test = [] 
y_test = np.array(y_test) 
 
 
for d in degree: 
 clf = Pipeline([('poly', PolynomialFeatures(degree=d)), 
     ('linear', LinearRegression(fit_intercept=False))]) 
 clf.fit(x[:, np.newaxis], y) 
 y_test = clf.predict(x[:, np.newaxis]) 
 
 print(clf.named_steps['linear'].coef_) 
 print('rmse=%.2f, R2=%.2f, R22=%.2f, clf.score=%.2f' % 
  (rmse(y_test, y), 
  R2(y_test, y), 
  R22(y_test, y), 
  clf.score(x[:, np.newaxis], y)))  
  
 plt.plot(x, y_test, linewidth=2) 
  
plt.grid() 
plt.legend(['1','2','100'], loc='upper left') 
plt.show() 

該程序運(yùn)行的顯示結(jié)果如下:

[-0.16140183  0.99268453]
rmse=0.13, R2=0.82, R22=0.58, clf.score=0.82
[ 0.00934527 -0.03591245  1.03065829]
rmse=0.11, R2=0.88, R22=0.66, clf.score=0.88
[  6.07130354e-02  -1.02247150e+00   6.66972089e+01  -1.85696012e+04
......
-9.43408707e+12  -9.78954604e+12  -9.99872105e+12  -1.00742526e+13
-1.00303296e+13  -9.88198843e+12  -9.64452002e+12  -9.33298267e+12
  -1.00580760e+12]
rmse=0.10, R2=0.89, R22=0.67, clf.score=0.89
顯示出的coef_就是多項(xiàng)式參數(shù)。如1次擬合的結(jié)果為
y = 0.99268453x -0.16140183

這里我們要注意這幾點(diǎn):

1、誤差分析。

做回歸分析,常用的誤差主要有均方誤差根(RMSE)和R-平方(R2)。

RMSE是預(yù)測值與真實(shí)值的誤差平方根的均值。這種度量方法很流行(Netflix機(jī)器學(xué)習(xí)比賽的評價(jià)方法),是一種定量的權(quán)衡方法。

R2方法是將預(yù)測值跟只使用均值的情況下相比,看能好多少。其區(qū)間通常在(0,1)之間。0表示還不如什么都不預(yù)測,直接取均值的情況,而1表示所有預(yù)測跟真實(shí)結(jié)果完美匹配的情況。
R2的計(jì)算方法,不同的文獻(xiàn)稍微有不同。如本文中函數(shù)R2是依據(jù)scikit-learn官網(wǎng)文檔實(shí)現(xiàn)的,跟clf.score函數(shù)結(jié)果一致。

而R22函數(shù)的實(shí)現(xiàn)來自Conway的著作《機(jī)器學(xué)習(xí)使用案例解析》,不同在于他用的是2個(gè)RMSE的比值來計(jì)算R2。
我們看到多項(xiàng)式次數(shù)為1的時(shí)候,雖然擬合的不太好,R2也能達(dá)到0.82。2次多項(xiàng)式提高到了0.88。而次數(shù)提高到100次,R2也只提高到了0.89。

2、過擬合。

使用100次方多項(xiàng)式做擬合,效果確實(shí)是高了一些,然而該模型的據(jù)測能力卻極其差勁。
而且注意看多項(xiàng)式系數(shù),出現(xiàn)了大量的大數(shù)值,甚至達(dá)到10的12次方。
這里我們修改代碼,將500個(gè)樣本中的最后2個(gè)從訓(xùn)練集中移除。然而在測試中卻仍然測試所有500個(gè)樣本。
clf.fit(x[:498, np.newaxis], y[:498])
這樣修改后的多項(xiàng)式擬合結(jié)果如下:

[-0.17933531  1.0052037 ]
rmse=0.12, R2=0.85, R22=0.61, clf.score=0.85
[-0.01631935  0.01922011  0.99193521]
rmse=0.10, R2=0.90, R22=0.69, clf.score=0.90
...
rmse=0.21, R2=0.57, R22=0.34, clf.score=0.57

僅僅只是缺少了最后2個(gè)訓(xùn)練樣本,紅線(100次方多項(xiàng)式擬合結(jié)果)的預(yù)測發(fā)生了劇烈的偏差,R2也急劇下降到0.57。
而反觀1,2次多項(xiàng)式的擬合結(jié)果,R2反而略微上升了。

這說明高次多項(xiàng)式過度擬合了訓(xùn)練數(shù)據(jù),包括其中大量的噪音,導(dǎo)致其完全喪失了對數(shù)據(jù)趨勢的預(yù)測能力。前面也看到,100次多項(xiàng)式擬合出的系數(shù)數(shù)值無比巨大。人們自然想到通過在擬合過程中限制這些系數(shù)數(shù)值的大小來避免生成這種畸形的擬合函數(shù)。

其基本原理是將擬合多項(xiàng)式的所有系數(shù)絕對值之和(L1正則化)或者平方和(L2正則化)加入到懲罰模型中,并指定一個(gè)懲罰力度因子w,來避免產(chǎn)生這種畸形系數(shù)。
這樣的思想應(yīng)用在了嶺(Ridge)回歸(使用L2正則化)、Lasso法(使用L1正則化)、彈性網(wǎng)(Elastic net,使用L1+L2正則化)等方法中,都能有效避免過擬合。更多原理可以參考相關(guān)資料。

下面以嶺回歸為例看看100次多項(xiàng)式的擬合是否有效。將代碼修改如下:

clf = Pipeline([('poly', PolynomialFeatures(degree=d)),
                    ('linear', linear_model.Ridge ())])
clf.fit(x[:400, np.newaxis], y[:400])

結(jié)果如下:

[ 0.          0.75873781]
rmse=0.15, R2=0.78, R22=0.53, clf.score=0.78
[ 0.          0.35936882  0.52392172]
rmse=0.11, R2=0.87, R22=0.64, clf.score=0.87
[  0.00000000e+00   2.63903249e-01   3.14973328e-01   2.43389461e-01
   1.67075328e-01   1.10674280e-01   7.30672237e-02   4.88605804e-02
   ......
   3.70018540e-11   2.93631291e-11   2.32992690e-11   1.84860002e-11
   1.46657377e-11]
rmse=0.10, R2=0.90, R22=0.68, clf.score=0.90

可以看到,100次多項(xiàng)式的系數(shù)參數(shù)變得很小。大部分都接近于0.
另外值得注意的是,使用嶺回歸之類的懲罰模型后,1次和2次多項(xiàng)式回歸的R2值可能會(huì)稍微低于基本線性回歸。

然而這樣的模型,即使使用100次多項(xiàng)式,在訓(xùn)練400個(gè)樣本,預(yù)測500個(gè)樣本的情況下不僅有更小的R2誤差,而且還具備優(yōu)秀的預(yù)測能力。

以上就是本文的全部內(nèi)容,希望對大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。

相關(guān)文章

  • Pycharm運(yùn)行程序時(shí),控制臺(tái)輸出PyDev?console:starting問題

    Pycharm運(yùn)行程序時(shí),控制臺(tái)輸出PyDev?console:starting問題

    Pycharm運(yùn)行程序時(shí),控制臺(tái)輸出PyDev?console:starting問題,具有很好的參考價(jià)值,希望對大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2023-05-05
  • python爬蟲實(shí)例之獲取動(dòng)漫截圖

    python爬蟲實(shí)例之獲取動(dòng)漫截圖

    這篇文章主要給大家介紹了關(guān)于python爬蟲實(shí)例之獲取動(dòng)漫截圖的相關(guān)資料,文中通過示例代碼介紹的非常詳細(xì),對大家學(xué)習(xí)或者使用python具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面來一起學(xué)習(xí)學(xué)習(xí)吧
    2020-05-05
  • 用Python寫腳本,實(shí)現(xiàn)完全備份和增量備份的示例

    用Python寫腳本,實(shí)現(xiàn)完全備份和增量備份的示例

    下面小編就為大家分享一篇用Python寫腳本,實(shí)現(xiàn)完全備份和增量備份的示例,具有很好的參考價(jià)值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2018-04-04
  • Python面向?qū)ο箢惖睦^承實(shí)例詳解

    Python面向?qū)ο箢惖睦^承實(shí)例詳解

    這篇文章主要介紹了Python面向?qū)ο箢惖睦^承,結(jié)合實(shí)例形式詳細(xì)分析了Python面向?qū)ο蟪绦蛟O(shè)計(jì)中類的繼承原理、定義、使用方法及相關(guān)操作注意事項(xiàng),需要的朋友可以參考下
    2018-06-06
  • Python登錄并獲取CSDN博客所有文章列表代碼實(shí)例

    Python登錄并獲取CSDN博客所有文章列表代碼實(shí)例

    這篇文章主要介紹了Python登錄并獲取CSDN博客所有文章列表代碼實(shí)例,具有一定借鑒價(jià)值,需要的朋友可以參考下
    2017-12-12
  • django表單實(shí)現(xiàn)下拉框的示例講解

    django表單實(shí)現(xiàn)下拉框的示例講解

    今天小編就為大家分享一篇django表單實(shí)現(xiàn)下拉框的示例講解,具有很好的參考價(jià)值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2018-05-05
  • python內(nèi)置函數(shù)map/filter/reduce詳解

    python內(nèi)置函數(shù)map/filter/reduce詳解

    在Python中,map(), filter(), 和 reduce() 是內(nèi)置的高級函數(shù)(實(shí)際是class),用于處理可迭代對象(如列表、元組等)的元素,這篇文章主要介紹了python內(nèi)置函數(shù)map/filter/reduce的相關(guān)知識,需要的朋友可以參考下
    2024-05-05
  • python同時(shí)遍歷兩個(gè)list用法說明

    python同時(shí)遍歷兩個(gè)list用法說明

    這篇文章主要介紹了python同時(shí)遍歷兩個(gè)list用法說明,具有很好的參考價(jià)值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2020-05-05
  • pycharm 2020.2.4 pip install Flask 報(bào)錯(cuò) Error:Non-zero exit code的問題

    pycharm 2020.2.4 pip install Flask 報(bào)錯(cuò) Error:Non-zero exit co

    這篇文章主要介紹了pycharm 2020.2.4 pip install Flask 報(bào)錯(cuò) Error:Non-zero exit code,本文給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2020-12-12
  • Python利用緩存流實(shí)現(xiàn)壓縮PDF文件

    Python利用緩存流實(shí)現(xiàn)壓縮PDF文件

    在Python中,有許多庫可以用來壓縮PDF文件,其中最常用的是PyPDF2和PDFMiner,本文將為大家介紹一個(gè)新的方法,即使用緩存流壓縮PDF文件,感興趣的可以了解下
    2023-08-08

最新評論