回归问题(Regression)
理论
线性回归(Linear Regression)是一种通过属性的线性组合来进行预测的线性模型,其目的是找到一条直线或一个平面或更高维的超平面,使得预测值与真实值之间的误差最小化。
其中普通最小二乘法(ordinary least squares,OLS)是回归问题最简单也最经典的线性方法。线性回归寻找参数w和b,使得对训练集的预测值与真实的回归目标值y之间的均方误差最小。均方误差(mean squared error)是预测值与真实值之差的平方和除以样本数。线性回归没有参数,这是一个优点,但也因此无法控制模型的复杂度。
线性回归的最大优点是模型具有很好的可解释性,w直观地表示了各属性在预测中的重要性,计算熵不复杂。但同时,线性回归对非线性数据拟合不好。
原理与推导
一个数据集\(D\)中有\(m\)个样本,即\(D = \{(\textbf{x}_{1}, \textbf{y}_{1}),(\textbf{x}_{2}, \textbf{y}_{2}), \ldots,(\textbf{x}_{m}, \textbf{y}_{m})\} = \{(\textbf{x}_{i}, \textbf{y}_{i})\}_{i = 1}^m\)。其中每一个样本的输入\(\textbf{x}_{i}\)都是由\(d\)个属性组成,即\(\textbf{x}_{i}=(x_{i1}, x_{i2} , \ldots, x_{id}), \textbf{x}_{i} \in \mathbb{R}^{d}\)。样本的输出为\(\textbf{y}_{i} \in \mathbb{R}\)。
模型建立
线性回归试图学得函数\(f(\textbf{x}_{i})\)使得\(\hat{\textbf{y}}_{i} = f(\textbf{x}_{i}) \simeq {\textbf{y}_{i}}\),其中,函数如下:
为便于讨论,使\(b = {w_0} \cdot x_0\),其中\({x_0} = 1\)。此时,\(w\)就成为了\(\hat{w} = ({{w_0},{w_1}, \ldots ,{w_d}})\),\(x\)就成为了\(\textbf{x}_{i}=({1},{x_{i1}}, \ldots ,{x_{id}})\),期望学得的函数为\(f(\textbf{x}_{i}) = {\hat{w}^T}{\textbf{x}_{i}}\)。
误差分析
预测值和真实值之间都存在差异\(\varepsilon\),对于每个样本都有
假设误差\(\varepsilon_i\)是独立同分布的,并且服从高斯分布。即:
结合前两个公式,得到在已知参数\(w\)和数据\(\textbf{x}_{i}\)的情况下,预测值为\(\textbf{y}_{i}\)的条件概率:
为了根据样本估计参数值,可以将\(m\)个样本依次代入上式并相乘,可以得到最大似然概率:
对上述取对数,可以将乘法运算转换为加法运算:
想要使得最大似然概率最大,只要使得目标函数最小即可,目标函数可以表示为:
可以进一步用矩阵的形式表示,
由此,我们需要计算\(w\)使得目标函数最小,可以表示为:
凸优化
目标函数是凸函数,只要找到一阶导数为0的位置,就找到了最优解。偏导数为:
令上式子为0,可以得到:
针对\(X^{T}X\)是否可逆存在两种情况:
- \(X^{T}X\)可逆,可以得到\(\hat{w}^{*} = (X^{T}X)^{-1}X^{T}Y\)。
- \(X^{T}X\)不可逆,可能有多个解。选择哪一个解作为输出,将有学习算法的偏好决定,常见的做法是增加\(\lambda\)扰动,使得\(\hat{w}^{*} = (X^{T}X + \lambda I)^{-1} X^{T}Y\)。
小结
线性回归的本质就是寻找一个最优函数,使得预测值与实际值的差距最小,由此需要找到一个误差的量化表示。通常使用最小二乘法,即使得预测值与真实值插值平方和最小。这个表示来自于目前最有可能出现的分布是所有分布中可能性最大的,其假设误差服从正态分布,需要找到一个参数\(w\)使得似然概率最大。
广义线性回归
当\(Y\)不再只是线性回归中用到的正态分布,而是扩大为指数族中的任一分布。这样得到的模型称为“广义线性模型”(generalized linear model):
其中函数\(g(\cdot)\)称为“联系函数”(link function)。
Python实现
from sklearn.linear_model import LinearRegression
# X and y are raw data
X_train, X_test, y_train, y_test = train_test_split(X, y, random_state=42)
lr = LinearRegression().fit(X_train, y_train)
print("lr.coef_: {}".format(lr.coef_))
print("lr.intercept_: {}".format(lr.intercept_))
print("Training set score: {:.2f}".format(lr.score(X_train, y_train)))
print("Test set score: {:.2f}".format(lr.score(X_test, y_test)))
“斜率”参数(w,也叫作权重或系数)被保存在coef_属性中,而偏移或截距(b)被保存在intercept_属性中。intercept_属性是一个浮点数,而coef_属性是一个NumPy数组,每个元素对应一个输入特征。由于wave数据集中只有一个输入特征,所以lr.coef_中只有一个元素。
Tips:训练集和测试集上的分数非常接近时说明可能存在欠拟合,而不是过拟合。对于这个一维数据集来说,过拟合的风险很小,因为模型非常简单(或受限)。然而,对于更高维的数据集(即有大量特征的数据集),线性模型将变得更加强大,过拟合的可能性也会变大。
Tips:训练集和测试集之间的性能差异是过拟合的明显标志,因此我们应该试图找到一个可以控制复杂度的模型。
[1]. 线性组合:仅具有一次项和常数项所组成的加减方法。

浙公网安备 33010602011771号