机器学习笔记1.1-回归(regression)

监督学习-Regression

一:模型搭建.(初始版)

一:模型搭建(初始版)
这里采用的模型:sklearn.linear_model import LinearRegression

sklearn 库中,线性模型中的,线性回归(最小二乘法)

1.1加载数据集

from sklearn import datasets
boston=datasets.load_boston()
data=boston.data#X
target=boston.target#Y

1.2对数据集进行划分,划分为测试集和训练集。

from sklearn.model_selection import  train_test_split
x_train,x_test,y_train,y_test=train_test_split(data,target,test_size=0.2)
#train_test_split默认对数据进行随机打乱顺序进行划分

1.3进行模型的搭建

from sklearn.linear_model import  LinearRegression
reg=LinearRegression()
reg.fit(x_train,y_train)
pre=reg.predict(x_test)
reg.score(x_test,y_test)

可以看到模型得到直线的相关参数:

>>>reg.score(x_test,y_test)#拟合的准确率
0.7722326335175852
>>>reg.coef_.round(1)#拟合的直线的各x变量的系数
array([ -0.1,   0.1,   0. ,   2.3, -17.2,   3.5,   0. ,  -1.5,   0.3,
        -0. ,  -0.9,   0. ,  -0.5])
>>>reg.intercept_#拟合直线的截距
37.77443499272175

1.4不足

'''
可以看到简单的运用模型可以得到:
①测试集的数据的预测值。
②训练模型的准确率
③拟合的直线的各x变量的系数
④拟合直线的截
缺陷:
①单个模型的构建,存在数据划分的偶然性。
②没有进行参数的优化,因此模型的准确率不是最优的
'''

二.交叉验证(模型的可信度的提升)(优化1)

这里需要引入交叉验证的想法。

from sklearn import datasets
from sklearn.model_selection import  train_test_split
from sklearn.model_selection import cross_val_score#只能返回一个数据的准确率的列表。
from sklearn.linear_model import LinearRegression
boston=datasets.load_boston()
data=boston.data
target=boston.target
x_train,x_test,y_train,y_test=train_test_split(data,target,test_size=0.2)
#train_test_split随机打乱数据集。
#上面都是相同的代码准备数据集。当然导入的库那里需要改变一些
score=cross_val_score(LinearRegression(),x_train,y_train,cv=4)

经过四次交叉验证的结果的准确率分别如下。

>>>score
array([0.55972953, 0.72063247, 0.79061756, 0.78078693])
>>>score.mean()
0.7129416204535235

得分的均值说明:linearRegression模型的准确率在:0.71左右。

不足之处

'''
①这里只得到一个交叉验证的准确率的“列表”:取均值可以得到对这个模型的准确率的一个指标。这适用于模型的调优参数不存在的情况。比如最小二乘法的线性回归。
②如果我想得到这个模型的准确率高的时候,对应的参数是多少,那么怎么办?
③同时,我连模型的对象都得不到,怎么去对其他的测试数据进行预测,同时也不能得到测试集的预测数据。

因此我们希望能得到一个能到一个具有更多功能和属性的对象

'''

三.交叉验证(关于模型更多的数据的获得)优化2)

这里采用了sklearn.model_selection 模块中的cross_validate函数。
他返回的是一个字典。
字典里面包括很多得到数据:包括训练集测试集的准确率,和对应的训练模型的对象。

from sklearn import datasets
from sklearn.model_selection import  train_test_split
from sklearn.model_selection import cross_validate
from sklearn.linear_model import LinearRegression
boston=datasets.load_boston()
data=boston.data
target=boston.target
x_train,x_test,y_train,y_test=train_test_split(data,target,test_size=0.2)
#上面都是相同的代码准备数据集。当然导入的库那里需要改变一个
cv_result=cross_validate(LinearRegression(),x_train,y_train,scoring=['r2'],cv=5,return_train_score=True,return_estimator=True)
'''
cross_validate:参数
scoring=['r2']:用于评估测试集上交叉验证模型性能的策略,默认为R2
cv=5:交叉验证的次数,默认为5
return_train_score=False:是否返回训练模型的得分,默认为否
return_estimator=False:是否返回每次训练的模型,默认为否

'''

这样我们就得到了一个交叉验证的结果字典,那么里面有什么呢?

