Python機(jī)器學(xué)習(xí)(二):線性回歸算法

Jacob的 Python機(jī)器學(xué)習(xí)系列:
Python機(jī)器學(xué)習(xí)(一):kNN算法
Python機(jī)器學(xué)習(xí)(二):線性回歸算法
Python機(jī)器學(xué)習(xí)(三):梯度下降法
Python機(jī)器學(xué)習(xí)(四):PCA 主成分分析
Python機(jī)器學(xué)習(xí)(五):SVM 支撐向量機(jī)

機(jī)器學(xué)習(xí)研究的問(wèn)題分為分類問(wèn)題回歸問(wèn)題络断。分類問(wèn)題很好理解突想,而回歸問(wèn)題就是找到一條曲線,可以最大程度地?cái)M合樣本特征和樣本輸出標(biāo)記之間的關(guān)系臊泰。當(dāng)給算法一個(gè)輸入時(shí)号俐,這條曲線可以計(jì)算出相應(yīng)可能的輸出寞秃≈娴郏回歸算法最簡(jiǎn)單的就是線性回歸斯嚎。當(dāng)樣本特征只有一個(gè)時(shí)饭尝,稱為簡(jiǎn)單線性回歸肯腕;當(dāng)樣本特征有多個(gè)時(shí),稱為多元線性回歸钥平。

線性回歸

1.簡(jiǎn)單線性回歸

由上圖可知实撒,簡(jiǎn)單線性回歸只有一個(gè)特征x,一個(gè)標(biāo)記y涉瘾。假定x和y之間具有類似于線性的關(guān)系知态,就可以使用使用簡(jiǎn)單線性回歸算法。假定我們找到了最佳擬合的直線方程

最佳擬合的直線方程

則對(duì)于每一個(gè)樣本點(diǎn)x(i)立叛,預(yù)測(cè)值如下负敏。其中帶箭頭的y是預(yù)測(cè)值,稱為 y head秘蛇。右上角的 i 是指樣本的索引其做。
預(yù)測(cè)值

我們希望預(yù)測(cè)值和真實(shí)值之間的差距盡量小。一般用歐氏距離來(lái)衡量赁还。下式稱為損失函數(shù)(Loss Function)
損失函數(shù)

換句話說(shuō)妖泄,我們的目標(biāo)就是找到一組a和b,使得下式最小
y(i)和x(i)是固定的

通過(guò)分析不同的問(wèn)題艘策,我們需要確定問(wèn)題的損失函數(shù)蹈胡。通過(guò)最優(yōu)化損失函數(shù),獲得機(jī)器學(xué)習(xí)的模型朋蔫。幾乎所有的參數(shù)學(xué)習(xí)算法都是這樣的套路

那么這個(gè)問(wèn)題是一個(gè)典型的最小二乘法問(wèn)題罚渐,即最小化誤差的平方。推導(dǎo)可得以下公式


最小二乘法

可以用python封裝成這種形式

"""
Created by 楊幫杰 on 10/1/18
Right to use this code in any way you want without
warranty, support or any guarantee of it working
E-mail: yangbangjie1998@qq.com
Association: SCAU 華南農(nóng)業(yè)大學(xué)
"""

import numpy as np

class SimpleLinearRegression:

    def __init__(self):
        """初始化Simple Linear Regression 模型"""
        self.a_ = None
        self.b_ = None

    def fit(self, x_train, y_train):
        """根據(jù)訓(xùn)練數(shù)據(jù)集x_train,y_train訓(xùn)練Simple Linear Regression 模型"""
        assert x_train.nidm == 1, \
            "Simple Linear Regressor can only solve single feature training data."
        assert len(x_train) == len(y_train), \
            "the size of x_train must be equal to the size of y_train"

        x_mean = np.mean(x_train)
        y_mean = np.mean(y_train)

        """進(jìn)行向量化可以加快訓(xùn)練速度"""
        # num = 0.0
        # d = 0.0
        # for x, y in zip(x_train, y_train):
        #     num += (x - x_mean) * (y - y_mean)
        #     d += (x - x_mean) ** 2

        num = (x_train - x_mean).dot(y_train - y_mean)
        d = (x_train - x_mean).dot(x_train - x_mean)

        self.a_ = num/d
        self.b_ = y_mean - self.a_ * x_mean

        return self

    def predict(self, x_predict):
        """給定待預(yù)測(cè)數(shù)據(jù)集x_predict, 返回表示x_predict的結(jié)果向量"""
        assert x_predict.ndim == 1, \
            "Simeple Linear Regressor can only solve single feature training data."
        assert self.a_ is not None and self.b_ is not None, \
            "must fit before predict!"

        return np.array([self._predict(x) for x in x_predict])

    def _predict(self, x_single):
        """給定單個(gè)待預(yù)測(cè)數(shù)據(jù)x_single, 返回x_single的預(yù)測(cè)結(jié)果值"""
        return self.a_ * x_single + self.b_

    def __repr__(self):
        return "SimpleLinearRegression()"

