赞
踩
作者主页(文火冰糖的硅基工坊):文火冰糖(王文兵)的博客_文火冰糖的硅基工坊_CSDN博客
本文网址:https://blog.csdn.net/HiWangWenBing/article/details/124080785
目录
卡方检验能够筛选算特征变量与标签变量之间的相关性,卡方过滤用于过滤掉那些与标签标签无关的特征变量。除了卡方检验,类似的还有F检验和互信息量检验。
F检验要求输入数据服从正态分布,互信息量用于检查特征与标签之间不确定性的大小,即信息量的大小。
从代码的角度来看,卡方检验、F检验、互信息量检验的过滤过程是相似的。
从目的来看,卡方检验、F检验、互信息量检验也是一致的,过滤掉与标签无关的特征。
从算法实现来看,卡方检验、F检验、互信息量自身的算法是不同的。
- # F检验的库
- from sklearn.feature_selection import f_classif
-
- # 获取过F滤后的关键数值
- Fvalue, pvalues_f = f_classif(X_fsvar,y)
- print("Fvalue.shape", Fvalue.shape)
- print("pvalues_f.shape", pvalues_f.shape)
-
- # 获取过F滤后的特征数
- pvalue_filter = 0
- k_num = F.shape[0] - (pvalues_f > pvalue_filter).sum()
- print("F过滤后的特征数:", k_num )
-
- # 过滤满足条件的特征:
- # f_classif:过滤规则
- # k:过滤后的特征数量
- X_fsF = SelectKBest(f_classif, k=k_num).fit_transform(X_fsvar, y)
-
- # 使用随机森林 + 交叉验证,来验证过滤后的样本的效果
- cross_val_score(RFC(n_estimators=10,random_state=0), X_fsF,y,cv=5).mean()
Fvalue.shape (392,)
pvalues_f.shape (392,)
F过滤后的特征数: 388
Out[82]:
0.9378333333333334
- # F检验的库
- from sklearn.feature_selection import f_classif
-
- # 获取过F滤后的关键数值
- Fvalue, pvalues_f = f_classif(X_fsvar,y)
- print("Fvalue.shape", Fvalue.shape)
- print("pvalues_f.shape", pvalues_f.shape)
-
- # 获取过F滤后的特征数
- pvalue_filter = 0.01
- k_num = F.shape[0] - (pvalues_f > pvalue_filter).sum()
- print("F过滤后的特征数:", k_num)
-
- # 过滤满足条件的特征:
- # f_classif:过滤规则
- # k:过滤后的特征数量
- X_fsF = SelectKBest(f_classif, k=k_num).fit_transform(X_fsvar, y)
-
- # 使用随机森林 + 交叉验证,来验证过滤后的样本的效果
- cross_val_score(RFC(n_estimators=10,random_state=0), X_fsF,y,cv=5).mean()
Fvalue.shape (392,) pvalues_f.shape (392,) F过滤后的特征数: 392
Out[85]:
0.9390476190476191
备注:
此案例说明了,在本案例中,经过方差variance过滤后的特征与输出标签之间是强相关的,与卡方验证得到的结论是一样的。
p=0.01的门限,二级过滤出来特征数量与一级方差过滤的数量是相同的。
- # 互斥信息量库
- from sklearn.feature_selection import mutual_info_classif as MIC
-
- # 检验(计算)样本每个样本的特征自变量与标签因变量之间的相关性
- result = MIC(X_fsvar, y)
- print(result.shape)
-
- # 选出过滤后的特征的数量
- print("互信息量为0的特征的个数:", sum(result <= 0))
- k_num = result.shape[0] - sum(result <= 0)
- print("过滤后的特征的数量:", k_num)
-
- # 挑选出特征过滤后的样本
- X_fsmic = SelectKBest(MIC, k=k_num).fit_transform(X_fsvar, y)
- print("特征过滤乎的样本形状",X_fsmic.shape)
-
- # 使用样本交叉验证 + 随机森林诉法
- score=cross_val_score(RFC(n_estimators=10, random_state=0),X_fsmic,y,cv=5).mean()
- print("特征过滤后的分数", score)
备注:
此案例中,互信息为0的特征的个数为0,这说明,所有的特征值与标签值之间都是相关的。
这与F检验和卡方检验的结果是一致的。
作者主页(文火冰糖的硅基工坊):文火冰糖(王文兵)的博客_文火冰糖的硅基工坊_CSDN博客
本文网址:https://blog.csdn.net/HiWangWenBing/article/details/124080785
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。