scikit-learn中的回归问题
加载和上节同样的数据,通过代码
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 sklearn.linear_model import LinearRegression #调用sklearn中的LinearRegression这个类
lin_reg = LinearRegression() #实例化这个类
lin_reg.fit(X_train,y_train)
可得
lin_reg.coef_ #系数
array([-1.15625837e-01, 3.13179564e-02, -4.35662825e-02, -9.73281610e-02,
-1.09500653e+01, 3.49898935e+00, -1.41780625e-02, -1.06249020e+00,
2.46031503e-01, -1.23291876e-02, -8.79440522e-01, 8.31653623e-03,
-3.98593455e-01])
lin_reg.intercept_ #截距
32.5975615887217
可观察到由sklearn得到的结果与上一节的结果不同,这是由于sklearn中的train_test_split进行训练测试集的分割在算法上包括random_state随机数,随机序列的生成上和我们自己实现的稍有不同,使得切分出来的数据稍有不同,导致结果不同。
若使用我们自己实现的train_test_split,LinearRegression不变,还是使用sklearn中的,代码如下:
from machine_learning.playML.model_selection import train_test_split
X_train,y_train,X_test,y_test = train_test_split(X,y,seed=666) #将数据集分为训练集和测试集
可看到结果与上一节相同,如下:
lin_reg.coef_ #系数
array([-1.20354261e-01, 3.64423279e-02, -3.61493155e-02, 5.12978140e-02,
-1.15775825e+01, 3.42740062e+00, -2.32311760e-02, -1.19487594e+00,
2.60101728e-01, -1.40219119e-02, -8.35430488e-01, 7.80472852e-03,
-3.80923751e-01])
lin_reg.intercept_ #截距
34.11739972322962425
lin_reg.score(X_test,y_test) #预测的指标R^2值
0.8129794056212811
kNN Regressor
使用sklearn中的KNeighborsRegressor来解决回归问题
from sklearn.neighbors import KNeighborsRegressor #使用kNN来解决回归问题
knn_reg = KNeighborsRegressor()
knn_reg.fit(X_train,y_train)
knn_reg.score(X_test,y_test)
可得结果:
0.5865412198300899
显然,比使用LinearRegression是差的。
对于KNN算法来说有很多超参数,对于这些超参数我们做实验看看结果是怎样的。
使用网格搜索的方式搜索一下KNN算法中相应的超参数。
from sklearn.model_selection import GridSearchCV
param_grid = [ #对搜索的超参数进行定义
{
"weights":["uniform"],
"n_neighbors":[i for i in range(1,11)] #k
},
{
"weights":["distance"],
"n_neighbors":[i for i in range(1,11)],
"p":[i for i in range(1,6)]
}
]
knn_reg = KNeighborsRegressor()
grid_search = GridSearchCV(knn_reg,param_grid,n_jobs=-1,verbose=1)
# 回归器 超参数对应的数组 计算机所有的核 输出多少内容
grid_search.fit(X_train,y_train)
调用best_params_看看最好的结果是什么
grid_search.best_params_
结果为:
{'n_neighbors': 7, 'p': 1, 'weights': 'distance'}
此时:
grid_search.best_score_
0.652216494152461
best_score_的求解方式和上面KNeighborsRegressor是不一样的,是因为网格搜索使用了交叉验证的方式(后续介绍)
为了得到和KNeighborsRegressor同样的衡量标准,调用best_estimator_(返回使用网格搜索得到的真正训练的回归算法)的score。得到
grid_search.best_estimator_.score(X_test,y_test)
0.7160666820548707
比默认的KNeighborsRegressor结果要好,但没有LinearRegression好。