news 2026/6/9 18:41:39

【DAY23】常见的特征筛选算法

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
【DAY23】常见的特征筛选算法

@浙大疏锦行

  1. 方差筛选是最基础的过滤法:计算特征的方差,剔除方差极低的特征(这类特征数值变化小,对样本区分度弱)。优点是计算极快,缺点是只看特征自身,不考虑和目标的关联。

  2. 皮尔逊相关系数筛选属于过滤法:计算特征与目标变量的皮尔逊相关系数(衡量线性相关程度),保留相关系数绝对值高的特征。优点是直观易懂,缺点仅能捕捉线性关联,对非线性关系无效。

  3. Lasso 筛选属于嵌入法:在线性模型(如线性回归、逻辑回归)中加入 L1 正则化,迫使不重要的特征系数收缩至 0,最终保留系数非 0 的特征。既能完成特征筛选,也能同步训练模型,适合高维数据。

  4. 树模型重要性属于嵌入法:基于决策树 / 随机森林 / XGBoost 等树模型,通过 “特征对节点分裂的贡献度” 计算重要性,保留重要性高的特征。优点是能捕捉非线性关联,缺点是易受高基数特征干扰。

  5. SHAP 重要性是树模型重要性的进阶版:基于 SHAP 值(解释模型预测的统一框架)计算特征重要性,不仅能体现特征的整体影响程度,还能展示特征对预测结果的正负方向,解释性更强。

  6. 递归特征消除(RFE)属于包裹法:反复训练指定模型,每次移除模型判定的 “最不重要特征”,直到保留预设数量的特征。优点是直接以模型性能为筛选依据,精度较高;缺点是计算成本高(需多次训练模型)

    作业:对心脏病数据集完成特征筛选,并对比精度。

    import pandas as pd import numpy as np import matplotlib.pyplot as plt import seaborn as sns from sklearn.model_selection import train_test_split from sklearn.preprocessing import StandardScaler from sklearn.linear_model import LogisticRegression from sklearn.ensemble import RandomForestClassifier from sklearn.feature_selection import VarianceThreshold, RFE from sklearn.metrics import accuracy_score, classification_report import shap import xgboost as xgb # ---------------------- 1. 加载数据与预处理 ---------------------- # 加载数据集 df = pd.read_csv('E:/PythonStudy/data.csv') # 分离特征与目标变量 X = df.drop('target', axis=1) y = df['target'] # 填充缺失值 X = X.fillna(X.mean()) # ---------------------- 2. 数据探索可视化 ---------------------- def data_explore(df): """数据分布与特征相关性可视化""" # 目标变量分布饼图 target_count = df["target"].value_counts().reset_index() target_count["target"] = target_count["target"].map(lambda x: "患病" if x == 1 else "正常") target_count["占比"] = target_count["count"] / target_count["count"].sum() * 100 plt.figure(figsize=(6, 6)) wedges, texts = plt.pie( target_count["count"], wedgeprops={"width": 0.4, "edgecolor": "#000"}, labels=target_count["target"], autopct="%1.1f%%" ) plt.title("样本患病情况分布", fontsize=15, pad=20) plt.show() # 特征与目标变量的相关性热力图 corr = df.corr() plt.figure(figsize=(12, 8)) sns.heatmap( corr, annot=True, cmap="RdBu_r", vmin=-1, vmax=1, annot_kws={"fontsize": 10} ) plt.title("特征-目标相关性热力图", fontsize=15) plt.show() # 执行数据探索 data_explore(df) # ---------------------- 3. 数据集划分与标准化 ---------------------- X_train, X_test, y_train, y_test = train_test_split( X, y, test_size=0.2, random_state=42, stratify=y ) scaler = StandardScaler() X_train_scaled = pd.DataFrame(scaler.fit_transform(X_train), columns=X.columns) X_test_scaled = pd.DataFrame(scaler.transform(X_test), columns=X.columns) # ---------------------- 4. 特征筛选方法定义 ---------------------- def select_by_variance(X_train, X_test, threshold=0.1): """方差筛选:移除低方差特征""" vt = VarianceThreshold(threshold) X_train_sel = vt.fit_transform(X_train) X_test_sel = vt.transform(X_test) cols = X_train.columns[vt.get_support()] return pd.DataFrame(X_train_sel, columns=cols), pd.DataFrame(X_test_sel, columns=cols) def select_by_pearson(X_train, y_train, X_test, top_n=5): """皮尔逊相关系数筛选:保留与目标相关性topN的特征""" corr = [abs(X_train[col].corr(y_train)) for col in X_train.columns] top_cols = X_train.columns[np.argsort(corr)[-top_n:]] return X_train[top_cols], X_test[top_cols] def select_by_lasso(X_train_scaled, y_train, X_test_scaled): """Lasso筛选:保留系数非0的特征""" lasso = LogisticRegression(penalty='l1', solver='liblinear', C=0.1, random_state=42) lasso.fit(X_train_scaled, y_train) top_cols = X_train_scaled.columns[lasso.coef_[0] != 0] return X_train_scaled[top_cols], X_test_scaled[top_cols] def select_by_tree_importance(X_train, y_train, X_test, top_n=5): """树模型重要性筛选:保留随机森林重要性topN的特征""" rf = RandomForestClassifier(random_state=42) rf.fit(X_train, y_train) top_cols = X_train.columns[np.argsort(rf.feature_importances_)[-top_n:]] return X_train[top_cols], X_test[top_cols] def select_by_shap(X_train, y_train, X_test, top_n=5): """SHAP重要性筛选:保留SHAP值topN的特征""" rf = RandomForestClassifier(random_state=42) rf.fit(X_train, y_train) explainer = shap.TreeExplainer(rf) shap_values = explainer.shap_values(X_train) shap_importance = np.mean(np.abs(shap_values[1]), axis=0) top_cols = X_train.columns[np.argsort(shap_importance)[-top_n:]] return X_train[top_cols], X_test[top_cols] def select_by_rfe(X_train, y_train, X_test, n_features=5): """递归特征消除:保留指定数量的特征""" lr = LogisticRegression(max_iter=1000, random_state=42) rfe = RFE(estimator=lr, n_features_to_select=n_features) rfe.fit(X_train, y_train) top_cols = X_train.columns[rfe.get_support()] return X_train[top_cols], X_test[top_cols] # ---------------------- 5. 模型评估与结果记录 ---------------------- # 待对比的模型 models = { "逻辑回归": LogisticRegression(max_iter=1000, random_state=42), "XGBoost": xgb.XGBClassifier(n_estimators=100, random_state=42) } # 待对比的特征筛选方法 methods = { "方差筛选": select_by_variance, "皮尔逊相关": select_by_pearson, "Lasso": select_by_lasso, "树模型重要性": select_by_tree_importance, "SHAP重要性": select_by_shap, "RFE": select_by_rfe } # 存储所有评估结果 all_results = {} # 遍历筛选方法与模型,计算指标 for method_name, method_func in methods.items(): # 执行特征筛选 if method_name == "Lasso": X_train_sel, X_test_sel = method_func(X_train_scaled, y_train, X_test_scaled) else: X_train_sel, X_test_sel = method_func(X_train, y_train, X_test) # 评估不同模型 method_res = {} for model_name, model in models.items(): model.fit(X_train_sel, y_train) y_pred = model.predict(X_test_sel) # 计算准确率与F1值 acc = accuracy_score(y_test, y_pred) f1 = classification_report(y_test, y_pred, output_dict=True)["weighted avg"]["f1-score"] method_res[model_name] = {"准确率": round(acc, 4), "F1值": round(f1, 4)} print(f"{method_name}-{model_name}:准确率={acc:.4f},F1={f1:.4f}") all_results[method_name] = method_res print("-" * 60) # ---------------------- 6. 结果可视化 ---------------------- def plot_accuracy_compare(all_results): """绘制各筛选方法下的模型准确率对比图""" plt.figure(figsize=(12, 6)) x = np.arange(len(all_results)) width = 0.35 # 提取不同模型的准确率 lr_acc = [all_results[method]["逻辑回归"]["准确率"] for method in all_results] xgb_acc = [all_results[method]["XGBoost"]["准确率"] for method in all_results] # 绘制柱状图 plt.bar(x - width/2, lr_acc, width, label="逻辑回归", color="#1f77b4") plt.bar(x + width/2, xgb_acc, width, label="XGBoost", color="#ff7f0e") # 图表配置 plt.xticks(x, all_results.keys(), rotation=45) plt.ylabel("准确率", fontsize=12) plt.title("不同特征筛选方法的模型准确率对比", fontsize=15) plt.legend() plt.tight_layout() plt.show() # 生成可视化结果 plot_accuracy_compare(all_results)
