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中字典的循环遍历的两种方式
Feb 07 Python
python构建深度神经网络(续)
Mar 10 Python
解决python3中解压zip文件是文件名乱码的问题
Mar 22 Python
python 用lambda函数替换for循环的方法
Jun 09 Python
pygame实现简易飞机大战
Sep 11 Python
Django组件之cookie与session的使用方法
Jan 10 Python
python itchat给指定联系人发消息的方法
Jun 11 Python
python 实现将多条曲线画在一幅图上的方法
Jul 07 Python
python虚拟环境完美部署教程
Aug 06 Python
Django模板标签{% for %}循环,获取制定条数据实例
May 14 Python
tensorflow 2.0模式下训练的模型转成 tf1.x 版本的pb模型实例
Jun 22 Python
Python读写锁实现实现代码解析
Nov 28 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
汇总PHPmailer群发Gmail的常见问题
2016/02/24 PHP
PHP入门教程之操作符与控制结构流程详解
2016/09/09 PHP
php基于curl实现随机ip地址抓取内容的方法
2016/10/11 PHP
PHP用swoole+websocket和redis实现web一对一聊天
2019/11/05 PHP
实例讲解PHP表单
2020/06/10 PHP
JQuery中使用Ajax赋值给全局变量异常的解决方法
2014/01/10 Javascript
Angular中的Promise对象($q介绍)
2015/03/03 Javascript
JavaScript前补零操作实例
2015/03/11 Javascript
Bootstrap学习笔记之css组件(3)
2016/06/07 Javascript
AngularJS折叠菜单实现方法示例
2017/05/18 Javascript
jQuery用户头像裁剪插件cropbox.js使用详解
2017/06/07 jQuery
iscroll.js滚动加载实例详解
2017/07/18 Javascript
基于jquery实现的tab选项卡功能示例【附源码下载】
2019/06/10 jQuery
Vue2.0实现简单分页及跳转效果
2019/07/29 Javascript
vue 的 solt 子组件过滤过程解析
2019/09/07 Javascript
原生JS实现天气预报
2020/06/16 Javascript
vue+iview实现分页及查询功能
2020/11/17 Vue.js
[00:23]DOTA2群星共贺开放测试 25日无码时代来袭
2013/09/23 DOTA
[55:32]2018DOTA2亚洲邀请赛 4.4 淘汰赛 EG vs LGD 第二场
2018/04/05 DOTA
在Python中用has_key()方法查找键是否存在的教程
2015/05/21 Python
python 获取文件下所有文件或目录os.walk()的实例
2018/04/23 Python
python实现简单登陆系统
2018/10/18 Python
Python的iOS自动化打包实例代码
2018/11/22 Python
Python实现剪刀石头布小游戏(与电脑对战)
2019/12/31 Python
python实现Pyecharts实现动态地图(Map、Geo)
2020/03/25 Python
Pycharm打开已有项目配置python环境的方法
2020/07/03 Python
python raise的基本使用
2020/09/10 Python
Perry Ellis官网:美国男士品味服装
2016/12/09 全球购物
电子商务专业个人的自我评价
2013/12/19 职场文书
西式婚礼证婚词
2014/01/12 职场文书
违反课堂纪律检讨书
2014/01/19 职场文书
驾驶员培训方案
2014/05/01 职场文书
小学社团活动总结
2014/06/27 职场文书
小学生运动会报道稿
2014/09/12 职场文书
自查自纠工作情况报告
2014/10/29 职场文书
教你快速开启Apache SkyWalking的自监控
2021/04/25 Servers