paper2skills Playbook

Feature Selection(特征选择)

Skill-Feature-Selection · 12-ML基础

causalexperimentforecastingoptimizationdata_collection广告与投放客服与VOC数据采集与治理MAS与智能体工程WF-B 广告优化WF-C 客服分诊WF-D 选品扫描WF-H 复购增长
年化 ROI30-60 万元
实现难度⭐⭐⭐⭐☆
业务视角
适用角色数据分析师 / 数据工程师 · 运营负责人 · 产品经理
适用平台选品评分 · 差评预测 · 用户流失预警 · 广告出价预测
什么情况下用想用机器学习解决业务问题,但不知道该选什么模型;模型上线后效果越来越差不知道为什么
成功是什么样的选对算法工具减少 50% 试错时间,模型上线后可监控可解释,数据团队和业务团队建立共同语言
业务痛点
不知道该用什么模型模型准确率不稳定业务不相信模型结果模型黑盒说不清为什么这么预测

1. 解决的问题

我们从多个数据源(CRM、广告平台、网站分析、客服系统)汇总了 200+ 特征

2. 核心算法逻辑

少即是多——从大量特征中筛选出真正有用的子集,提升模型性能、降低过拟合风险、减少训练/推理成本、增强可解释性。

3. 业务应用场景

业务问题:我们从多个数据源(CRM、广告平台、网站分析、客服系统)汇总了 200+ 特征。但很多冗余特征不仅没用,还拖慢训练速度和增加过拟合。需要筛选出真正影响流失的 top-20 特征。

数据要求:100K 用户 × 200 特征。先用 SHAP 做全局重要性排序,再用 RFE 验证

预期产出:SHAP 识别出 top-20 特征贡献了 90% 的预测力。精简后模型:训练速度快 3x,AUC 仅下降 0.005

4. 输入数据要求

请查看原始代码模板获取输入规格。

5. 输出结果

请查看原始代码模板获取输出规格。

6. 业务价值 / ROI

  • ROI 预估:特征精简可降低训练成本 60%+、推理成本 70%+、数据采集成本 50%+。月省 $5,000-10,000;同时更好的特征集提升模型 AUC 1-3pp。年化贡献 30-60 万元
  • 实施难度:⭐⭐⭐⭐☆(4 星)— 需要理解不同方法的适用场景和局限性
  • 优先级评分:⭐⭐⭐☆☆(3 星)— 模型已经有 200 特征时才紧迫,50 特征以下收益有限
  • 评估依据:特征工程是图谱 #1 被依赖节点,特征选择是其下游最自然的延伸

7. 代码模板

代码块数量:1 · 路径:paper2skills-code/ml_fundamentals/feature_selection

"""
Feature Selection Toolkit
特征选择工具集 — Filter / Wrapper / Embedded / SHAP
"""

import numpy as np
import pandas as pd
from sklearn.ensemble import RandomForestClassifier
from sklearn.feature_selection import (
    mutual_info_classif, RFE, RFECV, SelectKBest, SelectFromModel
)
from sklearn.linear_model import LassoCV
from xgboost import XGBClassifier
from typing import List, Dict, Tuple


def filter_features(
    X: pd.DataFrame, y: np.ndarray, 
    k: int = 20, method: str = 'mutual_info'
) -> Tuple[List[str], pd.DataFrame]:
    """
    过滤法特征选择
    
    Returns:
        (selected_columns, importance_scores)
    """
    if method == 'mutual_info':
        scores = mutual_info_classif(X, y, random_state=42)
    elif method == 'variance':
        scores = X.var().values
    else:
        raise ValueError(f"Unknown method: {method}")
    
    importance = pd.DataFrame({
        'feature': X.columns, 'score': scores
    }).sort_values('score', ascending=False)
    
    selected = importance.head(k)['feature'].tolist()
    return selected, importance


def rfe_feature_selection(
    X: np.ndarray, y: np.ndarray,
    estimator=None, n_features: int = 20, cv: bool = True
) -> List[int]:
    """
    RFE (Recursive Feature Elimination) 特征选择
    """
    estimator = estimator or RandomForestClassifier(n_estimators=50, random_state=42)
    
    if cv:
        selector = RFECV(estimator, min_features_to_select=n_features, 
                         cv=3, scoring='roc_auc')
    else:
        selector = RFE(estimator, n_features_to_select=n_features)
    
    selector.fit(X, y)
    return list(np.where(selector.support_)[0])

8. 论文来源

未自动抽取;请查看原始 Skill 卡片。