一、多元线性回归
1、概念以及求解
在现实世界中,样本通常有多个样本特征,这就需要我们构造出多元线性回归模型来模拟数据。
如:二元线性回归模型 是在三维平面中
为了便于推广到向量的形式,
求解多元线性方程的解:
在这里 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、更多思考
三、总结
截止到目前我们计算多元线性回归使用的是其正规方程解的方式。
但是如果数据较多,使用线性回归就会导致时间长。
接下来我们就使用一种更厉害的方法,梯度下降!!
加油!!