相关性过滤:
根据方差过部分滤完特征后(并不是说方差很大的数据就一定有用),就要考虑相关性了。使用相关性过滤后筛选出与标签相关且有意义的特征。
卡方过滤:
作用:专门针对离散型标签,即分类问题的相关性过滤。
大致流程:计算每个非负特征和标签之间的卡方统计量,并且按照卡方统计量由高到低为特征排名,选出前k个分数最高的特征
# feature_selection.chi2:计算每个非负特征和标签之间的卡方统计量,标签按照该统计量由高到低为特征排名
# feature_selection.SelectKBest:根据输入的评分标准选出k个特征
from sklearn.ensemble import RandomForestClassifier as RFC
from sklearn.model_selection import cross_val_score
from sklearn.feature_selection SelectKBest
from sklearn.feature_selection import chi2
xFChi = SelectKBest(chi2,k=300).fit_transform(xFVar,y)
选取超参数k:
方法一:绘制学习曲线,缺点计算慢
score = []
for i in range(780,200,-10):
item = SelectKBest(chi2,k=i).fit_transform(dataX,dataY) # 筛选特征
item_rfc = cross_val_score(RFC(n_estimators=10,random_state=0),item,dataY,cv=2).mean()
score.append(item_rfc)
plt.plot(range(780,200,-10),score)
plt.show()
方法二:看P值
缺点:可能会去除掉一些重要特征
卡方检验的本质是推测两组数据之间的差异,其检验的原假设是“两组数据相互独立”,卡方检验返回卡方值和P值两个统计量,其中卡方值难界定有效范围。而p值,一般使用0.01或0.05作为显著性水平,即p值判断的边界。
从特征工程的角度,希望选取卡方值很大,p值小于0.05的特征,即和标签相关联的特征
chiVal,pVal=chi2(x_fvar,y)
chiVal # 卡方值
pVal # p值
#消除p值>设定值,如0.01或者0.05的特征
k = chiVal.shape[0] - (pVal>0.05).sum()
F检验
作用:F检验又称ANOVA,用来捕捉每个特征与标签之间的线性关系的过滤方法,feature_selection.f_classif用于离散型变量,feature_selection.f_regression用于处理连续型变量
大致流程:寻找两组数据之间的线性关系,其原假设是“数据不存在显著的线性关系”,返回f值和p值。选取p值小于0.05或者0.01的特征,这些特征与标签是显著相关的。
注意:F检验在数据服从正态分布是效果非常稳定,因此可先将数据转换成服从服从正态分布的数据
from sklearn.feature_selection import f_classif
F,pVal = f_classif(x_fvar,y)
F
pVal
k = F.shape[0] - (pVal > 0.05).sum()
互信息法:
互信息法是用来捕捉每个特征与标签之间的任意关系(包括线性和非线性关系)的过滤方法。和F检验相似,它既可以做回归也可以做分类,并且包含两个类feature_selection.mutual_info_classif(互信息分类)和feature_selection.mutual_info_regression(互信息回归)。
这两个类的用法和参数都和F检验一模一样,不过互信息法比F检验更加强大,F检验只能够找出线性关系,而互信息法可以找出任意关系。
互信息法不返回p值或F值类似的统计量,它返回“每个特征与目标之间的互信息量的估计”,这个估计量在[0,1]之间取值,为0则表示两个变量独立,为1则表示两个变量完全相关。以互信息分类为例的代码如下:
from sklearn.feature_selection import mutual_info_classif as MIC
result = MIC(X_fsvar,y) k = result.shape[0] - sum(result <= 0)
#X_fsmic = SelectKBest(MIC, k=填写具体的k).fit_transform(X_fsvar, y)
#cross_val_score(RFC(n_estimators=10,random_state=0),X_fsmic,y,cv=5).mean()