[机器学习与scikit-learn-50]:特征工程-特征选择(降维)-5-二级过滤-特征值与标签之间的关系:F过滤与互信息量法过滤
Posted 文火冰糖的硅基工坊
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了[机器学习与scikit-learn-50]:特征工程-特征选择(降维)-5-二级过滤-特征值与标签之间的关系:F过滤与互信息量法过滤相关的知识,希望对你有一定的参考价值。
作者主页(文火冰糖的硅基工坊):文火冰糖(王文兵)的博客_文火冰糖的硅基工坊_CSDN博客
本文网址:https://blog.csdn.net/HiWangWenBing/article/details/124080785
目录
前言:
卡方检验能够筛选算特征变量与标签变量之间的相关性,卡方过滤用于过滤掉那些与标签标签无关的特征变量。除了卡方检验,类似的还有F检验和互信息量检验。
F检验要求输入数据服从正态分布,互信息量用于检查特征与标签之间不确定性的大小,即信息量的大小。
从代码的角度来看,卡方检验、F检验、互信息量检验的过滤过程是相似的。
从目的来看,卡方检验、F检验、互信息量检验也是一致的,过滤掉与标签无关的特征。
从算法实现来看,卡方检验、F检验、互信息量自身的算法是不同的。
第1章 F检验代码示例
1.1 过滤条件为0
# 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
2.2 过滤条件为0.01
# 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的门限,二级过滤出来特征数量与一级方差过滤的数量是相同的。
第2章 互信息量代码示例
# 互斥信息量库
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
以上是关于[机器学习与scikit-learn-50]:特征工程-特征选择(降维)-5-二级过滤-特征值与标签之间的关系:F过滤与互信息量法过滤的主要内容,如果未能解决你的问题,请参考以下文章
如何使用机器学习模型(或其特征系数)来解释该特征是不是与特定类别相关?