线性回归
一、单变量线性回归
1.最小二乘法
将横坐标作为x轴,纵坐标作为y轴,每一个点为(X(i) ,y(i)),那么我们期望寻找的直线就是y=ax+b,当给出一个新的点x(j)的时候,我们希望预测的y^(j)=ax(j)+b。

2.示例
(1)生成数据
import numpy as np
# 随机生成点 y = 3x + 4 + 高斯噪声
X = 2 * np.random.rand(100, 1)
y = 4 + 3 * X + np.random.randn(100, 1)
%matplotlib inline
import matplotlib.pyplot as plt
plt.scatter(X, y)

(2)训练模型
①基于解析方法估计参数的LinearRegression
from sklearn.linear_model import LinearRegression
lin_reg = LinearRegression()
lin_reg.fit(X, y)
# 线性方程的斜率和截距
lin_reg.coef_, lin_reg.intercept_

plt.scatter(X, y)
line_x = np.linspace(0, 2, 100)
line_y = lin_reg.coef_ * line_x + lin_reg.intercept_
line_y = line_y.reshape(100,)
plt.plot(line_x, line_y, 'r-')

②基于随机梯度下降法估计参数的SGDRegressor
from sklearn.linear_model import SGDRegressor
sgd_reg = SGDRegressor(n_iter_no_change=50, penalty=None, eta0=0.1)
sgd_reg.fit(X, y.reshape(-1))
# 线性方程的斜率和截距
sgd_reg.coef_, sgd_reg.intercept_
二、多变量线性回归
1.多项式回归
(1)线性回归预测模型


-
向量化线性回归
线性回归模型的MSE成本函数
标准线性方程的闭式解
(2)示例
- 1.生成数据
m = 100
X = 6 * np.random.rand(m, 1) - 3
# y = 0.5x^2 + x + 2
y = 0.5 * X ** 2 + X + 2 + np.random.randn(m, 1)
plt.scatter(X, y)

- 2.训练模型
from sklearn.preprocessing import PolynomialFeatures
poly_features = PolynomialFeatures(degree=2, include_bias=False)
# 将X转换为多项式类型
X_poly = poly_features.fit_transform(X)
lin_reg = LinearRegression()
lin_reg.fit(X_poly, y)
lin_reg.coef_, lin_reg.intercept_

plt.scatter(X, y)
line_x = np.linspace(-3, 3, 100)
line_y = lin_reg.coef_[0, 1] * line_x ** 2 + lin_reg.coef_[0, 0] * line_x + lin_reg.intercept_
plt.plot(line_x, line_y, 'r-')

- 3.绘制学习曲线
绘制训练集和测试集的误差
from sklearn.metrics import mean_squared_error
from sklearn.model_selection import train_test_split
def plot_learning_curve(model, X, y):
# 训练集数据,测试集数据,训练集标签,测试集标签
X_train, X_val, y_train, y_val = train_test_split(X, y, test_size=0.2)
train_errors, val_errors = [], []
for m in range(1, len(X_train)):
model.fit(X_train[:m], y_train[:m])
# 在训练集上预测
y_train_predict = model.predict(X_train[:m])
# 在测试集上预测
y_val_predict = model.predict(X_val)
# 计算并添加误差
train_errors.append(mean_squared_error(y_train_predict, y_train[:m]))
val_errors.append(mean_squared_error(y_val_predict, y_val))
plt.plot(np.sqrt(train_errors), 'r-+', linewidth=2, label='train')
plt.plot(np.sqrt(val_errors), 'b-', linewidth=3, label='val')
plt.legend()
lin_reg = LinearRegression()
plot_learning_curve(lin_reg, X, y)

三、梯度下降法
1.梯度下降算法
梯度下降是一种非常通用的优化算法,能够为大范围的问题找到最优解。梯度下降的中心思想就是迭代地调整参数从而使成本函数最小化。具体来说,首先使用一个随机的θ值(这被称为随机初始化),然后逐步改进,每次踏出一步,每一步都尝试降低一点成本函数(如MSE),直到算法收敛出一个最小值。

梯度下降中一个重要参数是每一步的步长,这取决于超参数学习率。如果学习率太低,算法需要经过大量迭代才能收敛,这将耗费很长时间。

如果学习率太高,那你可能会越过山谷直接到达山的另一边,甚至有可能比之前的起点还要高。这会导致算法发散,值越来越大,最后无法找到好的解决方案。

并不是所有的成本函数看起来都像一个漂亮的碗。有的可能看着像洞、像山脉、像高原或者是各种不规则的地形,导致很难收敛到最小值。

线性回归模型的MSE成本函数恰好是个凹函数,这意味着连接曲线上任意两个点的线段永远不会跟曲线相交。也就是说不存在局部最小,只有一个全局最小值。它同时也是一个连续函数,所以斜率不会产生陡峭的变化。

成本函数虽然是碗状的,但如果不同特征的尺寸差别巨大,那它可能是一个非常细长的碗。如图所示的梯度下降,左边的训练集上特征1和特征2具有相同的数值规模,而右边的训练集上,特征1的值则比特征2要小得多。
左图的梯度下降算法直接走向最小值,可以快速到达。而在右图中,先是沿着与全局最小值方向近乎垂直的方向前进,接下来是一段几乎平坦的长长的山谷。最终还是会抵达最小值,但是这需要花费大量的时间。
2.批量梯度下降
要实现梯度下降,你需要计算每个模型关于参数θj的成本函数的梯度。换言之,你需要计算的是如果改变θj,成本函数会改变多少。这被称为偏导数。


