news 2026/2/28 20:23:44

【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/2/27 19:53:00

音频解密终极指南:快速解锁QQ音乐加密文件

音频解密终极指南:快速解锁QQ音乐加密文件 【免费下载链接】qmcdump 一个简单的QQ音乐解码(qmcflac/qmc0/qmc3 转 flac/mp3),仅为个人学习参考用。 项目地址: https://gitcode.com/gh_mirrors/qm/qmcdump 你是否曾经下载了…

作者头像 李华
网站建设 2026/2/24 10:14:28

Wan2.2-T2V-A14B能否取代传统剪辑?深度剖析其商业潜力

Wan2.2-T2V-A14B能否取代传统剪辑?深度剖析其商业潜力 在短视频日活破十亿、内容即流量的今天,品牌方常常面临一个尴尬局面:市场部凌晨三点敲定创意方向,却要等拍摄团队一周后才能看到成片。这种“创意热启动,执行冷延…

作者头像 李华
网站建设 2026/2/21 9:53:22

如何快速掌握Source Sans 3字体:打造专业UI设计的5个实战技巧

如何快速掌握Source Sans 3字体:打造专业UI设计的5个实战技巧 【免费下载链接】source-sans Sans serif font family for user interface environments 项目地址: https://gitcode.com/gh_mirrors/so/source-sans Source Sans 3是Adobe推出的开源无衬线字体家…

作者头像 李华
网站建设 2026/2/27 18:59:49

Wan2.2-T2V-A14B如何生成符合品牌VI规范的标准化视频?

如何用 Wan2.2-T2V-A14B 生成符合品牌 VI 规范的标准化视频? 在数字营销节奏日益加快的今天,品牌对内容生产的效率和一致性提出了前所未有的高要求。一条广告片从创意构思到上线发布,传统流程动辄需要数天甚至数周——而消费者注意力的窗口期…

作者头像 李华
网站建设 2026/2/20 15:17:05

浙江头部城商行:每日 700 万查询、秒级响应,Apache Doris 查算分离架构破局资源冲突

在当前银行业务全面线上化、实时化的驱动下,浙江省头部城商行亟需构建一个能够同时承载海量数据加工与高并发实时查询的数据平台,以支撑精准营销、实时风控和智能决策等关键业务。 在这一数字化转型进程中,我们最终引入了 Apache Doris 作为…

作者头像 李华
网站建设 2026/2/16 13:35:52

46、Linux系统技术指南:从加密到网络基础

Linux系统技术指南:从加密到网络基础 1. 密钥导出与文件加密 在Linux系统中,密钥的管理和文件加密是保障数据安全的重要环节。 1.1 公钥和私钥的导出 导出私钥可以在系统出现问题时进行备份。若要将所有密钥备份到一个文件中,可使用以下命令: $ gpg --export -o gpg_…

作者头像 李华