SelectKBest 是一种特征选择方法,它的原理是在一组特征中选择出对目标变量(如分类或回归的输出)影响最大的 K 个特征。它的工作流程可以分为以下几个步骤:
评分函数:选择一个评分函数来评估每个特征与目标变量之间的关联强度。这个评分函数根据特征的类型和问题的性质(分类或回归)来选择。常见的评分函数包括:
对于分类问题:卡方检验(Chi-squared test)、F-值(ANOVA F-value)、互信息评分(Mutual Information)。
对于回归问题:F-值(ANOVA F-value)、互信息回归(Mutual Information for regression)。
计算评分:对数据集中的每个特征应用评分函数,计算每个特征与目标变量之间的统计关联度。
选择特征:根据计算得到的评分,选择评分最高的 K 个特征。这些特征被认为是对预测目标变量最有用的。
结果应用:选出的这些顶级特征随后可以用于训练机器学习模型。
SelectKBest 的关键在于正确选择评分函数,并确定适当的 K 值。不同的评分函数可能适用于不同类型的数据和问题,而选择的 K 值会影响模型的复杂度和性能。选择合适的 K 值通常需要借助交叉验证等技术,以找到最佳的特征数量,从而在模型复杂度和性能之间取得平衡。
# 方差选择法
from sklearn.feature_selection import VarianceThreshold
X = VarianceThreshold(threshold=0.1).fit_transform(data, data["label"])
# 相关系数法
from sklearn.feature_selection import SelectKBest
from scipy.stats import pearsonr
sk = SelectKBest(k=5) # 选择 k 个最好的特征
X = sk.fit_transform(data, data["label"])
# 卡方(需要 X 为正,即半正定矩阵)
from sklearn.feature_selection import chi2
sk = SelectKBest(chi2, k=5)
X = sk.fit_transform(data, data["label"])
# 互信息
from minepy import MINE
def mic(x, y):
m = MINE()
m.compute_score(x, y)
return (m.mic(), 0.5)
sk = SelectKBest(
lambda X, Y: array(map(lambda x: mic(x, Y), X.T)).T, k=2)
X = sk.fit_transform(data, data["label"])
# RFE
from sklearn.feature_selection import RFE
from sklearn.linear_model import LogisticRegression
rfe = RFE(estimator=LogisticRegression(),
n_features_to_select=2)
X = sk.fit_transform(data, data["label"])
# 基于惩罚项
from sklearn.feature_selection import SelectFromModel
from sklearn.linear_model import LogisticRegression
sf = SelectFromModel(
LogisticRegression(penalty="l1", C=0.1)
)
X = sf.fit_transform(data_train_filter, data_train.isDefault)
# 基于树模型
from sklearn.feature_selection import SelectFromModel
from sklearn.ensemble import GradientBoostingClassifier
sf = SelectFromModel(
GradientBoostingClassifier())
X = sf.fit_transform(data_train_filter, data_train.isDefault)