sklearn+python:线性回归案例


Posted in Python onFebruary 24, 2020

使用一阶线性方程预测波士顿房价

载入的数据是随sklearn一起发布的,来自boston 1993年之前收集的506个房屋的数据和价格。load_boston()用于载入数据。

from sklearn.datasets import load_boston
from sklearn.model_selection import train_test_split
import time
from sklearn.linear_model import LinearRegression


boston = load_boston()

X = boston.data
y = boston.target

print("X.shape:{}. y.shape:{}".format(X.shape, y.shape))
print('boston.feature_name:{}'.format(boston.feature_names))

X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=3)

model = LinearRegression()

start = time.clock()
model.fit(X_train, y_train)

train_score = model.score(X_train, y_train)
cv_score = model.score(X_test, y_test)

print('time used:{0:.6f}; train_score:{1:.6f}, sv_score:{2:.6f}'.format((time.clock()-start),
                                    train_score, cv_score))

输出内容为:

X.shape:(506, 13). y.shape:(506,)
boston.feature_name:['CRIM' 'ZN' 'INDUS' 'CHAS' 'NOX' 'RM' 'AGE' 'DIS' 'RAD' 'TAX' 'PTRATIO'
 'B' 'LSTAT']
time used:0.012403; train_score:0.723941, sv_score:0.794958

可以看到测试集上准确率并不高,应该是欠拟合。

使用多项式做线性回归

上面的例子是欠拟合的,说明模型太简单,无法拟合数据的情况。现在增加模型复杂度,引入多项式。

打个比方,如果原来的特征是[a, b]两个特征,

在degree为2的情况下, 多项式特征变为[1, a, b, a^2, ab, b^2]。degree为其它值的情况依次类推。

多项式特征相当于增加了数据和模型的复杂性,能够更好的拟合。

下面的代码使用Pipeline把多项式特征和线性回归特征连起来,最终测试degree在1、2、3的情况下的得分。

from sklearn.datasets import load_boston
from sklearn.model_selection import train_test_split
import time
from sklearn.linear_model import LinearRegression
from sklearn.preprocessing import PolynomialFeatures
from sklearn.pipeline import Pipeline

def polynomial_model(degree=1):
  polynomial_features = PolynomialFeatures(degree=degree, include_bias=False)

  linear_regression = LinearRegression(normalize=True)
  pipeline = Pipeline([('polynomial_features', polynomial_features),
             ('linear_regression', linear_regression)])
  return pipeline

boston = load_boston()
X = boston.data
y = boston.target
print("X.shape:{}. y.shape:{}".format(X.shape, y.shape))
print('boston.feature_name:{}'.format(boston.feature_names))

X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=3)

for i in range(1,4):
  print( 'degree:{}'.format( i ) )
  model = polynomial_model(degree=i)

  start = time.clock()
  model.fit(X_train, y_train)

  train_score = model.score(X_train, y_train)
  cv_score = model.score(X_test, y_test)

  print('time used:{0:.6f}; train_score:{1:.6f}, sv_score:{2:.6f}'.format((time.clock()-start),
                                    train_score, cv_score))

输出结果为:

X.shape:(506, 13). y.shape:(506,)
boston.feature_name:['CRIM' 'ZN' 'INDUS' 'CHAS' 'NOX' 'RM' 'AGE' 'DIS' 'RAD' 'TAX' 'PTRATIO'
 'B' 'LSTAT']
degree:1
time used:0.003576; train_score:0.723941, sv_score:0.794958
degree:2
time used:0.030123; train_score:0.930547, sv_score:0.860465
degree:3
time used:0.137346; train_score:1.000000, sv_score:-104.429619

可以看到degree为1和上面不使用多项式是一样的。degree为3在训练集上的得分为1,在测试集上得分是负数,明显过拟合了。

所以最终应该选择degree为2的模型。

二阶多项式比一阶多项式好的多,但是测试集和训练集上的得分仍有不少差距,这可能是数据不够的原因,需要更多的讯据才能进一步提高模型的准确度。

正规方程解法和梯度下降的比较

除了梯度下降法来逼近最优解,也可以使用正规的方程解法直接计算出最终的解来。

根据吴恩达的课程,线性回归最优解为:

theta = (X^T * X)^-1 * X^T * y

其实两种方法各有优缺点:

梯度下降法:

缺点:需要选择学习率,需要多次迭代

优点:特征值很多(1万以上)时仍然能以不错的速度工作

