我们应该如何处理高度相关的特征?

Posted

技术标签:

【中文标题】我们应该如何处理高度相关的特征?【英文标题】:What we should do with highly correlated features? 【发布时间】:2021-03-25 20:48:21 【问题描述】:

在我的数据集中,C1C2 的两个特征高度相关。我做了以下步骤。您能否让我知道它是否正确且有意义?你有更好的方法吗?

首先我使用线性模型来找到拟合线: C1=a*C2+b

from sklearn import linear_model

reg=linear_model.LinearRegression()
y_reg = data1['C1']
x_reg = data1['C2']
reg.fit(x_reg2,y_reg2)
a=reg.coef_
b=reg.intercept_

print(a,b)

在找到 a 和 b 后,我从数据集中删除了 C1C2 并添加了一个新的 Vriable:new=a*C1+b

我的下一个问题是如何理解这条线好不好?

【问题讨论】:

如果您的目标是进行预测,那么保留这两个变量就可以了。如果您使用 LR 来解释自变量和因变量之间的关系,则可以采取一系列措施来处理相关措施。无论哪种方式,您都可以运行两个不同的 LR 并保持误差最低(或性能最高)的一个,或者您可以使用处理多重共线性的技术 (statisticsbyjim.com/regression/…),例如方差膨胀因子 (kaggle.com/ffisegydd/sklearn-multicollinearity-class)。 【参考方案1】:

一般而言,建议您避免在数据集中包含相关特征。确实,一组高度相关的特征不会带来额外的信息(或只是很少),但会增加算法的复杂性,从而增加出错的风险。根据特征和模型,相关特征可能并不总是会损害模型的性能,但这是一个真正的风险。

您可以将此视为对Occam's razor 的解释:性能没有显着差异,应该首选更简单的模型。在您的情况下,如果性能相似,更简单的模型是只有 C1 或 C2 而不是两者的模型。

现在你在用 a*C1+b 替换 C1 和 C2 时所做的实际上消除了多重共线性,但这对我来说没有多大意义。与仅保留 C1 相比,我没有看到任何好处:实际上,您将 C1 和 C2 替换为适合匹配的新变量... C1!如果线性拟合好,几乎没有区别。

特征工程和特征选择应该通过基础理论或至少是领域知识来证明是合理的,因此您可以做以下几件事:

在训练模型之前将 PCA 应用于数据集:这将产生一个新的且不相关的特征集。缺点是如果你需要的话,你将无法用原始特征来解释模型的决定。 使用特征选择算法。最佳算法将取决于数据和模型。这里以scikit learn's feature selection algorithms 为例。 只需比较模型与 C1 和 C2 的性能,然后仅比较 C1 和仅 C2。然后估计性能上的差异是否值得保留这两个特征(这实际上是应用奥卡姆剃刀原理)。这可以看作是一种“手动”特征选择算法。 使用领域知识选择保留哪个变量:哪个变量与问题最相关?。如果模型的训练成本太高而无法进行多次实验,则可以这样做。

我还建议您阅读this thread on data science stack exchange,因为它会给您关于多重共线性问题的其他一些意见。我认为这对您来说很有趣,因为它将完善我在此处提供的见解并帮助您决定如何处理 C1 和 C2。

【讨论】:

【参考方案2】:

只需删除高度相关的特征。不删除功能可能会降低效率和不必要的成本。

【讨论】:

以上是关于我们应该如何处理高度相关的特征?的主要内容,如果未能解决你的问题,请参考以下文章

使用 K-nn 算法处理音乐流派,如何处理提取的特征? [关闭]

如何处理类别型特征

我认为适用于 Android 的 Google Chrome 有一个奇怪的视口高度错误,应该修复它。现在,你如何处理它?

如何处理未知的 UILabel 高度及其对 Interface Builder 中标签下方的影响?

如何处理危机公关?

nodejs 异步应该如何处理