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和libnmapd,提取Nmap扫描结果
Aug 23 Python
Python切换pip安装源的方法详解
Nov 18 Python
python reduce 函数使用详解
Dec 05 Python
在python中使用requests 模拟浏览器发送请求数据的方法
Dec 26 Python
Python学习笔记之视频人脸检测识别实例教程
Mar 06 Python
使用Python中的reduce()函数求积的实例
Jun 28 Python
Python内存管理实例分析
Jul 10 Python
在PyCharm的 Terminal(终端)切换Python版本的方法
Aug 02 Python
Python 中的 global 标识对变量作用域的影响
Aug 12 Python
Python求解正态分布置信区间教程
Nov 20 Python
基于python实现模拟数据结构模型
Jun 12 Python
python之基数排序的实现
Jul 26 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 set_time_limit()函数的使用详解
2013/06/05 PHP
ThinkPHP模板引擎之导入资源文件方法详解
2014/06/18 PHP
laravel容器延迟加载以及auth扩展详解
2015/03/02 PHP
PHP如何实现订单的延时处理详解
2017/12/30 PHP
在 PHP 和 Laravel 中使用 Traits的方法
2019/11/13 PHP
五段实用的js高级技巧
2011/12/20 Javascript
JQuery获取各种宽度、高度(format函数)实例
2013/03/04 Javascript
uploadify在Firefox下丢失session问题的解决方法
2013/08/07 Javascript
解决jquery1.9不支持browser对象的问题
2013/11/13 Javascript
jquery mobile页面跳转后样式丢失js失效的解决方法
2014/09/06 Javascript
JavaScript清空数组元素的两种方法简单比较
2015/07/10 Javascript
基于jquery实现放大镜效果
2015/08/17 Javascript
AngularJS 过滤与排序详解及实例代码
2016/09/14 Javascript
jQuery 实现ajax传入参数含有特殊字符的方法总结
2016/10/17 Javascript
vue-cli入门之项目结构分析
2017/04/20 Javascript
vue增删改查的简单操作
2017/07/15 Javascript
关于Vue源码vm.$watch()内部原理详解
2019/04/26 Javascript
关于layui toolbar和template的结合使用方法
2019/09/19 Javascript
浅谈JavaScript中this的指向更改
2020/07/28 Javascript
JavaScript canvas实现文字时钟
2021/01/10 Javascript
如何在现代JavaScript中编写异步任务
2021/01/31 Javascript
[02:38]2018年度DOTA2最佳劣单位选手-完美盛典
2018/12/17 DOTA
python打开网页和暂停实例
2014/09/30 Python
Python如何生成树形图案
2018/01/03 Python
Python装饰器的执行过程实例分析
2018/06/04 Python
Python BS4库的安装与使用详解
2018/08/08 Python
使用Python Pandas处理亿级数据的方法
2019/06/24 Python
关于windows下Tensorflow和pytorch安装教程
2020/02/04 Python
Python正则表达式学习小例子
2020/03/03 Python
Ariat官网:美国马靴和服装品牌
2019/12/16 全球购物
编写一子程序,将一链表倒序,即使链表表尾变表头,表头变表尾
2016/02/10 面试题
公司采购主管岗位职责
2014/06/17 职场文书
党校毕业心得体会
2014/09/13 职场文书
2014年幼儿园国庆主题活动方案
2014/09/16 职场文书
小学英语新课改心得体会
2016/01/22 职场文书
java固定大小队列的几种实现方式详解
2021/07/15 Java/Android