>>>type(cv_result)#查看类型,可以看到是一个字典
<class 'dict'>
>>>cv_result.keys()#查看key值
dict_keys(['fit_time', 'score_time', 'estimator', 'test_r2', 'train_r2'])
>>>cv_result['test_r2']#这是测试集的准确率,用(r2计算的,因为上面的参数scoring那里我们设置的是:r2)
array([0.72786143, 0.7051609 , 0.7561487 , 0.69940636, 0.63741104])
>>>cv_result['train_r2']#这是训练集的准确率
array([0.72141132, 0.72337513, 0.71506867, 0.73022201, 0.74784303])
>>>cv_result['estimator']#这是对应的5个训练模型的对象,我们可以用其中的进行模型的预测
[LinearRegression(), LinearRegression(), LinearRegression(), LinearRegression(), LinearRegression()]
####拿到训练对象对测试集数据进行测试准确率
>>>for i in cv_result['estimator']:
       tem_model=i
       score=tem_model.score(x_test,y_test)
       print('score:',score)
    
score: 0.8125178759782639
score: 0.7525024636260891
score: 0.7703654448382375
score: 0.7594400691886503
score: 0.7675370202207904
#可以看到5个模型的预测的准确率
#依据准确率的高低,可以判断出,第一个模型的效果最好。所以采用第一个模型进行预测

这里需要注意:

为什么上面的准确率有那么多个?
①训练集的准确率
②测试集的准确率
③预测值的准确率。

首先我们对总体数据集进行划分为:以下4个
x_train,x_test,y_train,y_test
这实际为2部分:
①x_train,x_test。
用来训练模型的。
②y_train,y_test。(它的用途是:假设我们并不知道这些数的值,假设这就是我们需要预测的数据。所以,这部分数据不能放进模型当中进行训练,只有最后评估模型的好坏的时候才能用。)
用来检验模型的。

如果没有交叉验证,那么我们的建模操作是,fit(),然后,score(②),就可以了。(因为,没有交叉验证,那么我们用①训练出了一个模型,我们就可以用②进行对模型的检验了,用准确值的大小来衡量)


但是用了交叉验证呢?
我们的步骤:首先,对x_train,x_test进行拆分(按cv的值),相当于这样
x_train_cross_validate,x_test_cross_validate,y_train_cross_validate,y_test_cross_validate.train_test_split(x_train,x_test,test_size=1/cv)。进行了cv次的拆分。得到了,用于交叉验证的训练数据和测试数据,原来的测试数据②没动。

然后。
因为拆分后的数据里包括了:
x_train_cross_validate,x_test_cross_validate,y_train_cross_validate,y_test_cross_validate.
所以,我们就可以利用这些数据,进行类似于没用交叉验证的模型的训练。
然后,就得到了测试的准确率,和训练的准确率。

我们是要用测试的准确率这个指标来初步判断这几个模型的优劣。

之后,交叉验证得到了cv个训练的模型,我们再用未用过的测试集数据:
②y_train,y_test,用模型进行预测,判断模型好坏的指标就是:准确度的大小。从而选出最好的模型。

四.网格搜索(找出最优的参数)(优化3)

这里采用岭回归模型。
需要找的最优参数为:alpha

'''
网格搜索找到最好的参数。
'''
from sklearn import datasets
from sklearn.model_selection import  train_test_split
import numpy as np
from sklearn.linear_model import  Ridge
from sklearn.model_selection import GridSearchCV
import  seaborn as sns
import matplotlib.pyplot as plt
import pandas as pd
boston=datasets.load_boston()
data=boston.data
target=boston.target
x_train,x_test,y_train,y_test=train_test_split(data,target,test_size=0.1)

cv_result=GridSearchCV(Ridge(),{'alpha':np.arange(0,1,0.025)},cv=4)
'''
网格搜索找到最优的参数。
形成最优参数的一个模型的对象。
'''
cv_result.fit(x_train,y_train)

>>>cv_result.best_score_#最好的准确率
0.6841793379171288
>>>cv_result.best_params_#最好的参数
{'alpha': 0.17500000000000002}
>>>cv_result.best_estimator_#最好的模型
Ridge(alpha=0.17500000000000002)
>>>cv_result.score(x_test,y_test)#预测的准确率
0.5971114252451142
>>>pre=cv_result.predict(x_test)
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值