衡量線性回歸模型好壞有多個(gè)標(biāo)準(zhǔn)驯妄,均方誤差(Mean Squared Error)荷并、均方根誤差(Root Mean Squared Error)、平均絕對(duì)誤差(Mean Absolute Error)等富玷。一般使用MSE璧坟。


均方誤差MSE
均方根誤差RMSE

平均絕對(duì)誤差MAE

而如果想像分類問(wèn)題一樣將評(píng)判得分限制在0和1之間既穆,則應(yīng)該使用R Square

R Square

右邊一項(xiàng)的分子代表使用模型產(chǎn)生的錯(cuò)誤,分母代表使用平均值進(jìn)行預(yù)測(cè)產(chǎn)生的錯(cuò)誤雀鹃。分母也可以理解為一個(gè)模型幻工,稱為Baseline Model

R Square的輸出分為以下幾種情況:

  • R^2 = 1黎茎,則模型不犯任何錯(cuò)誤囊颅,完美
  • R^2 = 0,模型為基準(zhǔn)模型傅瞻,相當(dāng)于沒訓(xùn)練過(guò)
  • R^2 < 0踢代,數(shù)據(jù)可能不存在任何線性關(guān)系

2.多元線性回歸

多元線性回歸,就是指樣本特征值有多個(gè)。根據(jù)這多個(gè)特征值來(lái)預(yù)測(cè)樣本的標(biāo)記值嗅骄。那么特征X和參數(shù)Θ就是一個(gè)向量胳挎。

多元線性回歸

相類似地,我們需要找到一個(gè)損失函數(shù)溺森。我們需要找到一組參數(shù)Θ慕爬,使下式盡可能小


損失函數(shù)

預(yù)測(cè)值有n個(gè)參數(shù)

為了方便進(jìn)行矩陣運(yùn)算,我們寫成這種形式


X0不是特征輸入屏积!

預(yù)測(cè)值可以寫成這種形式


預(yù)測(cè)值和參數(shù)是n維向量医窿,X是n維矩陣

X展開是這個(gè)樣子。每一行是一個(gè)樣本點(diǎn)炊林,每一列(除了第一列)是一種特征
展開

經(jīng)過(guò)推導(dǎo)姥卢,得到這樣一個(gè)公式。這成為多元線性回歸的正規(guī)方程解(Normal Equation)渣聚。結(jié)果就是參數(shù)向量独榴。

我也不知道怎么來(lái)的

Θ0就是簡(jiǎn)單線性回歸中的b

如上,可以封裝成這種形式

"""
Created by 楊幫杰 on 10/1/18
Right to use this code in any way you want without
warranty, support or any guarantee of it working
E-mail: yangbangjie1998@qq.com
Association: SCAU 華南農(nóng)業(yè)大學(xué)
"""

import numpy as np

class LinearRegression:

    def __init__(self):
        """初始化Linear Regression模型"""
        self.coef_ = None
        self.interception_ = None
        self._theta = None

    def fit_normal(self, X_train, y_train):
        """根據(jù)訓(xùn)練數(shù)據(jù)集X_train, y_train訓(xùn)練Linear Regression模型"""
        assert X_train.shape[0] == y_train.shape[0], \
            "the size of X_train must be equal to the size of y_train"

        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):
        """給定待預(yù)測(cè)數(shù)據(jù)集X_predict, 返回表示X_predict的結(jié)果向量"""
        assert self.interception_ is not None and self.coef_ is not None, \
            "must fit before predict!"
        assert X_predict.shape[1] == len(self.coef_), \
            "the feature number of X_predict must be equal to X_train"

        X_b = np.hstack([np.ones((len(X_predict), 1)), X_predict])

        return X_b.dot(self._theta)

    def __repr__(self):
        return "LinearRegression()"

sciki-learn中使用線性回歸如下

"""
Created by 楊幫杰 on 10/1/18
Right to use this code in any way you want without
warranty, support or any guarantee of it working
E-mail: yangbangjie1998@qq.com
Association: SCAU 華南農(nóng)業(yè)大學(xué)
"""

from sklearn import datasets
from sklearn.model_selection import train_test_split
from sklearn.linear_model import LinearRegression

# 加載波士頓房?jī)r(jià)的數(shù)據(jù)集
boston = datasets.load_boston()

# 清除一些不合理的數(shù)據(jù)
X = boston.data
y = boston.target

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

# 分離出測(cè)試集并擬合
X_train, X_test, y_train, y_test = train_test_split(X, y)

lin_reg = LinearRegression()

lin_reg.fit(X_train, y_train)

