本示例比较了三种基于L1的回归模型在合成信号上的性能,这些信号由稀疏且相关的特性构成,并受到高斯噪声的干扰。众所周知,当数据维度增长时,Lasso估计接近模型选择估计,前提是不相关变量与相关变量之间的相关性不要太高。然而,在存在相关特征的情况下,Lasso本身无法选择正确的稀疏模式。
在这里,比较了三种模型的性能,包括R²分数、拟合时间和与真实系数相比估计系数的稀疏度。生成了一个样本数量少于总特征数量的数据集,导致了一个欠定系统,即解决方案不是唯一的,因此不能单独应用普通最小二乘法。正则化通过向目标函数引入惩罚项来修改优化问题,有助于缓解系统的欠定性质。
目标y是具有交替符号的正弦信号的线性组合。只有X中的100个频率中的最低10个被用来生成y,而其余的特征则没有信息量。这导致了一个高维稀疏特征空间,其中一些程度的L1惩罚是必要的。
import numpy as np
rng = np.random.RandomState(0)
n_samples, n_features, n_informative = 50, 100, 10
time_step = np.linspace(-2, 2, n_samples)
freqs = 2 * np.pi * np.sort(rng.rand(n_features)) / 0.01
X = np.zeros((n_samples, n_features))
for i in range(n_features):
X[:, i] = np.sin(freqs[i] * time_step)
idx = np.arange(n_features)
true_coef = (-1)**idx * np.exp(-idx / 10)
true_coef[n_informative:] = 0 # sparsify coef
y = np.dot(X, true_coef)
一些有信息量的特征具有接近的频率以诱导(反)相关性。引入了随机相位,并添加了一些高斯噪声到特征和目标上。这样的稀疏、嘈杂且相关的特性可以从监测某些环境变量的传感器节点中获得,因为它们通常根据位置(空间相关性)注册相似的值。
可以可视化目标信号。然后将数据分为训练和测试集以简化问题。在实践中,应该使用时间序列分割交叉验证来估计测试分数的方差。在这里,设置shuffle="False",因为必须不使用在处理具有时间关系的数据处理时,测试数据之后的训练数据。
from sklearn.model_selection import train_test_split
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.5, shuffle=False)
接下来,计算了三种基于L1的模型在拟合优度R²分数和拟合时间方面的性能。然后制作了一个图表,比较了估计系数的稀疏度与真实系数,并最终分析了先前的结果。
在本示例中,ElasticNet产生了最佳分数,并捕获了大部分预测特征,但仍未能找到所有真实组件。请注意,ElasticNet和ARDRegression产生的模型比Lasso模型的稀疏度要低。
结论:Lasso能够有效地恢复稀疏数据,但在处理高度相关的特征时表现不佳。实际上,如果几个相关特征对目标有贡献,Lasso最终会选择它们中的一个。在稀疏但非相关特征的情况下,Lasso模型将更加适用。ElasticNet引入了一定程度的系数稀疏性,并将它们的值缩小到零。因此,在存在对目标有贡献的相关特征的情况下,模型仍然能够减少它们的权重,而不必将它们精确地设置为零。这导致了一个比纯Lasso模型更不稀疏的模型,并且可能捕获非预测性特征。ARDRegression在处理高斯噪声时更好,但仍然无法处理相关特征,并且由于拟合先验,需要更多的时间。