版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/6/8 8:17:21

Prometheus监控系统:从零开始构建企业级监控解决方案

Prometheus监控系统:从零开始构建企业级监控解决方案 【免费下载链接】prometheus-handbook Prometheus 中文文档 项目地址: https://gitcode.com/gh_mirrors/pr/prometheus-handbook 在当今云原生时代,监控已成为保障系统稳定性的关键环节。Prom…

作者头像 李华
网站建设 2026/6/7 20:14:10

超实用JSON对比工具:让数据差异一目了然的专业指南

超实用JSON对比工具:让数据差异一目了然的专业指南 【免费下载链接】online-json-diff 项目地址: https://gitcode.com/gh_mirrors/on/online-json-diff 在现代软件开发中,JSON对比工具已经成为开发者的必备神器。这款在线JSON差异分析工具无需安…

作者头像 李华
网站建设 2026/6/9 18:37:24

昇腾NPU实战:Z-Image-Turbo-Fun-Controlnet-Union模型部署与测试全记录

一、前言 当谈及AI图像生成,ControlNet技术的引入彻底改变了游戏规则。它让生成过程从“抽卡”式的随机创作,转变为可按用户提供的“草图”或“骨架”精确绘制的可控艺术。 今天我们要测试的主角——Z-Image-Turbo-Fun-Controlnet-Union,正…

作者头像 李华
网站建设 2026/6/9 18:41:20

Hourglass:Windows平台终极时间管理神器使用全攻略

Hourglass:Windows平台终极时间管理神器使用全攻略 【免费下载链接】hourglass The simple countdown timer for Windows. 项目地址: https://gitcode.com/gh_mirrors/ho/hourglass 你是否经常因为忘记时间而手忙脚乱?在会议中突然发现超时&#…

作者头像 李华
网站建设 2026/6/5 14:45:17

vivado hls随便小记

1.ap_rst复位&#xff0c;高电平复位 2.ap_start可以一直拉高 3.ap_done每调用一次顶层函数产生一次ap_done拉高 4.hls::stream<ap_uint<32> > a&#xff1b;知道为什么这个地方两个括号要空格么&#xff0c;因为不加空格>>这个容易被编译器 认为是移位或者流…

作者头像 李华
网站建设 2026/6/9 18:38:25

Wan2.2-T2V-A14B模型的语义理解边界在哪里?极限测试

Wan2.2-T2V-A14B模型的语义理解边界在哪里&#xff1f;极限测试 在影视制作、广告创意和虚拟内容生成领域&#xff0c;一个长期存在的痛点是&#xff1a;如何快速将一段文字脚本转化为视觉上连贯、逻辑上合理的动态画面&#xff1f; 过去这依赖导演、分镜师与后期团队数日甚至数…

作者头像 李华