普通最小二乘法
线性模型旨在将目标值预测为输入特征的线性组合。通常表示为:
其中 是预测值, 是截距, 是系数。
普通最小二乘法
- 目标:最小化观测目标与预测值之间的残差平方和。
- 方法:拟合一个线性模型以最小化成本函数 。
- 复杂度:使用奇异值分解计算;如果 ,则为 。
from sklearn import linear_model
reg = linear_model.LinearRegression()
reg.fit([[0, 0], [1, 1], [2, 2]], [0, 1, 2])
print(reg.coef_)
非负最小二乘法
- 约束系数为非负。适用于表示价格等数量的变量。
OLS的复杂 度
- 使用SVD计算,成本取决于矩阵维度。
岭回归
- 目标:通过对系数大小施加惩罚来解决多重共线性问题。
- 方法:最小化 ,其中 是一个复杂度参数。
- 求解器选择:根据条件(例如,数据稀疏性)自动选择。
from sklearn import linear_model
reg = linear_model.Ridge(alpha=.5)
reg.fit([[0, 0], [0, 0], [1, 1]], [0, .1, 1])
print(reg.coef_)
print(reg.intercept_)
岭分类
- 通过转换目标并应用岭回归公式来处理二元分类。
Lasso
- 目标:估计稀疏系数,有效减少特征数量。
- 方法:最小化 。
- 用途:在压缩感知领域很重要。
- 特征选择:由于解的稀疏性,可用于特征选择。
from sklearn import linear_model
reg = linear_model.Lasso(alpha=0.1)
reg.fit([[0, 0], [1, 1]], [0, 1])
print(reg.predict([[1, 1]]))
多任务Lasso
- 目标:联合估计多个回归问题的稀疏系数。
- 特异性:所有回归任务选择相同的特征。
弹性网络
- 目标:结合岭回归和Lasso的惩罚项,在多个特征相关时非常有用。
- 方法:最小化 。
多任务弹性网络
- 目标:类似于多任务Lasso,但使用弹性网络惩罚项。
- 用途:适用于任务共享相同稀疏特征的情况。
最小角回归 (LARS)
- 目标:高效计算系数的完整路径。
- 方法:类似于前向逐步回归,调整方向以使其与所有与残差最相关的变量保持等角。
正交匹配追踪 (OMP)
- 目标:在非零系数数量的约束下,近似最佳拟合。
- 方法:选择与残差最相关的特征的贪婪算法。
贝叶斯回归
- 目标:通过先验分布引入正则化。
- 类型:
- 贝叶斯岭回归:正则化参数从数据中估计。
- 自动相关性确定 (ARD):类似于贝叶斯岭回归,但促进稀疏性。
from sklearn import linear_model
X = [[0., 0.], [1., 1.], [2., 2.], [3., 3.]]
Y = [0., 1., 2., 3.]
reg = linear_model.BayesianRidge()
reg.fit(X, Y)
print(reg.predict([[1, 0.]]))
print(reg.coef_)
逻辑回归
- 目标:用于分类的线性模型(尽管有其名称)。
- 方法:使用逻辑函数对默认类别的概率进行建模。
- 正则化:L1、L2和弹性网络可用于惩罚模型复杂度。
广义线性模型 (GLM)
- 扩展:允许使用指数族中不同的分布进行预测。
- 功能:通过链接函数建模关系,并将模型族扩展到正态分布误差之外。
分位数回归
- 目标:估计中位数或其他分位数,而非均值。
- 方法:最小化弹子损失(pinball loss),在预测区间时很有用。
多项式回归
- 目标:使用多项式基函数扩展线性模型。
- 用途:可以在线性框架内建模非线性关系。
多项式特征变换
from sklearn.preprocessing import PolynomialFeatures
import numpy as np
X = np.arange(6).reshape(3, 2)
poly = PolynomialFeatures(degree=2)
print(poly.fit_transform(X))
多项式回归管道
from sklearn.preprocessing import PolynomialFeatures
from sklearn.linear_model import LinearRegression
from sklearn.pipeline import Pipeline
import numpy as np
model = Pipeline([
('poly', PolynomialFeatures(degree=3)),
('linear', LinearRegression(fit_intercept=False))
])
x = np.arange(5)
y = 3 - 2 * x + x ** 2 - x ** 3
model.fit(x[:, np.newaxis], y)
print(model.named_steps['linear'].coef_)