机器学习sklearn:过滤

不是每个特征都有用,尽量挑出更有用的来节约计算资源

一、方差过滤

假设最开始数据是有很多个特征的数据集

使用方差过滤

python 复制代码
from sklearn.feature_selection import VarianceThreshold
selector = VarianceThreshold()      # 不填写默认方差为0
X_var0 = selector.fit_transform(X)      # 删除方差为0的新矩阵

特征值在下降

可以用不同的策略进行过滤特征

python 复制代码
# 删除二分类特征中某一类占比≥80%或≤20%的列
x_bvar = VarianceThreshold(.8 * (1-.8)).fit_transform(X)
x_bvar.shape

这是时候可以过滤更多

方差的中位数来赛选

python 复制代码
import numpy as np
x_fsvar = VarianceThreshold(np.median(X.var().values)).fit_transform(X)

效果更加明显了

二、卡方过滤

python 复制代码
from sklearn.ensemble import RandomForestClassifier as RFC
from sklearn.model_selection import cross_val_score
from sklearn.feature_selection import SelectKBest
from sklearn.feature_selection import chi2
#假设在这里我一直我需要300个特征
X_fschi = SelectKBest(chi2, k=300).fit_transform(x_fsvar, y)    # 这个y是标签
X_fschi.shape

1、F检验找k值再卡方过滤

先获取k值,选取的是p值小于0.05的特征,因为这些特征与标签是强相关的

python 复制代码
from sklearn.feature_selection import f_classif
F, pvalues_f = f_classif(X_fsvar,y)
F
pvalues_f
k = F.shape[0] - (pvalues_f > 0.05).sum()

再放到卡方过滤

python 复制代码
X_fsF = SelectKBest(f_classif, k=填写具体的k).fit_transform(X_fsvar, y)
cross_val_score(RFC(n_estimators=10,random_state=0),X_fsF,y,cv=5).mean()

2、互信息法找k值再卡方过滤

python 复制代码
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()

三、Embedded嵌入法

选出重要性 ≥0.005 的特征训练集

python 复制代码
from sklearn.feature_selection import SelectFromModel
from sklearn.ensemble import RandomForestClassifier as RFC
RFC_ = RFC(n_estimators =10,random_state=0)     # 随机森林的分类器
X_embedded = SelectFromModel(RFC_,threshold=0.005).fit_transform(X,y)       # 选出重要性 ≥0.005 的特征训练集
X_embedded.shape

重要性画出表格,再不断找最优秀

python 复制代码
import numpy as np
import matplotlib.pyplot as plt
RFC_.fit(X,y).feature_importances_
threshold = np.linspace(0,(RFC_.fit(X,y).feature_importances_).max(),20)
score = []
for i in threshold:
    X_embedded = SelectFromModel(RFC_,threshold=i).fit_transform(X,y)
    once = cross_val_score(RFC_,X_embedded,y,cv=5).mean()
    score.append(once)
plt.plot(threshold,score)
plt.show()

四、Wrapper包装法

RFE(递归特征消除)从原始训练集 X 中筛选出 340 个最重要的特征,生成新的训练集 X_wrapper

python 复制代码
from sklearn.feature_selection import RFE
RFC_ = RFC(n_estimators =10,random_state=0)     # 随机森林分类
selector = RFE(RFC_, n_features_to_select=340, step=50).fit(X, y)
selector.support_.sum()
selector.ranking_
X_wrapper = selector.transform(X)

调参找出最佳训练集数量

python 复制代码
for i in range(1,751,50):
    X_wrapper = RFE(RFC_,n_features_to_select=i, step=50).fit_transform(X,y)
    once = cross_val_score(RFC_,X_wrapper,y,cv=5).mean()
    score.append(once)
plt.figure(figsize=[20,5])
plt.plot(range(1,751,50),score)
plt.xticks(range(1,751,50))
plt.show()
相关推荐
聚客AI30 分钟前
🌟大模型为什么产生幻觉?预训练到推理的漏洞全揭秘
人工智能·llm·掘金·日新计划
Juchecar36 分钟前
一文讲清 nn.Sequential 等容器类
人工智能
阿里云云原生1 小时前
如何快速看懂「祖传项目」?Qoder 强势推出新利器
人工智能
美团技术团队1 小时前
LongCat-Flash:如何使用 SGLang 部署美团 Agentic 模型
人工智能·算法
程序员小袁3 小时前
基于C-MTEB/CMedQAv2-rerankingv的Qwen3-1.7b模型微调-demo
人工智能
飞哥数智坊4 小时前
AI 编程一年多,我终于明白:比技巧更重要的,是熟练度
人工智能·ai编程
新智元4 小时前
收手吧 GPT-5-Codex,外面全是 AI 编程智能体!
人工智能·openai
IT_陈寒4 小时前
Java 性能优化:5个被低估的JVM参数让你的应用吞吐量提升50%
前端·人工智能·后端
阿里云云原生5 小时前
阿里云基础设施 AI Tech Day AI 原生,智构未来——AI 原生架构与企业实践专场
人工智能
Memene摸鱼日报6 小时前
「Memene 摸鱼日报 2025.9.16」OpenAI 推出 GPT-5-Codex 编程模型,xAI 发布 Grok 4 Fast
人工智能·aigc