sklearn+python:線性回歸案例
使用一階線性方程預(yù)測(cè)波士頓房?jī)r(jià)
載入的數(shù)據(jù)是隨sklearn一起發(fā)布的,來(lái)自boston 1993年之前收集的506個(gè)房屋的數(shù)據(jù)和價(jià)格。load_boston()用于載入數(shù)據(jù)。
from sklearn.datasets import load_boston
from sklearn.model_selection import train_test_split
import time
from sklearn.linear_model import LinearRegression
boston = load_boston()
X = boston.data
y = boston.target
print("X.shape:{}. y.shape:{}".format(X.shape, y.shape))
print('boston.feature_name:{}'.format(boston.feature_names))
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=3)
model = LinearRegression()
start = time.clock()
model.fit(X_train, y_train)
train_score = model.score(X_train, y_train)
cv_score = model.score(X_test, y_test)
print('time used:{0:.6f}; train_score:{1:.6f}, sv_score:{2:.6f}'.format((time.clock()-start),
train_score, cv_score))
輸出內(nèi)容為:
X.shape:(506, 13). y.shape:(506,) boston.feature_name:['CRIM' 'ZN' 'INDUS' 'CHAS' 'NOX' 'RM' 'AGE' 'DIS' 'RAD' 'TAX' 'PTRATIO' 'B' 'LSTAT'] time used:0.012403; train_score:0.723941, sv_score:0.794958
可以看到測(cè)試集上準(zhǔn)確率并不高,應(yīng)該是欠擬合。
使用多項(xiàng)式做線性回歸
上面的例子是欠擬合的,說(shuō)明模型太簡(jiǎn)單,無(wú)法擬合數(shù)據(jù)的情況。現(xiàn)在增加模型復(fù)雜度,引入多項(xiàng)式。
打個(gè)比方,如果原來(lái)的特征是[a, b]兩個(gè)特征,
在degree為2的情況下, 多項(xiàng)式特征變?yōu)閇1, a, b, a^2, ab, b^2]。degree為其它值的情況依次類推。
多項(xiàng)式特征相當(dāng)于增加了數(shù)據(jù)和模型的復(fù)雜性,能夠更好的擬合。
下面的代碼使用Pipeline把多項(xiàng)式特征和線性回歸特征連起來(lái),最終測(cè)試degree在1、2、3的情況下的得分。
from sklearn.datasets import load_boston
from sklearn.model_selection import train_test_split
import time
from sklearn.linear_model import LinearRegression
from sklearn.preprocessing import PolynomialFeatures
from sklearn.pipeline import Pipeline
def polynomial_model(degree=1):
polynomial_features = PolynomialFeatures(degree=degree, include_bias=False)
linear_regression = LinearRegression(normalize=True)
pipeline = Pipeline([('polynomial_features', polynomial_features),
('linear_regression', linear_regression)])
return pipeline
boston = load_boston()
X = boston.data
y = boston.target
print("X.shape:{}. y.shape:{}".format(X.shape, y.shape))
print('boston.feature_name:{}'.format(boston.feature_names))
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=3)
for i in range(1,4):
print( 'degree:{}'.format( i ) )
model = polynomial_model(degree=i)
start = time.clock()
model.fit(X_train, y_train)
train_score = model.score(X_train, y_train)
cv_score = model.score(X_test, y_test)
print('time used:{0:.6f}; train_score:{1:.6f}, sv_score:{2:.6f}'.format((time.clock()-start),
train_score, cv_score))
輸出結(jié)果為:
X.shape:(506, 13). y.shape:(506,) boston.feature_name:['CRIM' 'ZN' 'INDUS' 'CHAS' 'NOX' 'RM' 'AGE' 'DIS' 'RAD' 'TAX' 'PTRATIO' 'B' 'LSTAT'] degree:1 time used:0.003576; train_score:0.723941, sv_score:0.794958 degree:2 time used:0.030123; train_score:0.930547, sv_score:0.860465 degree:3 time used:0.137346; train_score:1.000000, sv_score:-104.429619
可以看到degree為1和上面不使用多項(xiàng)式是一樣的。degree為3在訓(xùn)練集上的得分為1,在測(cè)試集上得分是負(fù)數(shù),明顯過(guò)擬合了。
所以最終應(yīng)該選擇degree為2的模型。
二階多項(xiàng)式比一階多項(xiàng)式好的多,但是測(cè)試集和訓(xùn)練集上的得分仍有不少差距,這可能是數(shù)據(jù)不夠的原因,需要更多的訊據(jù)才能進(jìn)一步提高模型的準(zhǔn)確度。
正規(guī)方程解法和梯度下降的比較
除了梯度下降法來(lái)逼近最優(yōu)解,也可以使用正規(guī)的方程解法直接計(jì)算出最終的解來(lái)。
根據(jù)吳恩達(dá)的課程,線性回歸最優(yōu)解為:
theta = (X^T * X)^-1 * X^T * y
其實(shí)兩種方法各有優(yōu)缺點(diǎn):
梯度下降法:
缺點(diǎn):需要選擇學(xué)習(xí)率,需要多次迭代
優(yōu)點(diǎn):特征值很多(1萬(wàn)以上)時(shí)仍然能以不錯(cuò)的速度工作
正規(guī)方程解法:
優(yōu)點(diǎn):不需要設(shè)置學(xué)習(xí)率,不需要多次迭代
缺點(diǎn):需要計(jì)算X的轉(zhuǎn)置和逆,復(fù)雜度O3;特征值很多(1萬(wàn)以上)時(shí)特變慢
在分類等非線性計(jì)算中,正規(guī)方程解法并不適用,所以梯度下降法適用范圍更廣。
以上這篇sklearn+python:線性回歸案例就是小編分享給大家的全部?jī)?nèi)容了,希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。
- python 實(shí)現(xiàn)一個(gè)簡(jiǎn)單的線性回歸案例
- python 還原梯度下降算法實(shí)現(xiàn)一維線性回歸
- 如何在python中實(shí)現(xiàn)線性回歸
- Python 線性回歸分析以及評(píng)價(jià)指標(biāo)詳解
- python使用梯度下降算法實(shí)現(xiàn)一個(gè)多線性回歸
- python 線性回歸分析模型檢驗(yàn)標(biāo)準(zhǔn)--擬合優(yōu)度詳解
- 關(guān)于多元線性回歸分析——Python&SPSS
- python用線性回歸預(yù)測(cè)股票價(jià)格的實(shí)現(xiàn)代碼
- 8種用Python實(shí)現(xiàn)線性回歸的方法對(duì)比詳解
- Python實(shí)現(xiàn)的簡(jiǎn)單線性回歸算法實(shí)例分析
- 如何用Python徒手寫(xiě)線性回歸
相關(guān)文章
python如何實(shí)現(xiàn)讀取并顯示圖片(不需要圖形界面)
這篇文章主要介紹了python如何實(shí)現(xiàn)讀取并顯示圖片,文中示例代碼非常詳細(xì),幫助大家更好的理解和學(xué)習(xí),感興趣的朋友可以了解下2020-07-07
Python實(shí)現(xiàn)掃描局域網(wǎng)活動(dòng)ip(掃描在線電腦)
這篇文章主要介紹了Python實(shí)現(xiàn)掃描局域網(wǎng)活動(dòng)ip(掃描在線電腦),本文直接給出實(shí)現(xiàn)代碼,需要的朋友可以參考下2015-04-04
python獲取命令行輸入?yún)?shù)列表的實(shí)例代碼
今天小編就為大家分享一篇python獲取命令行輸入?yún)?shù)列表的實(shí)例代碼,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2018-06-06
Python初學(xué)者常見(jiàn)錯(cuò)誤詳解
這篇文章主要介紹了Python初學(xué)者常見(jiàn)錯(cuò)誤詳解,即便是有編程經(jīng)驗(yàn)的程序員,也容易按照固有的思維和語(yǔ)法格式來(lái)寫(xiě) Python 代碼,需要的朋友可以參考下2019-07-07
Python連接MySQL數(shù)據(jù)庫(kù)的四種方法
用?Python?連接到?MySQL?數(shù)據(jù)庫(kù)的方法不是很系統(tǒng),實(shí)際中有幾種不同的連接方法,而且不是所有的方法都能與不同的操作系統(tǒng)很好地配合,本文涵蓋了四種方法,你可以用它們來(lái)連接你的Python應(yīng)用程序和MySQL,需要的朋友可以參考下2024-08-08
python日期時(shí)間轉(zhuǎn)為字符串或者格式化輸出的實(shí)例
今天小編就為大家分享一篇python日期時(shí)間轉(zhuǎn)為字符串或者格式化輸出的實(shí)例,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2018-05-05

