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使用pil生成缩略图的方法
Mar 26 Python
python爬虫入门教程--快速理解HTTP协议(一)
May 25 Python
详解python实现识别手写MNIST数字集的程序
Aug 03 Python
Python3调用百度AI识别图片中的文字功能示例【测试可用】
Mar 13 Python
python简单实现矩阵的乘,加,转置和逆运算示例
Jul 10 Python
django之静态文件 django 2.0 在网页中显示图片的例子
Jul 28 Python
pytorch 实现打印模型的参数值
Dec 30 Python
Python面向对象封装操作案例详解 II
Jan 02 Python
python爬虫把url链接编码成gbk2312格式过程解析
Jun 08 Python
python如何利用Mitmproxy抓包
Oct 10 Python
python 基于UDP协议套接字通信的实现
Jan 22 Python
Django基础CBV装饰器和中间件
Mar 22 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实现变色验证码实例
2014/01/06 PHP
php读取文件内容的三种可行方法示例介绍
2014/02/08 PHP
让CodeIgniter的ellipsize()支持中文截断的方法
2014/06/12 PHP
在Yii框架中使用PHP模板引擎Twig的例子
2014/06/13 PHP
PHP错误Parse error: syntax error, unexpected end of file in test.php on line 12解决方法
2014/06/23 PHP
WordPress中用于获取搜索表单的PHP函数使用解析
2016/01/05 PHP
golang、python、php、c++、c、java、Nodejs性能对比
2017/03/12 NodeJs
tp5(thinkPHP5框架)使用DB实现批量删除功能示例
2019/05/28 PHP
几个有趣的Javascript Hack
2010/07/24 Javascript
document.getElementById的简写方式(获取id对象的简略写法)
2010/09/10 Javascript
在JavaScript中判断整型的N种方法示例介绍
2014/06/18 Javascript
手机端网页点击链接触发自动拨打或保存电话的示例代码
2014/08/15 Javascript
Vuejs第七篇之Vuejs过渡动画案例全面解析
2016/09/05 Javascript
jsp 网站引入外部css或者js失效问题解决
2016/10/31 Javascript
jQuery实现的简单拖拽功能示例【测试可用】
2018/08/14 jQuery
基于ssm框架实现layui分页效果
2019/07/27 Javascript
解决vuex数据页面刷新后初始化操作
2020/07/26 Javascript
基于js实现的图片拖拽排序源码实例
2020/11/04 Javascript
[03:03]DOTA2校园争霸赛 济南城市决赛欢乐发奖活动
2013/10/21 DOTA
Python的Tornado框架异步编程入门实例
2015/04/24 Python
python将文本中的空格替换为换行的方法
2018/03/19 Python
查看TensorFlow checkpoint文件中的变量名和对应值方法
2018/06/14 Python
python实现泊松图像融合
2018/07/26 Python
python组合无重复三位数的实例
2018/11/13 Python
python中的单引号双引号区别知识点总结
2019/06/23 Python
Python基于xlutils修改表格内容过程解析
2020/07/28 Python
举例讲解Python装饰器
2020/12/24 Python
超市营业员求职简历的自我评价
2013/10/17 职场文书
毕业实习个人鉴定范文
2013/12/10 职场文书
营销人才自我鉴定范文
2013/12/25 职场文书
保卫科工作岗位职责
2014/03/01 职场文书
助残日活动总结
2014/08/27 职场文书
招标承诺书
2014/08/30 职场文书
工作态度怎么写
2015/06/25 职场文书
校园安全学习心得体会
2016/01/18 职场文书
如何设计高效合理的MySQL查询语句
2021/05/26 MySQL