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使用新浪微博api上传图片到微博示例
Jan 10 Python
Python实现的几个常用排序算法实例
Jun 16 Python
Python编程之Re模块下的函数介绍
Oct 28 Python
详解python函数传参是传值还是传引用
Jan 16 Python
读取json格式为DataFrame(可转为.csv)的实例讲解
Jun 05 Python
这可能是最好玩的python GUI入门实例(推荐)
Jul 19 Python
pygame实现烟雨蒙蒙下彩虹雨
Nov 11 Python
Tensorflow 实现分批量读取数据
Jan 04 Python
Python 通过监听端口实现唯一脚本运行方式
May 05 Python
Python自动创建Excel并获取内容
Sep 16 Python
Python序列化模块JSON与Pickle
Jun 05 Python
Python+DeOldify实现老照片上色功能
Jun 21 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
CentOS6.5 编译安装lnmp环境
2014/12/21 PHP
基于php的CMS中展示文章类实例分析
2015/06/18 PHP
yii2中添加验证码的实现方法
2016/01/09 PHP
PHP + plupload.js实现多图上传并显示进度条加删除实例代码
2017/03/06 PHP
php数组实现根据某个键值将相同键值合并生成新二维数组的方法
2017/04/26 PHP
一个用js实现的页内搜索代码
2007/05/23 Javascript
javascript 获取select下拉列表值的代码
2009/09/07 Javascript
Node.js:Windows7下搭建的Node.js服务(来玩玩服务器端的javascript吧,这可不是前端js插件)
2011/06/27 Javascript
IE与FireFox中的childNodes区别
2011/10/20 Javascript
jquery+css+ul模拟列表菜单具体实现思路
2013/04/15 Javascript
iframe父页面获取子页面参数的方法
2014/02/21 Javascript
jQuery Migrate 1.1.0 Released 注意事项
2014/06/14 Javascript
javascript结合fileReader 实现上传图片
2015/01/30 Javascript
jquery获得当前html页面源码的方法
2015/07/14 Javascript
使用angularjs创建简单表格
2016/01/21 Javascript
js获取当前日期时间及其它日期操作汇总
2016/03/08 Javascript
Vue Router history模式的配置方法及其原理
2019/05/30 Javascript
微信小程序实现打开并下载服务器上面的pdf文件到手机
2019/09/20 Javascript
详解Vue中的watch和computed
2020/11/09 Javascript
python encode和decode的妙用
2009/09/02 Python
11个并不被常用但对开发非常有帮助的Python库
2015/03/31 Python
Python3标准库之functools管理函数的工具详解
2020/02/27 Python
python实现将字符串中的数字提取出来然后求和
2020/04/02 Python
python中urllib.request和requests的使用及区别详解
2020/05/05 Python
python 基于opencv实现高斯平滑
2020/12/18 Python
python爬取2021猫眼票房字体加密实例
2021/02/19 Python
详解使用postMessage解决iframe跨域通信问题
2019/11/01 HTML / CSS
美国生日蛋糕店:Bake Me A Wish!
2017/02/08 全球购物
Opodo英国旅游网站:预订廉价航班、酒店和汽车租赁
2018/07/14 全球购物
杰夫·班克斯男士服装网上商店:Jeff Banks
2019/10/24 全球购物
结对共建工作方案
2014/06/02 职场文书
乡镇精神文明建设汇报材料
2014/08/15 职场文书
教师先进事迹材料
2014/12/16 职场文书
婚礼新人答谢词
2015/01/04 职场文书
2015年社区精神文明工作总结
2015/05/26 职场文书
Windows安装Anaconda3的方法及使用过程详解
2021/06/11 Python