当前位置:   article > 正文

[机器学习与scikit-learn-50]:特征工程-特征选择(降维)-5-二级过滤-特征值与标签之间的关系:F过滤与互信息量法过滤_k = f.shape[0] - (pvalues_f > 0.15)

k = f.shape[0] - (pvalues_f > 0.15)

作者主页(文火冰糖的硅基工坊):文火冰糖(王文兵)的博客_文火冰糖的硅基工坊_CSDN博客

本文网址:https://blog.csdn.net/HiWangWenBing/article/details/124080785


目录

前言:

第1章 F检验代码示例

1.1 过滤条件为0

2.2 过滤条件为0.01

第2章 互信息量代码示例


前言:

卡方检验能够筛选算特征变量与标签变量之间的相关性,卡方过滤用于过滤掉那些与标签标签无关的特征变量。除了卡方检验,类似的还有F检验和互信息量检验。

F检验要求输入数据服从正态分布,互信息量用于检查特征与标签之间不确定性的大小,即信息量的大小。

从代码的角度来看,卡方检验、F检验、互信息量检验的过滤过程是相似的。

从目的来看,卡方检验、F检验、互信息量检验也是一致的,过滤掉与标签无关的特征。

从算法实现来看,卡方检验、F检验、互信息量自身的算法是不同的。

第1章 F检验代码示例

1.1 过滤条件为0

  1. # F检验的库
  2. from sklearn.feature_selection import f_classif
  3. # 获取过F滤后的关键数值
  4. Fvalue, pvalues_f = f_classif(X_fsvar,y)
  5. print("Fvalue.shape", Fvalue.shape)
  6. print("pvalues_f.shape", pvalues_f.shape)
  7. # 获取过F滤后的特征数
  8. pvalue_filter = 0
  9. k_num = F.shape[0] - (pvalues_f > pvalue_filter).sum()
  10. print("F过滤后的特征数:", k_num )
  11. # 过滤满足条件的特征:
  12. # f_classif:过滤规则
  13. # k:过滤后的特征数量
  14. X_fsF = SelectKBest(f_classif, k=k_num).fit_transform(X_fsvar, y)
  15. # 使用随机森林 + 交叉验证,来验证过滤后的样本的效果
  16. 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

2.2 过滤条件为0.01

  1. # F检验的库
  2. from sklearn.feature_selection import f_classif
  3. # 获取过F滤后的关键数值
  4. Fvalue, pvalues_f = f_classif(X_fsvar,y)
  5. print("Fvalue.shape", Fvalue.shape)
  6. print("pvalues_f.shape", pvalues_f.shape)
  7. # 获取过F滤后的特征数
  8. pvalue_filter = 0.01
  9. k_num = F.shape[0] - (pvalues_f > pvalue_filter).sum()
  10. print("F过滤后的特征数:", k_num)
  11. # 过滤满足条件的特征:
  12. # f_classif:过滤规则
  13. # k:过滤后的特征数量
  14. X_fsF = SelectKBest(f_classif, k=k_num).fit_transform(X_fsvar, y)
  15. # 使用随机森林 + 交叉验证,来验证过滤后的样本的效果
  16. 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的门限,二级过滤出来特征数量与一级方差过滤的数量是相同的。

第2章 互信息量代码示例

  1. # 互斥信息量库
  2. from sklearn.feature_selection import mutual_info_classif as MIC
  3. # 检验(计算)样本每个样本的特征自变量与标签因变量之间的相关性
  4. result = MIC(X_fsvar, y)
  5. print(result.shape)
  6. # 选出过滤后的特征的数量
  7. print("互信息量为0的特征的个数:", sum(result <= 0))
  8. k_num = result.shape[0] - sum(result <= 0)
  9. print("过滤后的特征的数量:", k_num)
  10. # 挑选出特征过滤后的样本
  11. X_fsmic = SelectKBest(MIC, k=k_num).fit_transform(X_fsvar, y)
  12. print("特征过滤乎的样本形状",X_fsmic.shape)
  13. # 使用样本交叉验证 + 随机森林诉法
  14. score=cross_val_score(RFC(n_estimators=10, random_state=0),X_fsmic,y,cv=5).mean()
  15. print("特征过滤后的分数", score)

备注:

此案例中,互信息为0的特征的个数为0,这说明,所有的特征值与标签值之间都是相关的。

这与F检验和卡方检验的结果是一致的。


作者主页(文火冰糖的硅基工坊):文火冰糖(王文兵)的博客_文火冰糖的硅基工坊_CSDN博客

本文网址:https://blog.csdn.net/HiWangWenBing/article/details/124080785

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/2023面试高手/article/detail/144953
推荐阅读
相关标签
  

闽ICP备14008679号