数据预处理系列:(十七)用随机梯度下降处理回归
来源:互联网 发布:大麦户源码程序 编辑:程序博客网 时间:2024/04/29 13:43
声明:版权所有,转载请联系作者并注明出处 http://blog.csdn.net/u013719780?viewmode=contents
用随机梯度下降处理回归
本主题将介绍随机梯度下降法(Stochastic Gradient Descent,SGD),我们将用它解决回归问题,后面我们还用它处理分类问题。
Getting ready
SGD是机器学习中的无名英雄(unsung hero),许多算法的底层都有SGD的身影。之所以受欢迎是因为其简便与快速——处理大量数据时这些都是好事儿。
SGD成为许多机器学习算法的核心的另一个原因是它很容易描述过程。在本章的最后,我们对数据作一些变换,然后用模型的损失函数(loss function)拟合数据。
How to do it...
如果SGD适合处理大数据集,我们就用大点儿的数据集来演示:
from sklearn import datasetsX, y = datasets.make_regression(int(1e6))print("{:,}".format(int(1e6)))
值得进一步了解数据对象的构成和规模信息。还在我们用的是NumPy数组,所以我们可以获得nbytes
。Python本身没有获取NumPy数组大小的方法。输出结果与系统有关,你的结果和下面的数据可能不同:
print("{:,}".format(X.nbytes))
我们把字节码nbytes
转换成MB(megabytes),看着更直观:
X.nbytes / 1e6
因此,每个数据点的字节数就是:
X.nbytes / (X.shape[0] * X.shape[1])
这些信息和我们的目标没多大关系,不过了解数据对象的构成和规模信息还是值得的。
现在,我们有了数据,就用SGDRegressor
来拟合:
import numpy as npfrom sklearn import linear_modelsgd = linear_model.SGDRegressor()train = np.random.choice([True, False], size=len(y), p=[.75, .25])sgd.fit(X[train], y[train])
这里又出现一个“充实的(beefy)”对象。重点需要了解我们的损失函数是squared_loss
,与线性回归里的残差平方和是一样的。还需要注意shuffle
会对数据产生随机搅动(shuffle),这在解决伪相关问题时很有用。scikit-learn用fit_intercept
方法可以自动加一列1。如果想从拟合结果中看到很多输出,就把verbose
设为1。用scikit-learn的API预测,我们可以统计残差的分布情况:
linear_preds = sgd.predict(X[~train])
%matplotlib inlinefrom matplotlib import pyplot as pltf, ax = plt.subplots(figsize=(7, 5))f.tight_layout()ax.hist(linear_preds - y[~train],label='Residuals Linear', color='b', alpha=.5);ax.set_title("Residuals")ax.legend(loc='best');
拟合的效果非常好。异常值很少,直方图也呈现出完美的正态分布钟形图。
How it works...
当然这里我们用的是虚拟数据集,但是你也可以用更大的数据集合。例如,如果你在华尔街工作,有可能每天一个市场都有20亿条交易数据。现在如果有一周或一年的数据,用SGD算法就可能无法运行了。很难处理这么大的数据量,因为标准的梯度下降法每一步都要计算梯度,计算量非常庞大。
标准的梯度下降法的思想是在每次迭代计算一个新的相关系数矩阵,然后用学习速率(learning rate)和目标函数(objective function)的梯度调整它,直到相关系数矩阵收敛为止。如果用伪代码写就是这样:
while not_converged: w = w – learning_rate * gradient(cost(w))
这里涉及的变量包括:
w
:相关系数矩阵learning_rate
:每次迭代时前进的长度。如果收敛效果不好,调整这个参数很重要gradient
:导数矩阵cost
:回归的残差平方和。后面我们会介绍,不同的分类方法中损失函数定义不同,具有可变性也是SGD应用广泛的理由之一。
除了梯度函数有点复杂之外,这个方法还是可以的。随着相关系数向量的增加,梯度的计算也会变得越来越慢。每次更新之前,我们都需要对每个数据点计算新权重。
SGD的工作方式稍有不同;每次迭代不是批量更新梯度,而是只更新新数据点的参数。这些数据点是随机选择的,因此称为随机梯度下降法。
- 数据预处理系列:(十七)用随机梯度下降处理回归
- 数据预处理系列:(十五)用正态随机过程处理回归
- 线性回归 最小二乘 梯度下降 随机梯度下降
- 线性回归与随机梯度下降
- 机器学习算法(优化)之一:梯度下降算法、随机梯度下降(应用于线性回归、Logistic回归等等)
- Deep learning系列(十)随机梯度下降
- 深度学习与计算机视觉系列(4)_最优化与随机梯度下降\数据预处理,正则化与损失函数
- 梯度下降算法数据的标准化预处理
- 随机梯度下降(SGD)
- 随机梯度下降(SGD)
- 线性回归系列(4)-线性回归及梯度下降
- 为什么梯度下降慢而用随机梯度下降
- 逻辑回归python实现(随机增量梯度下降,变步长)
- 基于Python中theano库的线性回归(随机梯度下降)
- 逻辑斯蒂回归多元分类的随机梯度下降
- 线性回归 + 随机梯度下降 + JAVA LIR + Spark LIR
- 逻辑回归 随机梯度下降 批梯度下降 二分类问题 不带正则项 java
- 【stanford】梯度、梯度下降,随机梯度下降
- Cocos studio v3.10记录(一)
- 腾讯云服务器ftp部署及文件上传
- C Primer Plus 中文版 前言
- Hibernate注解-类级别注解
- Android—创建自己的Dialog—数据交互
- 数据预处理系列:(十七)用随机梯度下降处理回归
- 一张图玩转大数据架构流程
- http长连接和短连接
- scrollWidth/offsetWidth
- python 模块概述
- 排序算法-快速排序
- 《Effective C++》读后感
- javascript贪吃蛇小游戏
- SGA(系统全局区)