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变量和字符串详解
Apr 29 Python
python实现k-means聚类算法
Feb 23 Python
python实现12306抢票及自动邮件发送提醒付款功能
Mar 08 Python
Python打包方法Pyinstaller的使用
Oct 09 Python
python 执行文件时额外参数获取的实例
Dec 18 Python
详解python-图像处理(映射变换)
Mar 22 Python
Python实现银行账户资金交易管理系统
Jan 03 Python
Django框架models使用group by详解
Mar 11 Python
完美解决python针对hdfs上传和下载的问题
Jun 05 Python
python上下文管理的使用场景实例讲解
Mar 03 Python
自己搭建resnet18网络并加载torchvision自带权重的操作
May 13 Python
python可视化分析绘制带趋势线的散点图和边缘直方图
Jun 25 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+mysql写的留言本
2006/10/09 PHP
php中get_meta_tags()、CURL与user-agent用法分析
2014/12/16 PHP
PHP调用MySQL存储过程并返回值的方法
2014/12/26 PHP
Laravel使用scout集成elasticsearch做全文搜索的实现方法
2018/11/30 PHP
laravel实现简单用户权限的示例代码
2019/05/28 PHP
利用jQuery实现可以编辑的表格
2014/05/26 Javascript
JavaScript模板引擎用法实例
2015/07/10 Javascript
以JavaScript来实现WordPress中的二级导航菜单的方法
2015/12/14 Javascript
xmlplus组件设计系列之按钮(2)
2017/04/26 Javascript
Vue单页及多页应用全局配置404页面实践记录
2018/05/22 Javascript
vue2.0 + ele的循环表单及验证字段方法
2018/09/18 Javascript
jQuery中实现text()的方法
2019/04/04 jQuery
JQuery事件委托原理与用法实例分析
2019/05/13 jQuery
深入学习JavaScript 高阶函数
2019/06/11 Javascript
在layui中layer弹出层点击事件无效的解决方法
2019/09/05 Javascript
python正则表达式re模块详细介绍
2014/05/29 Python
Python win32com 操作Exce的l简单方法(必看)
2017/05/25 Python
Python中函数eval和ast.literal_eval的区别详解
2017/08/10 Python
Python实现获取邮箱内容并解析的方法示例
2018/06/16 Python
Python mutiprocessing多线程池pool操作示例
2019/01/30 Python
对Python之gzip文件读写的方法详解
2019/02/08 Python
python使用if语句实现一个猜拳游戏详解
2019/08/27 Python
pandas DataFrame运算的实现
2020/06/14 Python
Python装饰器如何实现修复过程解析
2020/09/05 Python
惠普美国官方商店:HP Official Store
2016/08/28 全球购物
2014年两会学习心得体会
2014/03/10 职场文书
关于环保的建议书400字
2014/03/12 职场文书
农林经济管理专业自荐信
2014/09/01 职场文书
事业单位人员的自我评价范文
2014/09/21 职场文书
2015年世界无车日活动总结
2015/03/23 职场文书
2015财务年度工作总结范文
2015/05/04 职场文书
2015年卫生院健康教育工作总结
2015/07/24 职场文书
企业安全生产规章制度
2015/08/06 职场文书
初三语文教学反思
2016/03/03 职场文书
python3美化表格数据输出结果的实现代码
2021/04/14 Python
table不让td文字溢出操作方法
2022/12/24 HTML / CSS