如果要训练的线性模型拥有几十万个特征,使用梯度下降比标准方程要快得多。
一旦有了梯度向量,哪个点向上,就朝反方向下坡。也就是从θ中减去梯度向量。这时学习率η就发挥作用了:用梯度向量乘以η确定下坡步长的大小。

3.随机梯度下降
批量梯度下降的主要问题是它要用整个训练集来计算每一步的梯度,所以训练集很大时,算法会特别慢。与之相反的极端是随机梯度下降,每一步在训练集中随机选择一个实例,并且仅基于该单个实例来计算梯度。显然,这让算法变得快多了,因为每个迭代都只需要操作少量的数据。
由于算法的随机性质,它比批量梯度下降要不规则得多。成本函数将不再是缓缓降低直到抵达最小值,而是不断上上下下,但是从整体来看,还是在慢慢下降。随着时间推移,最终会非常接近最小值,但是即使它到达了最小值,依旧还会持续反弹,永远不会停止。所以算法停下来的参数值肯定是足够好的,但不是最优的。

随机梯度下降其实可以帮助算法跳出局部最小值,所以相比批量梯度下降,它对找到全局最小值更有优势。
4.小批量梯度下降
每一步的梯度计算,既不是基于整个训练集(如批量梯度下降)也不是基于单个实例(如随机梯度下降),而是基于一小部分随机的实例集也就是小批量。相比随机梯度下降,小批量梯度下降的主要优势在于可以从矩阵运算的硬件优化中获得显著的性能提升,特别是需要用到图形处理器时。
四、逻辑回归
逻辑回归(Logistic回归)被广泛用于估算一个实例属于某个特定类别的概率。如果预估概率超过50%,则模型预测该实例属于该类别(称为正类,标记为“1”),反之,则预测不是(也就是负类,标记为“0”)。因此它是一个二元分类器(也可以是多分类的)。
from sklearn.linear_model import LogisticRegression
logistic_reg = LogisticRegression()
logistic_reg.fit(X, y)
1.概率估算

-
sigmoid函数
sigmoid函数
2.预测函数与决策边界


3.成本函数

由于局部收敛无法满足梯度下降算法,因此采用以下损失函数:



4.训练模型
from sklearn.linear_model import LogisticRegression
logistic_reg = LogisticRegression()
logistic_reg.fit(X, y)
五、正则化
1.岭回归(线性回归正则化)
岭回归(也叫作吉洪诺夫正则化)是线性回归的正则化版:在成本函数中添加一个等于

的正则项。这使得学习中的算法不仅需要拟合数据,同时还要让模型权重保持最小。注意,正则项只能在训练的时候添加到成本函数中,一旦训练完成,你需要使用未经正则化的性能指标来评估模型性能。
训练阶段使用的成本函数与测试时使用的成本函数不同是非常常见的现象。除了正则化以外,还有一个导致这种不同的原因是,训练时的成本函数通常都可以使用优化过的衍生函数,而测试用的性能指标需要尽可能接近最终目标。

超参数α控制的是对模型进行正则化的程度。如果α=0,则岭回归就是线性模型。如果α非常大,那么所有的权重都将非常接近于零,结果是一条穿过数据平均值的水平线。
在执行岭回归之前,必须对数据进行缩放(例如使用StandardScaler),因为它对输入特征的大小非常敏感。大多数正则化模型都是如此。

from sklearn.linear_model import Ridge
ridge_reg = Ridge(alpha=0.5)
ridge_reg.fit(X, y)
2.套索回归(线性回归正则化)
线性回归的另一种正则化,叫作最小绝对收缩和选择算子回归(简称Lasso回归,或套索回归)。与岭回归一样,它也是向成本函数增加一个正则项,但是它增加的是权重向量的l1范数,而不是l2范数的平方的一半。

Lasso回归的一个重要特点是它倾向于完全消除掉最不重要特征的权重(将他们设置为零)
岭回归和套索回归的区别:岭回归会倾向于将重要特征值的权重逐渐减小。套索回归会逐渐消除掉不重要的特征值。
from sklearn.linear_model import Lasso
lasso_reg = Lasso(alpha=0.7)
lasso_reg.fit(X, y)
3.弹性网络
弹性网络是岭回归与Lasso回归之间的中间地带。其正则项就是岭回归和Lasso回归的正则项的混合,混合比例通过r来控制。当r=0时,弹性网络即等同于岭回归,而当r=1时,即相当于Lasso回归。

from sklearn.linear_model import ElasticNet
elastic_net = ElasticNet(alpha=0.1, l1_ratio=0.5)
elastic_net.fit(X, y)
4.早期停止法
对于梯度下降这一类迭代学习的算法,还有一个与众不同的正则化方法,就是在验证误差达到最小值时停止训练,该方法叫做早期停止法。下图展现了一个用批量梯度下降训练的复杂模型(高阶多项式回归模型)。经过一轮一轮的训练,算法不断地学习,训练集上的预测误差(RMSE)自然不断下降,同样其在验证集上的预测误差也随之下降。但是,一段时间之后,验证误差停止下降反而开始回升。这说明模型开始过度拟合训练数据。通过早期停止法,一旦验证误差达到最小值就立刻停止训练。

网友评论