使用scikit-learn解决回归问题

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好。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值