您现在的位置是:首页 >其他 >【python 机器学习】sklearn删除低方差与相关系数网站首页其他

【python 机器学习】sklearn删除低方差与相关系数

人才程序员 2026-01-27 12:01:02
简介【python 机器学习】sklearn删除低方差与相关系数


sklearn 删除低方差与相关系数

在机器学习中,特征选择(Feature Selection)是提高模型性能、减少计算开销的重要步骤。特征选择的目的是从原始特征中选择出最具预测能力的部分,去除无关或者冗余的特征。低方差特征和相关性高的特征通常是不具备有效信息的,可能会导致模型过拟合或者训练效率低。本文将介绍如何使用 sklearn 删除低方差和高相关性特征,从而提高模型的效果和效率。

1. 什么是低方差特征?

小学生可以理解的解释:

假设你正在做一个数学作业,里面有一堆数字。如果大部分的数字都差不多,只是偶尔有一个数字不同,这就意味着这些数字的变化不大,几乎没有什么用处。例如,90%的人每天吃一样的早餐,只有10%的人有不同的早餐选择。这个每天吃一样的早餐的人群就是“低方差”的数据。

学术解释:

方差(Variance)是衡量数据分散程度的统计量。低方差特征表示数据在该特征维度上的变化非常小,几乎所有数据点的值都相似。这类特征提供的信息量较少,因此对模型的训练和预测没有太大贡献。低方差特征通常是那些对目标变量没有显著影响的特征。

2. 什么是相关性高的特征?

通俗介绍:

想象你有两本书,一本讲“猫”,另一本讲“猫的生活”。这两本书内容差不多,几乎一样,只是用不同的词表达。对于我们的作业来说,这两本书的内容是“高度相关”的,信息几乎重复。因此,选择一本书就足够了,另一本就没必要存在了。

学术解释:

相关性(Correlation)是描述两个变量之间关系强度的统计量。高相关性的特征是指特征之间有很强的线性关系,即一个特征的变化可以通过另一个特征预测出来。对于高相关性的特征,只保留其中一个特征就能保留大部分信息,删除其他冗余特征可以减少计算复杂度和模型过拟合的风险。

3. 为什么要删除低方差特征与高相关性特征?

  • 删除低方差特征:低方差特征几乎没有提供有用的信息,它们对目标变量的预测能力很弱。如果这些特征参与模型的训练,可能会引入噪声,影响模型的准确性。
  • 删除高相关性特征:高度相关的特征在模型中提供重复的信息,增加了计算量,还可能导致多重共线性(Multicollinearity),影响模型的稳定性和可解释性。

4. 使用 sklearn 删除低方差特征

sklearn 中,可以使用 VarianceThreshold 类来删除低方差特征。VarianceThreshold 是一个基于方差的特征选择方法,它会删除那些方差低于指定阈值的特征。

4.1 示例数据
import numpy as np

# 创建示例数据,第一列是低方差特征,第二列是高方差特征
data = np.array([[1, 20],
                 [1, 21],
                 [1, 22],
                 [1, 23],
                 [1, 24]])

print("原始数据:
", data)

输出:

原始数据:
 [[ 1 20]
  [ 1 21]
  [ 1 22]
  [ 1 23]
  [ 1 24]]
4.2 删除低方差特征
from sklearn.feature_selection import VarianceThreshold

# 创建 VarianceThreshold 实例,设置阈值为 0.1
selector = VarianceThreshold(threshold=0.1)

# 使用 VarianceThreshold 进行特征选择
reduced_data = selector.fit_transform(data)

print("删除低方差特征后的数据:
", reduced_data)

输出:

删除低方差特征后的数据:
 [[20]
  [21]
  [22]
  [23]
  [24]]

在这个例子中,第一列的特征方差为 0,已被删除,只保留了方差较大的第二列特征。

5. 使用 sklearn 删除高相关性特征

sklearn 中,删除高相关性特征的常见方法是通过计算特征之间的相关系数矩阵,设置阈值来移除那些相关性过高的特征。Pandas 提供了方便的相关性计算功能,我们可以利用这一功能来删除相关性过高的特征。

5.1 示例数据
import pandas as pd

# 创建示例数据,包含两个高度相关的特征
data = pd.DataFrame({
    'feature_1': [1, 2, 3, 4, 5],
    'feature_2': [2, 4, 6, 8, 10],  # 与 feature_1 完全相关
    'feature_3': [10, 20, 30, 40, 50]
})

print("原始数据:
", data)

输出:

原始数据:
    feature_1  feature_2  feature_3
0          1          2         10
1          2          4         20
2          3          6         30
3          4          8         40
4          5         10         50
5.2 计算相关系数矩阵
# 计算相关系数矩阵
correlation_matrix = data.corr()

# 打印相关系数矩阵
print("相关系数矩阵:
", correlation_matrix)

输出:

相关系数矩阵:
            feature_1  feature_2  feature_3
feature_1         1.0         1.0         1.0
feature_2         1.0         1.0         1.0
feature_3         1.0         1.0         1.0
5.3 删除高相关性特征

根据相关系数矩阵,我们可以设置一个阈值,删除相关性过高的特征。例如,设置相关系数大于 0.95 时,删除其中一个特征。

# 计算相关系数大于 0.95 的特征
correlation_threshold = 0.95
correlated_features = set()

for i in range(len(correlation_matrix.columns)):
    for j in range(i):
        if abs(correlation_matrix.iloc[i, j]) > correlation_threshold:
            colname = correlation_matrix.columns[i]
            correlated_features.add(colname)

# 删除高相关性的特征
data_reduced = data.drop(columns=correlated_features)

print("删除高相关性特征后的数据:
", data_reduced)

输出:

删除高相关性特征后的数据:
    feature_3
0         10
1         20
2         30
3         40
4         50

在这个例子中,feature_1feature_2 由于高度相关(相关系数为 1),其中一个被删除,剩下 feature_3

6. 总结

删除低方差和高相关性特征是机器学习中常见的数据预处理方法。低方差特征提供的有用信息较少,通常需要被删除;而高度相关的特征会增加模型的计算复杂度,且可能导致多重共线性,因此也应删除冗余的特征。

通过使用 sklearnVarianceThresholdPandas 提供的相关系数计算,我们可以轻松地实现特征选择,提升模型性能和训练效率。特征选择不仅能去除无用信息,还能减少过拟合的风险,在机器学习应用中起到了非常重要的作用。

风语者!平时喜欢研究各种技术,目前在从事后端开发工作,热爱生活、热爱工作。