正规方程解法:

优点:不需要设置学习率,不需要多次迭代

缺点:需要计算X的转置和逆,复杂度O3;特征值很多(1万以上)时特变慢

在分类等非线性计算中,正规方程解法并不适用,所以梯度下降法适用范围更广。

以上这篇sklearn+python:线性回归案例就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持三水点靠木。

Python 相关文章推荐
python中bisect模块用法实例
Sep 25 Python
改进Django中的表单的简单方法
Jul 17 Python
Python中Django 后台自定义表单控件
Mar 28 Python
Python爬虫之pandas基本安装与使用方法示例
Aug 08 Python
python+opencv实现阈值分割
Dec 26 Python
java判断三位数的实例讲解
Jun 10 Python
django迁移数据库错误问题解决
Jul 29 Python
解决Python对齐文本字符串问题
Aug 28 Python
详解python 降级到3.6终极解决方案
Feb 06 Python
Python unittest工作原理和使用过程解析
Feb 24 Python
Python3操作YAML文件格式方法解析
Apr 10 Python
python 如何把docker-compose.yaml导入到数据库相关条目里
Jan 15 Python
深入理解Tensorflow中的masking和padding
Feb 24 #Python
K最近邻算法(KNN)---sklearn+python实现方式
Feb 24 #Python
Python3.6 + TensorFlow 安装配置图文教程(Windows 64 bit)
Feb 24 #Python
Python enumerate内置库用法解析
Feb 24 #Python
Python模块/包/库安装的六种方法及区别
Feb 24 #Python
python之MSE、MAE、RMSE的使用
Feb 24 #Python
Python接口自动化判断元素原理解析
Feb 24 #Python
You might like
php xml留言板 xml存储数据的简单例子
2009/08/24 PHP
PHP实现定时执行任务的方法
2014/10/05 PHP
php使用pdo连接mssql server数据库实例
2014/12/25 PHP
PHP在线书签系统分享
2016/01/04 PHP
浅析PHP 中move_uploaded_file 上传中文文件名失败
2019/04/17 PHP
更正确的asp冒泡排序
2007/05/24 Javascript
js模仿html5 placeholder适应于不支持的浏览器
2013/01/13 Javascript
基于jQuery实现文本框缩放以及上下移动功能
2014/11/24 Javascript
AngularJS表单编辑提交功能实例
2015/02/13 Javascript
js jquery获取当前元素的兄弟级 上一个 下一个元素
2015/09/01 Javascript
jquery解析json格式数据的方法(对象、字符串)
2015/11/24 Javascript
jquery实现简单Tab切换菜单效果
2020/07/17 Javascript
Javascript将双字节字符转换成单字节字符并计算长度
2016/06/22 Javascript
Bootstrap基本插件学习笔记之Popover提示框(19)
2016/12/08 Javascript
详解vue axios中文文档
2017/09/12 Javascript
为什么使用koa2搭建微信第三方公众平台的原因
2018/05/16 Javascript
js array数组对象操作方法汇总
2019/03/18 Javascript
解决vue中使用proxy配置不同端口和ip接口问题
2019/08/14 Javascript
jQuery三组基本动画与自定义动画操作实例总结
2020/05/09 jQuery
[54:33]2018DOTA2亚洲邀请赛小组赛 A组加赛 Liquid vs Optic
2018/04/03 DOTA
python3使用PyMysql连接mysql数据库实例
2017/02/07 Python
用Python实现KNN分类算法
2017/12/22 Python
Python实战购物车项目的实现参考
2019/02/20 Python
pytorch使用 to 进行类型转换方式
2020/01/08 Python
Python破解BiliBili滑块验证码的思路详解(完美避开人机识别)
2020/02/17 Python
用HTML5实现鼠标滚轮事件放大缩小图片的功能
2015/06/25 HTML / CSS
地理科学专业毕业生求职信
2013/10/15 职场文书
数控专业大学生的自我鉴定
2013/11/13 职场文书
2013届毕业生求职信范文
2013/11/20 职场文书
商场中秋节广播稿
2014/01/17 职场文书
校外活动方案
2014/08/28 职场文书
党员干部形式主义个人整改措施
2014/09/17 职场文书
车辆年检委托书范本
2014/10/14 职场文书
企业工会工作总结2015
2015/05/13 职场文书
委托收款证明
2015/06/23 职场文书
python 实现定时任务的四种方式
2021/04/01 Python