在特征选择步骤中,我们希望识别相关特征并删除冗余特征。
根据我的理解,冗余特征是依赖的特征。(因此,我们希望在特征之间只保留相互独立的特征)
我的问题是关于使用sklearn
和ANOVA/卡方检验来删除冗余特征的方法。
据我所读(以及看到的例子),我们使用SelectKBest
或SelectPercentile
来保留与目标(y
)相关的最高分特征。
但是,我们可以使用这些方法和chi2, f_classif
来删除依赖的特征吗?
换句话说,我想用sklearn的方法删除冗余特征。我们该怎么做?
回答:
您可以使用SelectKBest
来使用提供的函数(例如卡方)对特征进行评分,并获取得分最高的N个特征。例如,为了保留前10个特征,您可以使用以下代码:
from sklearn.feature_selection import SelectKBest, chi2, f_classif# 卡方top_10_features = SelectKBest(chi2, k=10).fit_transform(X, y)# 或ANOVAtop_10_features = SelectKBest(f_classif, k=10).fit_transform(X, y)
然而,在特征减少的背景下,通常有很多有用的方法和技术。您通常需要根据您的数据、您正在训练的模型以及您想要预测的输出,决定使用哪些方法。例如,即使您最终得到20个特征,您还需要检查每对特征之间的相关性,并在它们高度相关的情况下删除其中一个。
以下函数将为您提供最相关的特征。您可以使用此输出进一步减少当前的变量列表:
def get_feature_correlation(df, top_n=None, corr_method='spearman', remove_duplicates=True, remove_self_correlations=True): """ 计算特征相关性并根据其相关性排序特征对 :param df: 包含预测变量的数据框 :type df: pandas.core.frame.DataFrame :param top_n: 要报告的前N个特征对(如果为None,将返回所有对) :param corr_method: 相关性计算方法 :type corr_method: str :param remove_duplicates: 指示是否必须删除重复特征 :type remove_duplicates: bool :param remove_self_correlations: 指示是否删除自身相关性 :type remove_self_correlations: bool :return: pandas.core.frame.DataFrame """ corr_matrix_abs = df.corr(method=corr_method).abs() corr_matrix_abs_us = corr_matrix_abs.unstack() sorted_correlated_features = corr_matrix_abs_us \ .sort_values(kind="quicksort", ascending=False) \ .reset_index() # 删除同一特征的比较 if remove_self_correlations: sorted_correlated_features = sorted_correlated_features[ (sorted_correlated_features.level_0 != sorted_correlated_features.level_1) ] # 删除重复项 if remove_duplicates: sorted_correlated_features = sorted_correlated_features.iloc[:-2:2] # 为列创建有意义的名称 sorted_correlated_features.columns = ['特征1', '特征2', '相关性(绝对值)'] if top_n: return sorted_correlated_features[:top_n] return sorted_correlated_features
其他选项可能包括:
- 缺失值的百分比
- 与目标变量的相关性
- 包含一些随机变量,看它们是否会进入后续的减少变量列表
- 特征随时间的稳定性
- 等等
正如我提到的,实际上这取决于您想要实现什么。