Day 17 : 用於生产的机械学习 - 特徵选择 Feature Selection

特徵选择是机器学习中的核心概念之一,不相关或部分相关的特徵会对模型性能产生负面影响,也会有效能的问题,适当的挑选与目标变量最相关的特徵集,有助降低模型的复杂性,并最大限度地减少训练和推理所需的资源。这在您可能处理 TB 级数据或服务数百万个请求的生产模型中具有更大的影响,这篇将实作出5个不同的特徵选择,可从中取其优。

  • Colab 实作范例

特徵选择方法

  • 非监督式学习
    • 可以采取移除关联较低的特徵策略,减少无关的特徵。
  • 监督式学习
    • 关联度高的特徵通常有重叠性,可以找出与之关联性高的其他特徵,保留部分特徵并移除原先观察之特徵。

监督式学习适用的特徵选择

  • 过滤方法 Filter Method
    • 关联分析 Correlation。
    • 单变量特徵选取 Univariate feature selection
  • 包装方法 Wrapper Method
    • 前向消除 Forward elimination
    • 後向消除 Backward elimination
    • 递回特徵消除 Recursive feature elimination (RFE)
  • 嵌入方法 Embedded Method
    • 重要特徵 Feature importance
    • L1正规化 L1 regularization

特徵选择示范,铁达尼存活资料集为例

0. 前置处理

  • 整理特徵 X ,部分属於分类资料可以用 One-Hot Encoding编码,并且处理无效栏位。

  • 定义评估模型,固定以 RandomForestClassifier 模型进行训练,并对照各测试资料集之绩效。

    def use_RandomForestClassifier_evaluation_metrics_on_test_set(X,Y):
        X_train, X_test, Y_train, Y_test = train_test_split(
            X, Y, test_size = 0.2 ,stratify=Y, random_state = 9527)
    
        # 标准化
        scaler = StandardScaler().fit(X_train)
        X_train_scaled = scaler.transform(X_train)
        X_test_scaled = scaler.transform(X_test)
    
        # RandomForestClassifier训练模型
        model = RandomForestClassifier(criterion='entropy', random_state=9527)
        model.fit(X_train_scaled, Y_train)
    
        # 预测
        y_predict_result = model.predict(X_test_scaled)
    
        # 回传evaluation_metrics_on_test_set
        return {
            'accuracy' : accuracy_score(Y_test, y_predict_result),
            'roc' : roc_auc_score(Y_test, y_predict_result),
            'precision' : precision_score(Y_test, y_predict_result),
            'recall' : recall_score(Y_test, y_predict_result),
            'f1' : f1_score(Y_test, y_predict_result),
            'Feature Count' : len(X.columns)
        }
    

  • 查看关联性,越浅代表高度正相关,越深代表高度负相关,关联性介於 [1,-1] 之间。

1. 特徵选择 - 过滤方法 Filter Method

  • 1.1 依关联性移除特徵

    • 选择具有与其他特徵高度相关的某特徵 ,设定阈值选取符合特徵,并移除该特徵。本次实作挑选的是 FamilySize ,选择超过门槛值的有代表性的特徵(无论正负相关 >0.2 ),并移除 FamilySize 本身。

      # 取得具有与其他部分特徵高度相关的某特徵绝对值
      cor_target = abs(cor["FamilySize"])
      
      # 选择高度相关的特徵(阈值 = 0.2)
      relevant_features = cor_target[cor_target>0.2]
      
      # 选择特徵名称
      names = [index for index, value in relevant_features.iteritems()]
      
      # 删除目标特徵
      names.remove('FamilySize')
      
      print(names)
      


      • 对比未筛选的成绩,特徵减少至9个,多数指标分数下降,recall维持不变。
  • 1.2 单变量特徵选取 Univariate Selection

    • sklearn.feature_selection.SelectKBest 选择最具影响力的特徵,这边示范 选取 10 个特徵。

2. 特徵选择 - 包装方法 Wrapper Method

  • 2.1 递回特徵消除 Recursive feature elimination (RFE)
    • sklearn.feature_selection.RFE 筛选,设定筛选出 k=10 个重要特徵,该设定也是超参数,您可以自行设定。
      # Recursive Feature Elimination
      def rfe_selection( X , Y, k=10):
      
          # Split train and test sets
          X_train, X_test, Y_train, Y_test = train_test_split(
              X, 
              Y, 
              test_size = 0.2, 
              stratify=Y, 
              random_state = 9527)
      
          scaler = StandardScaler().fit(X_train)
          X_train_scaled = scaler.transform(X_train)
          X_test_scaled = scaler.transform(X_test)
      
          model = RandomForestClassifier(
              criterion='entropy', 
              random_state=9527
              )
          rfe = RFE(model, k)
          rfe = rfe.fit(X_train_scaled, Y_train)
      
          feature_names = X.columns[rfe.get_support()]
      
          return feature_names
      

3. 特徵选择 - 重要特徵 Feature importance

  • 依重要性门槛值筛选特徵
    • 示范以 sklearn.feature_selection.SelectFromModel 选择,以 threshold=0.013 作为筛选。

最终特徵选择比较

  • 经过一系列的特徵选择,您可以视需求选择所要采取的特徵,您追求准确率的话「递回特徵消除 Recursive feature elimination (RFE) 」分数最高,原本特徵从16个减少为10个,成功减少 37.5% ,运算资源可以大幅减少,而且各项指标成绩都优於全数选取的结果。

  • 您会发现过程中有许多超参数是可以自行调整的,在您的手上或许仍有优化空间,譬如将RFE的特徵改 k=9 试试看,性能与成绩还可以再提升。

小结

  • 特徵选择相当有用,当在持续需要学习的情境,微小的节省资源手段都能带来庞大的成本效益,您已经学会如何帮老板、帮您自己省时、省钱了!
  • 收藏起来以後用自己的资料集试试吧,希望能帮助到您。

参考


<<:  Day 03. 以 Zabbix 架构为主轴出发

>>:  Day02 - App草图

Day 8:506. Relative Ranks

今日题目 题目连结:506. Relative Ranks 题目主题:Array, Sorting,...

[DAY 06] 盐水爱河 春天小栈

盐水爱河 春天小栈 地点:盐水区西门路7-1号 时间:11:00~22:00 还记得当时会找到这一家...

Django 基础篇

django 基础篇 基本工具 env虚拟机 - virtualenvwrapper-win 安装:...

[Python 爬虫这样学,一定是大拇指拉!] DAY01 - 系列文前言

前言 在「大数据」红透透的时代,相信大家都听过 Python、爬虫。网路上亦有着大量的范例及 Sol...

Day 26:Container != Docker Container

虽然有点突然,但是我今天想来谈谈 container。对於大部分的人来说,讲到 container ...