機器學習“傻瓜式”理解(5)線性迴歸(簡單+評估+多元)

1.基礎理解:

先來講解簡單線性迴歸,通過一張圖基礎理解一下:
簡單線性迴歸基礎理解
通過對上圖的理解我們可以簡單概括一下簡單線性迴歸:
只有一個特徵,在多個數據集中我們儘可能的尋找一條直線能夠最大程度的擬合這些數據,正如圖片中所示,我們尋找除了一個目標函數,也就是損失函數,來最小化我們預測值與真實值之間的誤差。
總結線性迴歸的特點可得到:
①線性迴歸如其名,主要用於解決迴歸問題,並且它是許多非線性迴歸模型的基礎。
②線性迴歸模型的實現與推導背後有大量的數學做支撐,計算機實現較爲簡單。
③線性迴歸模型最終得出的預測結果具有很強的解釋性。
下面明確參數a與b的公式推導過程:
在這裏插入圖片描述
求b:
在這裏插入圖片描述
求解a:
在這裏插入圖片描述封裝簡單線性迴歸:

import numpy as np
'''value the model precision'''
from sklearn.metrics import r2_score

class SimpleLinearRegression:
    def __init__(self):
        self.a_ = None
        self.b_ = None

    def fit(self,X_train,y_train):
        '''check'''
        assert X_train.ndim == 1,"the dimension must be 1"
        assert len(X_train)== len(y_train),\
                "the size must be valid"

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

        self.a_ = ((X_train - x_mean).dot(y_train - y_mean)) / ((X_train - x_mean).dot(X_train - x_mean))
        self.b_ = y_mean - (self.a_ * x_mean)

        return self

    def predict(self,X_test):
        '''check'''
        assert self.a_ is not None and self.b_ is not None,\
                "predict after fit"
        assert X_test.ndim == 1,"the dimension must be 1"

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

    def _predict(self,x):
        return self.a_ * x + self.b_

    def score(self,X_test,y_test):
        y_predict = self(X_test)
        return r2_score(y_test,y_predict)

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

簡單總結一下線性迴歸
①線性迴歸與KNN算法內部實現原理不同,很明顯線性迴歸算法用於解決迴歸問題,而且是一種參數學習算法,不過度的依賴數據,通常情況下,線性迴歸算法在學習到參數以後就可以捨棄訓練數據集了。
②線性迴歸算法是其他衆多非線性迴歸算法的基礎,並且線性迴歸算法具有很強的假設性以及解釋性(這一點我們將在後面詳細闡明),而且重要的一點是,只需要稍微的改變一點線性迴歸算法就可以靈活的解決非線型問題。
③不好的一點是算法的時間複雜度十分高:O(n3)(即使優化後O(n2.4))

線性迴歸算法的解釋性(波士頓房價預測爲例)
在這裏插入圖片描述
代碼實現:

import numpy as np
from sklearn import datasets
from sklearn.linear_model import LinearRegression

boston = datasets.load_boston()
X = boston.data
y = boston.target

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

lin_model = LinearRegression()
lin_model.fit(X,y)

'''
參數解釋:
lin_model.coef_:存儲了多元項中每一個係數
lin_model.feature_names:存儲的特徵名
'''

'''對係數排序後返回的index對特徵進行排序'''
result = boston.feature_names[np.argsort(lin_model.coef_)]

print(result)

在這裏插入圖片描述
從上面得到的結果便可以看出來,每一個係數對應的特徵名都可以說明一個數據。
例如,“RM”表示房間數量,係數最大,說明房屋數量越多,房價越高。而“NOX”表示房間周圍一氧化碳的濃度,係數最小,表示其對房價的影響很小,這便是線性迴歸解釋性的重要體現。

2.評價性能

按照慣例,我們還是使用一張圖片先來解釋三個基礎的衡量算法:
在這裏插入圖片描述

再來一張:
在這裏插入圖片描述
sklearn中在metrics中封裝了四種衡量方式的計算方法,爲了更好的理解公式,我們進行封裝。

import numpy as np
from math import sqrt

def accuracy_score(y_true,y_predict):
    '''check'''
    assert y_true.shape[0] == y_predict.shape[0],\
            "the size must be valid"
    return int((np.sum(y_true == y_predict) / len(y_true)) * 100)

def mean_squared_error(y_true,y_predict):
    '''check'''
    assert len(y_true) == len(y_predict),\
            "the size must be valid"
    return np.sum((y_true - y_predict)**2) / len(y_true)

def root_mean_squared_error(y_true,y_predict):
    return sqrt(mean_squared_error(y_true,y_predict))

def mean_absolute_error(y_true,y_predict):
    '''check'''
    assert len(y_true) == len(y_predict), \
        "the size must be valid"
    return np.sum(np.absolute(y_true - y_predict)) / len(y_true)

def r2_score(y_true,y_predict):
    return 1 - mean_absolute_error(y_true,y_predict) / np.var(y_true)

3.多元線性迴歸

提示:後面會講到多項式迴歸算法,後面會解釋多元線性迴歸和多項式迴歸的區別
要點理解:
①簡單線性迴歸解決的是隻有一個特徵的問題,而多元線性迴歸如其名解決的是多維特徵的問題。
②多元特徵中每一個特徵都跟y呈線性關係,但是係數有大小正負,就像上面所列舉的波士頓房產價格預測案例所指。
③多元線性迴歸可以解決一元的問題。

多遠線性迴歸問題解決思路:
在這裏插入圖片描述

實現代碼封裝:

class LinearRegression:
    def __init__(self):
        self._theta = None
        self.interception_ = None
        self.coef_ = None

    def fit_normal(self,X_train,y_train):
        '''check'''
        assert X_train.shape[0] == y_train.shape[0],\
                "the size must be valid"

        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)
        self.coef_ = self._theta[1:]
        self.interception_ = self._theta[0]
        return self

    def predict(self,X_predict):
        '''check'''
        assert self.interception_ is not None and self.coef_ is not None,\
                "fit before predict"
        assert X_predict.shape[1] = len(self.coef_),\
                "the size must be valid"

        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()"
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章