前言
本文对sklearn中特征选择模块中的常用方法进行介绍和使用说明,主要介绍工具中的内容,即该库中的相关方法包含的常用接口和基本使用,了解原理可以关注以下两篇文章:
sklearn中的特征选择
sklearn.feature_selection
:sklearn中的特征选择模块
本文主要涉及的方法:
- 过滤法:特征选择完全独立于任何机器学习算法;根据各种统计检验中的分数或相关性的各项指标来选择特征。
- 方差过滤:
sklearn.feature_selection.VarianceThreshold
- 卡方检验:
sklearn.feature_selection.chi2
- F检验:
sklearn.feature_selection.f_classif(f_regression)
- 互信息法:
sklearn.feature_selection.mutual_info_classif(mutual_info_regression)
- 选择前 k 个最优值:
sklearn.feature_selection.SelectKBest
- 方差过滤:
- 嵌入法:特征选择和模型训练同时进行,通过使用相关机器学习模型对数据的拟合来计算各个特征的重要性,利用重要性对特征进行筛选。
- 模型自己决定使用哪些特征:
sklearn.feature.SelectFromModel
- 模型自己决定使用哪些特征:
- 包装法:特征选择和算法训练同时进行,相对过滤法和嵌入法拥有更高的计算成本,使用特征子集进行多次迭代训练。
- 递归特征消除法:
sklearn.feature.RFE
- 递归特征消除法:
本文对sklearn中的相关方法仅介绍常用接口、属性以及相关参数。
过滤法
在很多场景下,互信息法的表现要优于卡方检验和F检验,我们一般先使用方差过滤对特征进行初步筛选,然后使用互信息法进一步进行过滤。
- 视不同情况使用不同方法,互信息法不一定就是最好的,要多尝试
方差过滤
方差过滤:顾名思义就是依据特征本身的方差来进行筛选过滤,只能处理连续型数值变量;对于数据集中的所有特征,首先计算所有特征数据对应的方差,然后自定义设置一个阈值,丢弃方差小于等于该阈值的特征,保留方差大于该阈值的特征。
sklearn中的方差过滤:sklearn.feature_selection.VarianceThreshold
threshold
:设置方差过滤的阈值,默认为0
常用属性或接口:
import pandas as pd
import numpy as np
from sklearn.feature_selection import VarianceThreshold
data = pd.DataFrame(np.random.randint(10, 100, (5, 2))) # 准备测试数据
# 常用接口
var_thre = VarianceThreshold(threshold=0)
var_thre.fit(data) # 拟合数据
result = var_thre.transform(data) # 变换数据
result = var_thre.fit_transform(data) # 拟合和变换一步达成
data = var_thre.inverse_transform(result) # 逆向变换 (将数据转为过滤之前的原始数据)
# 一般这样用
result = VarianceThreshold(threshold=0).fit_transform(data)
我们一般会先将阈值设置为0,也就是过滤掉所有方差为0的特征,用方差过滤对特征做最初部的选择,然后自行判断阈值设置,一般会先计算所有特征的方差并对其从大到小排序,选择其中的某些值作为超参数(阈值)以指定保留的特征数量;若条件允许,也可