多元线性回归--正规方程解 以及线性回归的可解释性和其他思考

文章目录

  • 一、多元线性回归
    • 1、概念以及求解
    • 2、自己实现一个多元线性回归的求解
    • 3、Knn中的 regressor
  • 二、关于线性回归的可解释性以及更多思考
    • 1、线性回归的可解释性
    • 2、更多思考
  • 三、总结


一、多元线性回归

1、概念以及求解

在现实世界中,样本通常有多个样本特征,这就需要我们构造出多元线性回归模型来模拟数据。
如:二元线性回归模型 是在三维平面中多元线性回归--正规方程解 以及线性回归的可解释性和其他思考_第1张图片

为了便于推广到向量的形式,在这里插入图片描述
多元线性回归--正规方程解 以及线性回归的可解释性和其他思考_第2张图片
求解多元线性方程的解:
多元线性回归--正规方程解 以及线性回归的可解释性和其他思考_第3张图片
多元线性回归--正规方程解 以及线性回归的可解释性和其他思考_第4张图片

在这里  seita0只是一个偏移量 与样本特征无关,而之后的n个系数则代表了每个样本特征对于最后样本值的贡献度

2、自己实现一个多元线性回归的求解

# 时间:2022/11/16 10:32
# cky
import numpy as np
from sklearn.metrics import r2_score
class LinearRegression:
    def __init__(self):
        self._theta=None
        self.interception_=None
        self.coef_=None
    def fit(self,X_train,y_train):
        assert X_train.shape[0]==y_train.shape[0],\
        "the size of X_train must be equal 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):
        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)


运用该函数

import numpy as np
from sklearn import datasets
from sklearn.model_selection import train_test_split
boston=datasets.load_boston()
X=boston.data
y=boston.target
X=X[y<50.0]
y=y[y<50.0]
X_train,X_test,y_train,y_test=train_test_split(X,y)
reg=LinearRegression()
reg.fit(X_train,y_train)
reg.predict(X_test)
reg.score(X_test,y_test)

3、Knn中的 regressor

from sklearn.neighbors import KNeighborsRegressor
knn_reg=KNeighborsRegressor()
knn_reg.fit(X_train,y_train)
knn_reg.score(X_test,y_test)

但我们知道KNN中有许多超参数,这里使用的是默认参数,并不是最好的参数
这里我们使用网格搜索

from sklearn.neighbors import KNeighborsRegressor
knn_reg=KNeighborsRegressor()
para_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  #(为了找到一个更好的模型,cv是交替验证)
grid_search=GridSearchCV(knn_reg,para_grid,n_jobs=-1)#第一个参数即对那一个分类器进行网格搜索,第二个参数是进行网格搜索的参数  
#实例化出来一个网格搜索的实例
grid_search.fit(X_train,y_train) #对训练集 根据参数集拟合出来一个最佳的模型
grid_search.best_score_  
grid_search.best_estimator_.score(X_test,y_test)  #这里是对测试数据集进行评判 但是这里的score并不是向上文一样用的r2这一个评判标准
grid_search.best_params_ #网格搜索中最佳参数 

二、关于线性回归的可解释性以及更多思考

1、线性回归的可解释性

在这里我们仍然运用波士顿的房价来具体说明可解释性是什么意思

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]
y=y[y<50]

linreg=LinearRegression()
linreg.fit(X,y)
linreg.coef_
np.argsort(linreg.coef_)   #按照参数从小到大排序 返回的是索引 
#最大的是正相关 #最小的绝对值最大的负相关
#在这里我们可以发现 RM即房间数量越多,房价越贵
#NOX即房子周围一氧化氮浓度越大 房价越低
boston.feature_names[np.argsort(linreg.coef_)]

通过参数大小我们可以发现不同样本特征对房价的影响不同,这也就说明了线性回归具有可解释性。
而Knn不具有可解释性。

2、更多思考

多元线性回归--正规方程解 以及线性回归的可解释性和其他思考_第5张图片
多元线性回归--正规方程解 以及线性回归的可解释性和其他思考_第6张图片
多元线性回归--正规方程解 以及线性回归的可解释性和其他思考_第7张图片
多元线性回归--正规方程解 以及线性回归的可解释性和其他思考_第8张图片

三、总结

	截止到目前我们计算多元线性回归使用的是其正规方程解的方式。
	但是如果数据较多,使用线性回归就会导致时间长。
	接下来我们就使用一种更厉害的方法,梯度下降!!
	加油!!

你可能感兴趣的:(机器学习,线性回归,python)