回归算法
线性回归
线性回归的定义是:目标值预期是输入变量的线性组合。线性模型形式简单、易于建模,但却蕴含着机器学习中一些重要的基本思想。线性回归,是利用数理统计中回归分析,来确定两种或两种以上变量间相互依赖的定量关系的一种统计分析方法,运用十分广泛。
优点:结果易于理解,计算不复杂
缺点:对非线性的数据拟合不好
适用数据类型:数值型和标称型
将要用来描述这个回归问题的标记如下:
代表训练集中实例的数量
代表特征/输入变量
代表目标变量/输出变量
代表训练集中的实例
代表第 个观察实例
代表学习算法的解决方案或函数也称为假设(hypothesis)
例如:房价例子中房子的大小预测房子的价格。,其中x表示房子的大小,选择合适的参数(parameters) 和 ,在房价问题这个例子中便是直线的斜率和在 轴上的截距。
通用公式为:
那么我们可以通过向量的方式来表示就值与特征X值之间的关系:
两向量相乘,结果为一个整数是估计值,其中所有特征集合的第一个特征值x0=1,那么我们可以通过通用的向量公式来表示线性模型:
一个列向量的转置与特征的乘积,得出我们预测的结果,但是显然我们这个模型得到的结果可定会有误差,如下图所示:
我们选择的参数决定了我们得到的直线相对于我们的训练集的准确程度,模型所预测的值与训练集中实际值之间的差距(下图中红线所指)就是建模误差(modeling error)。
损失函数
损失函数在机器学习中是个重要的概念,大部分机器学习算法都会有误差,我们得通过显性的公式来描述这个误差,并且将这个误差优化到最小值。
对于线性回归模型,将模型与数据点之间的距离差之和做为衡量匹配好坏的标准,误差越小,匹配程度越大。我们要找的模型就是需要将f(x)和我们的真实值之间最相似的状态。于是我们就有了误差公式,模型与数据差的平方和最小(又称最小二乘法):
要使 J(θ) 误差最小,可以采用一下两种方法:一种使正规方程解法(只适用于简单的线性回归),另一种使用梯度下降算法。
正规方程
求解:
X为特征值矩阵,y为目标值矩阵
缺点:当特征过于复杂,求解速度太慢
对于复杂的算法,不能使用正规方程求解(逻辑回归等)
梯度下降算法
假设线性函数形式:
损失函数(又称代价函数或成本函数):
梯度下降是一个用来求函数最小值的算法,将使用梯度下降算法来求出损失函数 的最小值。
梯度下降思想:开始时我们随机选择一个参数的组合,计算损失函数,然后我们寻找下一个能让损失函数值下降最多的参数组合。我们持续这么做直到找到一个局部最小值(local minimum),因为我们并没有尝试完所有的参数组合,所以不能确定我们得到的局部最小值是否便是全局最小值(global minimum),选择不同的初始参数组合,可能会找到不同的局部最小值。
梯度下降理解:想象你自己正站立在山的这一点上,站立在你想象的公园这座红色山上,在梯度下降算法中,我们要做的就是旋转360度,看看我们的周围,并问自己要在某个方向上,用小碎步尽快下山。这些小碎步需要朝什么方向?如果我们站在山坡上的这一点,你看一下周围,你会发现最佳的下山方向,你再看看周围,然后再一次想想,我应该从什么方向迈着小碎步下山?然后你按照自己的判断又迈出一步,重复上面的步骤,从这个新的点,你环顾四周,并决定从什么方向将会最快下山,然后又迈进了一小步,并依此类推,直到你接近局部最低点的位置。
批量梯度下降(batch gradient descent)算法的公式为:
其中是学习率(learning rate),它决定了我们沿着能让代价函数下降程度最大的方向向下迈出的步子有多大,在批量梯度下降中,我们每一次都同时让所有的参数减去学习速率乘以代价函数的导数。
接下来,对之前的线性回归问题运用批量梯度下降算法,关键在于求出代价函数的导数,即:
时:
时:
则算法改写成:
Repeat {
}
当然,梯度下降算法还有:随机梯度下降算法,小批量梯度下降算法等,详情请参考《吴恩达机器学习公开课》《深度学习500问》。
线性回归算法比较:
(m训练样本数,n特征数量)
算法 | m很大 | 是否支持核外 | n很大 | 超参数 | 是否需要缩放 | sklearn |
---|---|---|---|---|---|---|
正规方程 | 快 | 否 | 慢 | 0 | 否 | LinearRegression |
批量梯度下降(BGD) | 慢 | 否 | 快 | 2 | 是 | |
随机梯度下降(SGD) | 快 | 是 | 快 | >=2 | 是 | SGDRegression |
小批量梯度下降(Mini-batch GD) | 快 | 是 | 快 | >=2 | 是 |
过拟合处理方法: | |
---|---|
1.增加训练数据 | 可以有限的避免过拟合 |
2.特征选择 | 手动有选择性删除特征;使用模型进行特征选择(例如PCA) |
3.正则化 | 保留所有特征,但减少参数的大小 |
正则化:
为了防止线性回归中出现过拟合现象,我们通常采用正则化方法进行处理(在损失函数中添加一个正则项)。
接下来,用以下标记来描述这个损失函数:
表示训练集中实例的数量。
表示用来控制的是对模型正则化的程度。
表示通过控制来调节岭回归与套索回归的混合比例。
岭(Ridge)回归的损失函数:
套索(Lasso)回归的损失函数:
弹性网络(Elastic Net)的损失函数:
LinearRegression
-
LinearRegression
是线性回归模型,它的原型为:class sklearn.linear_model.LinearRegression(fit_intercept=True, normalize=False,copy_X=True, n_jobs=1)
-
fit_intercept
:一个布尔值,偏置项,指定是否需要计算截距项。 -
normalize
:一个布尔值。如果为True
,那么训练样本会在训练之前会被归一化。 -
copy_X
:一个布尔值。如果为True
,则会拷贝X
。 -
n_jobs
:一个整数,指定计算并行度。
-
-
模型属性:
-
coef_
:权重向量。 -
intercept_
: 值。
-
-
模型方法:
-
fit(X,y[,sample_weight])
:训练模型。 -
predict(X)
:用模型进行预测,返回预测值。 -
score(X,y[,sample_weight])
:返回模型的预测性能得分。
-
SGDRegressor
-
SGD
类实现了SGD线性回归模型。其原型为:class sklearn.linear_model.SGDRegressor(loss='squared_loss', penalty='l2', alpha=0.0001, l1_ratio=0.15, fit_intercept=True, max_iter=None, tol=None, shuffle=True, verbose=0, epsilon=0.1, random_state=None, learning_rate='invscaling', eta0=0.01, power_t=0.25, early_stopping=False, validation_fraction=0.1, n_iter_no_change=5, warm_start=False, average=False, n_iter=None)
-
loss
:字符串, 默认:squared_loss
,可选项:squared_loss
,huber
,epsilon_insensitive
, orsquared_epsilon_insensitive
-
penalty
: 字符串,惩罚项:none
,l2
,l1
, orelasticnet
-
alpha
: 浮点数,默认:0.0001
用来控制的是对模型正则化的程度。 -
l1_ratio
:通过控制这个参数来调节岭回归与套索回归的混合比例 。 -
max_iter
: 指定最大迭代次数。 -
tol
:一个浮点数,指定判断迭代收敛与否的阈值。 -
learning_rate
: 字符串, 学习率,可选项constant
,optimal
,invscaling
,adaptive
-
-
模型属性:
-
coef_
:权重向量。 -
intercept_
: 值。 -
n_iter_
:实际迭代次数。
3.模型方法: 参考
LinearRegression
-
Ridge(岭回归)
-
Ridge
类实现了岭回归模型。其原型为:class sklearn.linear_model.Ridge(alpha=1.0, fit_intercept=True, normalize=False, copy_X=True, max_iter=None, tol=0.001, solver='auto', random_state=None)
alpha
: 控制的是对模型正则化的程度。max_iter
: 指定最大迭代次数。tol
:一个浮点数,指定判断迭代收敛与否的阈值。-
solver
:一个字符串,指定求解最优化问题的算法。可以为:'auto'
:根据数据集自动选择算法。'svd'
:使用奇异值分解来计算回归系数。'cholesky'
:使用scipy.linalg.solve
函数来求解。'sparse_cg'
:使用scipy.sparse.linalg.cg
函数来求解。-
'lsqr'
:使用scipy.sparse.linalg.lsqr
函数求解。它运算速度最快,但是可能老版本的
scipy
不支持。 'sag'
:使用Stochastic Average Gradient descent
算法求解最优化问题。
random_state
:用于设定随机数生成器,它在solver=sag
时使用。其它参数参考
LinearRegression
。
-
模型属性:
-
coef_
:权重向量。 -
intercept_
: 值。 -
n_iter_
:实际迭代次数。
-
模型方法: 参考
LinearRegression
。
Lasso(套索回归)
-
Lasso
类实现了Lasso
回归模型。其原型为:lass sklearn.linear_model.Lasso(alpha=1.0, fit_intercept=True, normalize=False,precompute=False, copy_X=True, max_iter=1000, tol=0.0001, warm_start=False, positive=False, random_state=None, selection='cyclic')
-
alpha
: 控制的是对模型正则化的程度。 -
precompute
:一个布尔值或者一个序列。是否提前计算Gram
矩阵来加速计算。 -
warm_start
:是否从头开始训练。 -
positive
:一个布尔值。如果为True
,那么强制要求权重向量的分量都为正数。 -
selection
:一个字符串,可以为'cyclic'
或者'random'
。它指定了当每轮迭代的时候,选择权重向量的哪个分量来更新。-
'random'
:更新的时候,随机选择权重向量的一个分量来更新 -
'cyclic'
:更新的时候,从前向后依次选择权重向量的一个分量来更新
-
- 其它参数参考
Ridge
。
-
模型属性:参考
Ridge
。模型方法: 参考
LinearRegression
。
ElasticNet(弹性网络)
-
ElasticNet
类实现了ElasticNet
回归模型。其原型为:class sklearn.linear_model.ElasticNet(alpha=1.0, l1_ratio=0.5, fit_intercept=True,normalize=False, precompute=False, max_iter=1000, copy_X=True, tol=0.0001,warm_start=False, positive=False, random_state=None, selection='cyclic')
-
alpha
: 控制的是对模型正则化的程度。 -
l1_ratio
:通过控制这个参数来调节岭回归与套索回归的混合比例 。 - 其它参数参考
Lasso
。
-
模型属性:参考
Lasso
。模型方法:参考
Lasso
。
参考资料:
《吴恩达机器学习》《sklearn官方文档》《AI算法工程师手册》