機器學習系列(十三)——多元線性回歸及knn做回歸

多元線性回歸理論

相比于樣本只有一個特征值的簡單線性回歸徐绑,多元線性回歸往往更能反映研究對象的真實情況勾徽。多元線性回歸樣本有多個特征迫横,需要研究的是這多個特征與最終結果的關系。


多元線性回歸

如上圖所示吨凑,相比于簡單線性回歸捍歪,這里的變量x不再是單個特征,而是一個向量鸵钝,代表多個特征糙臼。
于是y與x的模型表達式可以為:
y=\theta_{0}+\theta_{1}x_{1}+\theta_{2}x_{2}+...+\theta_{n}x_{n}

對于一個樣本X^{(i)}的預測值則為:
\widehat{y}^{(i)}=\theta_{0}+\theta_{1}X_{1}^{(i)}+\theta_{2}X_{2}^{(i)}+...+\theta_{n}X_{n}^{(i)}

這與簡單線性回歸是非常一致的,區(qū)別只是特征從1個變成了n個恩商。在求解參數\theta=(\theta_{0},\theta_{1},...,\theta_{n})^{T}時也和簡單線性回歸一致变逃,求得的參數要使得:
\sum_{i=1}^m(y^{(i)}-\widehat{y}^{(i)})^{2}

盡可能小。

\begin{equation} X_怠堪= \begin{pmatrix} 1,X_{1}^{(1)} , X_{2}^{(1)},...,X_{n}^{(1)}\\1,X_{1}^{(2)} , X_{2}^{(2)},...,X_{n}^{(2)}\\...\\1,X_{1}^{(m)} , X_{2}^{(m)},...,X_{n}^{(m)} \end{pmatrix} \end{equation}

于是對一組樣本的預測結果向量為:\widehat{y}=X_揽乱\bullet\theta
同樣可以根據高等數學的知識經過簡單推導得到最優(yōu)的\theta名眉,這里不再給出過程,直接給出最優(yōu)結果(多元線性回歸的正規(guī)方程解Normal Equation):
\theta=({X_凰棉^{T}X_损拢}^{-1})X_^{T}y

通過監(jiān)督學習的數據可以很輕易得到這個解撒犀,機器學習能直接得到數學解的模型是非常少的福压,而且可以不對數據作歸一化處理。但這種方式有一個問題或舞,就是時間復雜度是O(n^{3})荆姆,盡管可以優(yōu)化到O(n^{2.4}),但時間消耗仍然是比較多的映凳。在后面的學習中我們會有計算代價更小的在機器學習中應用非常廣泛的梯度下降法來求解線性回歸模型胆筒。


實現自己的多元線性回歸

在play_Ml中新建LinearRegression.py,代碼如下:

import numpy as np
from .metrics import r2_score

class LinearRegression:
    def __init__(self):
        self.coef_ = None
        self.interception_ =None
        self._theta = None
    
    def fit_normal(self,X_train,y_train):
        assert X_train.shape[0] == y_train.shape[0],"must be equal!"
        X_b = np.hstack([np.ones((len(X_train),1)),X_train])
        self._theta = np.linalg.inv(X_b.T.dot(X_b)).dot(X_b.T).dot(y_train)
    
        self.interception_ = self._theta[0]
        
        self.coef_ = self._theta[1:]
        return self

    def predict(self,X_predict):
        assert self.interception_ is not None and self.coef_ is not None,"must fit first!"
        assert X_predict.shape[1] == len(self.coef_),"feature must be the same!"

        X_b = np.hstack([np.ones((len(X_predict),1)),X_predict])
        return X_b.dot(self._theta)

    def score(self,X_test,y_test):
        y_predict = self.predict(X_test)
        return r2_score(y_test,y_predict)
        
    def __repr__(self):
        return "LinearRegression()"

在bsoton房產數據上測試模型诈豌,使用boston房產數據的13個特征:

'''使用boston房產數據的所有特征'''
import numpy as np
import matplotlib.pyplot as plt
from sklearn import datasets
boston = datasets.load_boston()

X = boston.data
y = boston.target

X = X[y < 50.0]
y = y[y < 50.0]
'''使用自己的模型'''
from play_Ml.model_selection import train_test_split
X_train,X_test,y_train,y_test = train_test_split(X,y,seed=666)

from play_Ml.LinearRegression import LinearRegression
reg = LinearRegression()
reg.fit_normal(X_train,y_train)
'''查看求得的系數與截距'''
reg.coef_ 
reg.interception_
'''R方指標'''
reg.score(X_test,y_test)

注:上面的fit_normal方式是我們自己寫的基于正規(guī)化方程的腐泻,sklearn中的fit方式并不是正規(guī)化方程方式

coef_inter

可以看到,多元線性回歸在該數據集上R方為0.8队询,還是不錯的。這也間接反映了如果特征能很好反映與預測之間的關系的話构诚,使用更多特征蚌斩,會有更好的預測效果。


sklearn中的回歸

sklearn中的線性回歸

仍然使用和上面相同的數據集:

'''使用boston房產數據的所有特征'''
import numpy as np
import matplotlib.pyplot as plt
from sklearn import datasets
boston = datasets.load_boston()

