5-7 多元线性回归

1. 多元线性回归的正规方程解

5-7 多元线性回归_第1张图片

每个样本有多个特征


向量化

5-7 多元线性回归_第2张图片, 其中X_b是样本矩阵X前面加上一列1

\hat y = X_b \cdot \theta

目标: 使(y - X_b \cdot \theta)^T(y-X_b \cdot \theta)尽可能的小---向量化了,提高运算效率

多元线性回归的正规方程解:

求出: \theta=(X_b^TX_b)^{-1}X_b^Ty

缺点: 时间复杂度高:O(n^3)

优点:不需要考虑量纲的问题


2. 多元线性回归的实现

5-7 多元线性回归_第3张图片

每个系数对应一个特征,系数可以用于描述每个特征对于结果的贡献程度

所以实现的时候是将截距和系数分开返回给用户

封装成类:

import numpy as np
from sklearn.metrics import r2_score #r^2评价方式(取值范围是0-1,越大说明性能越好)


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]

        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):
        """返回表示X_predict的结果向量"""
        assert self.coef_ is not None and self.interception_ is not None
        assert X_predict.shape[1] == len(self.coef_)

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

        return y_predict


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

    def __repr__(self):
        """多元线性回归"""

调用:

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)

# 模型
from LinearRegression import LinearRegression

reg = LinearRegression()
reg.fit_normal(X_train, y_train)
print(reg.coef_)

print(reg.score(X_test, y_test))

3. sklearn中的调用

from sklearn.linear_model import LinearRegression
reg = LinearRegression()
reg.fit(X_train, y_train)

# 查看系数和截距
print(reg.coef_)
print(reg.intercept_)

print(reg.score(X_test, y_test))

4. 使用KNN解决回归问题

from sklearn.neighbors import KNeighborsRegressor

使用网格搜索确定最好的超参数(from sklearn.model_selection import GridSearchCV)


5. 线性回归的可解释性

可以通过可解释性采集有助于分类的更多特征


6. 线性回归特点总结

典型的参数学习

只能解决回归问题

对数据有假设,线性

对数据具有强解释性

对比KNN:

非参数学习

回归分类问题都能解决

对数据没有假设

前面都是使用多元线性回归的正规方程解,复杂度大

后面将介绍梯度下降法

你可能感兴趣的:(5-7 多元线性回归)