# 打印結(jié)果
print(lin_reg.coef_)
print(lin_reg.intercept_)
print(lin_reg.score(X_test, y_test))

輸出如下

打印結(jié)果

3.總結(jié)

線性回歸是許多其他回歸和分類問(wèn)題的基礎(chǔ)饵逐。

它最大的優(yōu)點(diǎn)是對(duì)數(shù)據(jù)具有很強(qiáng)的解釋性括眠。比如某一項(xiàng)的參數(shù)是正數(shù),那么很可能這個(gè)特征和樣本標(biāo)記之間成正相關(guān)倍权,反之成負(fù)相關(guān)掷豺。

優(yōu)點(diǎn):

  1. 思想簡(jiǎn)單,實(shí)現(xiàn)容易
  2. 是許多非線性模型的基礎(chǔ)
  3. 具有很好的可解釋性

缺點(diǎn):

  1. 假設(shè)特征和標(biāo)記之間有線性關(guān)系薄声,現(xiàn)實(shí)中不一定
  2. 訓(xùn)練的時(shí)間復(fù)雜度比較高

References:
Python3 入門機(jī)器學(xué)習(xí) 經(jīng)典算法與應(yīng)用 —— liuyubobobo
機(jī)器學(xué)習(xí)實(shí)戰(zhàn) —— Peter Harrington

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末当船,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子默辨,更是在濱河造成了極大的恐慌德频,老刑警劉巖,帶你破解...
    沈念sama閱讀 217,406評(píng)論 6 503
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件缩幸,死亡現(xiàn)場(chǎng)離奇詭異壹置,居然都是意外死亡竞思,警方通過(guò)查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,732評(píng)論 3 393
  • 文/潘曉璐 我一進(jìn)店門钞护,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)盖喷,“玉大人,你說(shuō)我怎么就攤上這事难咕】问幔” “怎么了?”我有些...
    開封第一講書人閱讀 163,711評(píng)論 0 353
  • 文/不壞的土叔 我叫張陵余佃,是天一觀的道長(zhǎng)暮刃。 經(jīng)常有香客問(wèn)我,道長(zhǎng)爆土,這世上最難降的妖魔是什么椭懊? 我笑而不...
    開封第一講書人閱讀 58,380評(píng)論 1 293
  • 正文 為了忘掉前任,我火速辦了婚禮雾消,結(jié)果婚禮上灾搏,老公的妹妹穿的比我還像新娘挫望。我一直安慰自己立润,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,432評(píng)論 6 392
  • 文/花漫 我一把揭開白布媳板。 她就那樣靜靜地躺著桑腮,像睡著了一般。 火紅的嫁衣襯著肌膚如雪蛉幸。 梳的紋絲不亂的頭發(fā)上破讨,一...
    開封第一講書人閱讀 51,301評(píng)論 1 301
  • 那天,我揣著相機(jī)與錄音奕纫,去河邊找鬼提陶。 笑死,一個(gè)胖子當(dāng)著我的面吹牛匹层,可吹牛的內(nèi)容都是我干的隙笆。 我是一名探鬼主播,決...
    沈念sama閱讀 40,145評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼升筏,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼撑柔!你這毒婦竟也來(lái)了?” 一聲冷哼從身側(cè)響起您访,我...
    開封第一講書人閱讀 39,008評(píng)論 0 276
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤铅忿,失蹤者是張志新(化名)和其女友劉穎,沒想到半個(gè)月后灵汪,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體檀训,經(jīng)...
    沈念sama閱讀 45,443評(píng)論 1 314
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡柑潦,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,649評(píng)論 3 334
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了峻凫。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片妒茬。...
    茶點(diǎn)故事閱讀 39,795評(píng)論 1 347
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖蔚晨,靈堂內(nèi)的尸體忽然破棺而出乍钻,到底是詐尸還是另有隱情,我是刑警寧澤铭腕,帶...
    沈念sama閱讀 35,501評(píng)論 5 345
  • 正文 年R本政府宣布银择,位于F島的核電站,受9級(jí)特大地震影響累舷,放射性物質(zhì)發(fā)生泄漏浩考。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,119評(píng)論 3 328
  • 文/蒙蒙 一被盈、第九天 我趴在偏房一處隱蔽的房頂上張望析孽。 院中可真熱鬧,春花似錦只怎、人聲如沸袜瞬。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,731評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)邓尤。三九已至,卻和暖如春贴谎,著一層夾襖步出監(jiān)牢的瞬間汞扎,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 32,865評(píng)論 1 269
  • 我被黑心中介騙來(lái)泰國(guó)打工擅这, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留澈魄,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 47,899評(píng)論 2 370
  • 正文 我出身青樓仲翎,卻偏偏與公主長(zhǎng)得像痹扇,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子谭确,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,724評(píng)論 2 354

推薦閱讀更多精彩內(nèi)容