X = boston.data
y = boston.target

X = X[y < 50.0]
y = y[y < 50.0]

from sklearn.model_selection import train_test_split
X_train,X_test,y_train,y_test = train_test_split(X,y,random_state=666)
'''這里如果用上面自己算法的train_test_split范嘱,可以在sklearn
中的fit中得到和上面一樣的系數和截距結果'''

from sklearn.linear_model import LinearRegression
lin_reg = LinearRegression()
lin_reg.fit(X_train,y_train)
lin_reg.coef_
lin_reg.intercept_
lin_reg.score(X_test,y_test)

結果如下:

result

knn做回歸

knn也是可以用來做回歸任務的送膳,下面仍然用boston房產數據,進行knn的回歸:

from sklearn.neighbors import KNeighborsRegressor

knn_reg = KNeighborsRegressor()
knn_reg.fit(X_train,y_train)
knn_reg.score(X_test,y_test)

score值是0.6丑蛤,顯然效果是不如線性回歸的叠聋,不過這只是在knn回歸默認超參數情況下,下面用網格搜索找出更優(yōu)秀的超參數:

'''定義搜索參數網格'''
param_grid=[
    {
        'weights':['uniform'],
        'n_neighbors':[i for i in range(1,11)]
        
    },
    {
        'weights':['distance'],
        'n_neighbors':[i for i in range(1,11)],
        'p':[i for i in range(1,6)]
    }
]

from sklearn.model_selection import GridSearchCV

knn_reg = KNeighborsRegressor()
grid_search = GridSearchCV(knn_reg,param_grid,n_jobs = -1,verbose = 1)
grid_search.fit(X_train,y_train)

結果如下:

knn_Regressor

score值變?yōu)?.7受裹,雖然有所提高碌补,但是和線性回歸相比還是有些差據。

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
  • 序言:七十年代末棉饶,一起剝皮案震驚了整個濱河市厦章,隨后出現的幾起案子,更是在濱河造成了極大的恐慌照藻,老刑警劉巖袜啃,帶你破解...
    沈念sama閱讀 211,348評論 6 491
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現場離奇詭異幸缕,居然都是意外死亡群发,警方通過查閱死者的電腦和手機晰韵,發(fā)現死者居然都...
    沈念sama閱讀 90,122評論 2 385
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來熟妓,“玉大人雪猪,你說我怎么就攤上這事』牵” “怎么了浪蹂?”我有些...
    開封第一講書人閱讀 156,936評論 0 347
  • 文/不壞的土叔 我叫張陵,是天一觀的道長告材。 經常有香客問我坤次,道長,這世上最難降的妖魔是什么斥赋? 我笑而不...
    開封第一講書人閱讀 56,427評論 1 283
  • 正文 為了忘掉前任缰猴,我火速辦了婚禮,結果婚禮上疤剑,老公的妹妹穿的比我還像新娘滑绒。我一直安慰自己,他們只是感情好隘膘,可當我...
    茶點故事閱讀 65,467評論 6 385
  • 文/花漫 我一把揭開白布疑故。 她就那樣靜靜地躺著,像睡著了一般弯菊。 火紅的嫁衣襯著肌膚如雪纵势。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 49,785評論 1 290
  • 那天管钳,我揣著相機與錄音钦铁,去河邊找鬼。 笑死才漆,一個胖子當著我的面吹牛牛曹,可吹牛的內容都是我干的。 我是一名探鬼主播醇滥,決...
    沈念sama閱讀 38,931評論 3 406
  • 文/蒼蘭香墨 我猛地睜開眼黎比,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了鸳玩?” 一聲冷哼從身側響起焰手,我...
    開封第一講書人閱讀 37,696評論 0 266
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎怀喉,沒想到半個月后书妻,有當地人在樹林里發(fā)現了一具尸體,經...
    沈念sama閱讀 44,141評論 1 303
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 36,483評論 2 327
  • 正文 我和宋清朗相戀三年躲履,在試婚紗的時候發(fā)現自己被綠了见间。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 38,625評論 1 340
  • 序言:一個原本活蹦亂跳的男人離奇死亡工猜,死狀恐怖米诉,靈堂內的尸體忽然破棺而出,到底是詐尸還是另有隱情篷帅,我是刑警寧澤史侣,帶...
    沈念sama閱讀 34,291評論 4 329
  • 正文 年R本政府宣布,位于F島的核電站魏身,受9級特大地震影響惊橱,放射性物質發(fā)生泄漏。R本人自食惡果不足惜箭昵,卻給世界環(huán)境...
    茶點故事閱讀 39,892評論 3 312
  • 文/蒙蒙 一税朴、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧家制,春花似錦正林、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,741評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至涵但,卻和暖如春哪亿,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背贤笆。 一陣腳步聲響...
    開封第一講書人閱讀 31,977評論 1 265
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留讨阻,地道東北人芥永。 一個月前我還...
    沈念sama閱讀 46,324評論 2 360
  • 正文 我出身青樓,卻偏偏與公主長得像钝吮,于是被迫代替她去往敵國和親埋涧。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 43,492評論 2 348

推薦閱讀更多精彩內容