您现在的位置是:首页 >其他 >【python 机器学习】sklearn删除低方差与相关系数网站首页其他
【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_1 和 feature_2 由于高度相关(相关系数为 1),其中一个被删除,剩下 feature_3。
6. 总结
删除低方差和高相关性特征是机器学习中常见的数据预处理方法。低方差特征提供的有用信息较少,通常需要被删除;而高度相关的特征会增加模型的计算复杂度,且可能导致多重共线性,因此也应删除冗余的特征。
通过使用 sklearn 的 VarianceThreshold 和 Pandas 提供的相关系数计算,我们可以轻松地实现特征选择,提升模型性能和训练效率。特征选择不仅能去除无用信息,还能减少过拟合的风险,在机器学习应用中起到了非常重要的作用。





U8W/U8W-Mini使用与常见问题解决
QT多线程的5种用法,通过使用线程解决UI主界面的耗时操作代码,防止界面卡死。...
stm32使用HAL库配置串口中断收发数据(保姆级教程)
分享几个国内免费的ChatGPT镜像网址(亲测有效)
Allegro16.6差分等长设置及走线总结