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对SQLite数据库操作
Apr 06 Python
Python2.7+pytesser实现简单验证码的识别方法
Dec 29 Python
Python之reload流程实例代码解析
Jan 29 Python
Python中pip更新和三方插件安装说明
Jul 08 Python
基于数据归一化以及Python实现方式
Jul 11 Python
Django logging配置及使用详解
Jul 23 Python
python返回数组的索引实例
Nov 28 Python
常用python爬虫库介绍与简要说明
Jan 25 Python
Python列表倒序输出及其效率详解
Mar 04 Python
Python读取配置文件(config.ini)以及写入配置文件
Apr 08 Python
浅谈tensorflow中dataset.shuffle和dataset.batch dataset.repeat注意点
Jun 08 Python
python 使用pandas读取csv文件的方法
Dec 24 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 获取远程文件内容的函数代码
2010/03/24 PHP
PHP面向对象学习笔记之一 基础概念
2012/10/06 PHP
PHP遍历某个目录下的所有文件和子文件夹的实现代码
2013/06/28 PHP
ThinkPHP静态缓存简单配置和使用方法详解
2016/03/23 PHP
PHP计算数组中值的和与乘积的方法(array_sum与array_product函数)
2016/04/01 PHP
php parse_str() 函数的定义和用法
2016/05/23 PHP
PHP多进程简单实例小结
2019/11/09 PHP
js中widow.open()方法使用详解
2013/07/30 Javascript
Express作者TJ告别Node.js奔向Go
2014/07/14 Javascript
js实现获取焦点后光标在字符串后
2014/09/17 Javascript
通过伪协议解决父页面与iframe页面通信的问题
2015/04/05 Javascript
JavaScript、jQuery与Ajax的关系
2016/01/24 Javascript
Javascript使用uploadify来实现多文件上传
2016/11/16 Javascript
JS实现选定指定HTML元素对象中指定文本内容功能示例
2017/02/13 Javascript
JavaScript函数中的this四种绑定形式
2017/08/15 Javascript
除Console.log()外更多的Javascript调试命令
2018/01/24 Javascript
vue实现2048小游戏功能思路详解
2018/05/09 Javascript
Vue实现本地购物车功能
2018/12/05 Javascript
Electron autoUpdater实现Windows安装包自动更新的方法
2018/12/24 Javascript
vue项目中使用vue-i18n报错的解决方法
2019/01/13 Javascript
Python3中简单的文件操作及两个简单小实例分享
2017/06/18 Python
Python IDLE清空窗口的实例
2018/06/25 Python
详解Python 正则表达式模块
2018/11/05 Python
Python2和Python3.6环境解决共存问题
2018/11/09 Python
pycharm 取消默认的右击运行unittest的方法
2018/11/29 Python
解决python xlrd无法读取excel文件的问题
2018/12/25 Python
在python中创建指定大小的多维数组方式
2019/11/28 Python
Python找出列表中出现次数最多的元素三种方式
2020/02/24 Python
python数据预处理 :数据共线性处理详解
2020/02/24 Python
python实现跨年表白神器--你值得拥有
2021/01/04 Python
css3 transform及原生js实现鼠标拖动3D立方体旋转
2016/06/20 HTML / CSS
使用phonegap创建联系人的实现方法
2017/03/30 HTML / CSS
欧缇丽英国官方网站:Caudalie英国
2016/08/17 全球购物
顶级宝石首饰网络零售商:Angara
2016/10/25 全球购物
Sam’s Club山姆会员商店:沃尔玛旗下高端会员制商店
2017/01/16 全球购物
《蒲公英》教学反思
2014/02/28 职场文书