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 22 Python
python 调用c语言函数的方法
Sep 29 Python
python和shell获取文本内容的方法
Jun 05 Python
mac下如何将python2.7改为python3
Jul 13 Python
tensorflow saver 保存和恢复指定 tensor的实例讲解
Jul 26 Python
Django框架的中的setting.py文件说明详解
Oct 15 Python
python3+selenium自动化测试框架详解
Mar 17 Python
pytorch中的inference使用实例
Feb 20 Python
python 6.7 编写printTable()函数表格打印(完整代码)
Mar 25 Python
Anaconda+vscode+pytorch环境搭建过程详解
May 25 Python
Python APScheduler执行使用方法详解
Dec 10 Python
Pandas加速代码之避免使用for循环
May 30 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
phpMyAdmin2.11.6安装配置方法
2008/08/24 PHP
php数组转换js数组操作及json_encode的用法详解
2013/10/26 PHP
PHP获取指定月份第一天和最后一天的方法
2015/07/18 PHP
Linux服务器下PHPMailer发送邮件失败的问题解决
2017/03/04 PHP
利用PHP获取访客IP、地区位置、浏览器及来源页面等信息
2017/06/27 PHP
如何让div span等元素能响应键盘事件操作指南
2012/11/13 Javascript
5秒后跳转到另一个页面的js代码
2013/10/12 Javascript
jQuery基于json与cookie实现购物车的方法
2016/04/15 Javascript
JavaScript页面实时显示当前时间实例代码
2016/10/23 Javascript
利用Mongoose让JSON数据直接插入或更新到MongoDB
2017/05/03 Javascript
页面间固定参数,通过cookie传值的实现方法
2017/05/31 Javascript
原生JavaScript来实现对dom元素class的操作方法(推荐)
2017/08/16 Javascript
在 Angular中 使用 Lodash 的方法
2018/02/11 Javascript
js+canvas实现验证码功能
2020/09/21 Javascript
解决Layui 表单提交数据为空的问题
2018/08/15 Javascript
Vue表单控件绑定图文详解
2019/02/11 Javascript
Windows下PyMongo下载及安装教程
2015/04/27 Python
windows及linux环境下永久修改pip镜像源的方法
2016/11/28 Python
Django2.1.3 中间件使用详解
2018/11/26 Python
Python利用scapy实现ARP欺骗的方法
2019/07/23 Python
pygame实现俄罗斯方块游戏(基础篇2)
2019/10/29 Python
tensorflow2.0的函数签名与图结构(推荐)
2020/04/28 Python
使用TensorBoard进行超参数优化的实现
2020/07/06 Python
纯CSS3代码实现文字描边
2016/04/25 HTML / CSS
菲律宾票务网站:StubHub菲律宾
2018/04/21 全球购物
Famous Footwear加拿大:美国多品牌运动休闲鞋店
2018/12/05 全球购物
旅游与酒店管理的自我评价分享
2013/11/03 职场文书
医药专业推荐信
2013/11/15 职场文书
服装厂厂长职责
2013/12/16 职场文书
会计专业自我鉴定范文
2013/12/29 职场文书
继电保护工岗位职责
2014/01/05 职场文书
电大毕业自我鉴定
2014/02/03 职场文书
《莫高窟》教学反思
2014/02/25 职场文书
学雷锋标语
2014/06/25 职场文书
环境科学专业教师求职信
2014/07/12 职场文书
2015年公路养护工作总结
2015/05/13 职场文书