【sklearn实例】3--线性回归

线性回归思想

通过学习,找到属性的线性组合来预测输出标记。
在这里插入图片描述

损失函数

一般采用均方误差作为损失函数:
在这里插入图片描述

优化方法

  • 梯度下降法(不满秩情况使用,收敛较慢,有可能求得局部最小值)
    在这里插入图片描述
  • 正规方程求解-最小二乘法(需要X是满秩的,即样本数大于特征数)
    在这里插入图片描述

形式

  • 一般线性回归
  • 岭回归(Ridge):防止过拟合,损失函数加入正则化项,L2范数
    在这里插入图片描述
  • lasso:加入正则化项,L1范数
    在这里插入图片描述
  • ElasticNet:L1和L2范数混合
    在这里插入图片描述

评价

LR.score()
在这里插入图片描述

sklearn 实现

  • 1 简单使用
from sklearn import datasets
from sklearn.linear_model import LinearRegression
from sklearn.model_selection import train_test_split
# 载入波士顿房价数据库
bostondata=datasets.load_boston()
X=bostondata.data
Y=bostondata.target

#划分测试集和训练集
x_train,x_test,y_train,y_test=train_test_split(X,Y,test_size=0.2)
LR=LinearRegression()
LR.fit(x_train,y_train)
print '系数',LR.coef_
print '截距',LR.intercept_
print '测试集得分',LR.score(x_test,y_test)
print '训练集得分',LR.score(x_train,y_train)
y_pred=LR.predict(x_test)
plt.scatter(y_test,y_pred,c='r',marker='o')
plt.scatter(y_test,y_test,c='g',marker='+')
plt.show()

在这里插入图片描述

分析

  • 线性回归的基本用法,score即r2评价指标;
  • 可视化:本来想画出拟合曲线,但是这里有13个特征,只有一个特征的时候,才能够画出y和x的拟合曲线。所以这里横坐标都采用y_test,纵坐标分布采用预测值和y_test,画出散点图。如果预测值越接近中间的直线即真实值,说明预测效果越好。
  • 2 使用交叉验证
from sklearn import datasets
from sklearn.linear_model import LinearRegression
from sklearn.model_selection import train_test_split
bostondata=datasets.load_boston()
X=bostondata.data
Y=bostondata.target
#x_train,x_test,y_train,y_test=train_test_split(X,Y,test_size=0.2)
LR=LinearRegression()
#LR.fit(x_train,y_train)
#print LR.score(x_test,y_test)
#print LR.score(x_train,y_train)

#交叉验证方法查看规律
scores=[]
score=cross_val_score(LR,X,Y,cv=10,scoring='r2')
print score,score.mean() 

在这里插入图片描述

分析:

  • 采用交叉验证,可以看出,每次训练的模型在测试集上都有不同的表现,好的0.7,坏的还有负的,所以最后平均下来才0.2。这也是采用交叉验证的意义所在,不受单次划分训练和测试集的特殊性影响,看平均得分情况,在调参时会更有效。
  • 交叉验证时候,评价标准有多种类型,默认为accuracy,分类时候适用,本例中选用r2,与线性回归中的score评价相同,适合回归。还有mean_squared_error/mean_absolute_error等。
  • 3 Ridge-单次划分训练集测试集,查看参数影响规律alpha(是不能用于调参的)
from sklearn import datasets
import numpy as np
from sklearn.linear_model import Ridge
from sklearn.model_selection import train_test_split
import matplotlib.pyplot as plt
from sklearn.cross_validation import cross_val_score
bostondata=datasets.load_boston()
X=bostondata.data
Y=bostondata.target
x_train,x_test,y_train,y_test=train_test_split(X,Y,test_size=0.2)

#改变参数值,查看规律
a_range=np.arange(1,100,1)
score_test=[]
score_train=[]
for a in a_range:
    LR=Ridge(alpha=a)
    LR.fit(x_train,y_train)
    score_test.append(LR.score(x_test,y_test))
    score_train.append(LR.score(x_train,y_train))
plt.plot(a_range,score_train,c='g')
plt.plot(a_range,score_test,c='r')
plt.show()

在这里插入图片描述
再运行会变成这样
在这里插入图片描述

发现每次运行后,规律都不一样,分析:

  • 因为每一次运行时划分的测试集和训练集都不一样,所以每次运行后即便alpha相同,两次对应的测试集却不同,所以才会发现规律都不一样。
  • 先split好测试集和训练集,通过改变alpha,查看测试集(训练集)的分数,这样得到的关于参数alpha的影响规律不具有普适性,因为不同参数对应的模型的测试集都不一样,这样的规律只是片面地评价了相应测试集,结果具有特殊性。
  • 要探究参数的影响规律,应该采用交叉验证的方法,通过遍历所有训练集得到模型来评价相对应的测试集,查看平均得分,才可得到普适性规律,对调参才具有意义。
  • 4 通过交叉验证来查看参数的影响规律
a_range=np.arange(0.1,100,0.1)
scores=[]
for a in a_range:
    LR=Ridge(alpha=a)
    score=cross_val_score(LR,X,Y,cv=10,scoring='r2')
    scores.append(score.mean())
print scores  
plt.plot(a_range,scores,c='r')
plt.show()

在这里插入图片描述

分析

  • 利用交叉验证法,得到的评分才是参数对整个测试集的平均影响,规律才具有普适性。
  • 可以看出,alpha越大,正则化影响越大,模型越简单,泛化性能越好,在40左右预测性能达到最好,但是40之后又开始变差,可能是因为此时模型过于简单导致预测能力下降。

猜你喜欢

转载自blog.csdn.net/qq_43243022/article/details/83107539
今日推荐