在本文中,我们将回顾特性选择技术并回答为什么它很重要以及如何使用python实现它。
本文还可以帮助你解答以下的面试问题:
- 什么是特征选择?
- 说出特性选择的一些好处
- 你知道哪些特征选择技巧?
- 区分单变量、双变量和多变量分析。
- 我们能用PCA来进行特征选择吗?
- 前向特征选择和后向特征选择的区别是什么?
什么是特征选择,为何重要
特性选择是选择与ML模型更加一致、非冗余和更相关的基本特性的过程。在ML项目中使用特性选择是必要的,因为:
- 它有助于减少数据集的大小和复杂性,并且可以使用更少的时间来训练模型及进行推理;
- 具有较少特征的简单机器学习模型更容易理解和解释;
- 它可以避免过度拟合。更多特征使模型变得更加复杂,并带来维度灾难(误差随着特征数量的增加而增加)。
特征选择方法有哪些?
有两种常见的方法可以处理特征选择:
1、前向特征选择。使用一个特征(或一小部分)拟合模型并不断添加特征,直到新加的模型对ML 模型指标没有影响。可以使用相关分析等方法(例如,基于 Pearson 系数),或者您可以从单个特征或特征子集开始拟合模型。
2、向后特征选择。这是 与1的相反方法。使用这种方法,可以从完整的特征集开始,然后迭代地逐个减少功能,减少特征的同时只要 ML 模型指标保持不变即可。
我们可以将一些流行的方法总结成以下几种分类:
- Filtered-based基于过滤的方法:这种方法是最直接的,这种特征的选择独立于任何机器学习算法。使用统计数据(例如 Pearson 相关系数、LDA 等),根据每个特征如何影响目标结果来选择重要特征。这是计算密集度最低且速度最快的方法。
- Wrapper 基于包装器方法:这种方法根据 ML 训练指标结果选择特征。每个子集在训练后得到一个分数,然后添加或删除特征,并在最终在达到所需的 ML 指标阈值时停止,这种方法可以是前向、后向或递归的。这是计算最密集的方法,因为需要训练许多 ML 模型,并且逐一进行判断选择。
- Embedded 基于嵌入的方法:这种方法更加复杂,它将上面两种方法组合在一起。这种方法最流行的例子是 LASSO 和树型算法。
使用Python进行特征选择
本文将使用一个金融科技数据集,该数据集包含过去贷款申请人的数据,如信用等级、申请人收入、DTI和其他特征。最后的目标是使用ML预测贷款申请人是否可能违约(无法支付贷款)。这有助于企业做出决策,例如拒绝贷款申请、减少贷款金额或以更高的利率向风险较高的申请人放贷。我用来运行代码的环境是Kaggle。
让我们开始并加载数据集:
%matplotlib inline
from matplotlib import pyplot as plt
pd.set_option('display.float_format', lambda x: '%.0f' % x)
loan = pd.read_csv('../input/lending-club/accepted_2007_to_2018Q4.csv.gz', compression='gzip', low_memory=True)
loan.info
数据集包含超过200万行(我们称之为样本)和超过150个特征。这是相当大的数据量,这些数据通常包含了很多“噪声”它对我们的ML工作没有任何的帮助,因此我们需要在ML训练发生之前验证数据的质量和适用性。
第一步:获得专业的领域知识
对如此详尽的特征列表进行分析可能需要大量的计算资源和时间。所以我们需要详细了解每个数据集的属性。
咨询并询问行业的专家哪些特征是必要的;例如,在金融科技数据集的例子中可能需要咨询每天执行贷款评估的信贷员。信贷员将确切地知道是什么驱动了他们的决策过程(我们其实是希望将这部分过程通过ML实现自动化)。
假设我们已得到了以下建议(请参阅下面的代码片段)。虽然我们应该对这些建议保持谨慎,但它为我们开始初步工作提供了一个很好的基础,我们可以进一步改进。
loans = loan[['id', 'loan_amnt', 'term','int_rate', 'sub_grade', 'emp_length','grade', 'annual_inc', 'loan_status', 'dti', 'mths_since_recent_inq', 'revol_util', 'bc_open_to_buy', 'bc_util', 'num_op_rev_tl']]
#remove missing values
loans = loans.dropna()
花合理的时间来理解数据集中每个特征的含义:
- loan_amnt -借款人申请贷款的清单金额。
- term -偿还贷款的次数,其中的值以月为单位,可以是36或60。
- int_rate -贷款的利率
- sub_grade -根据借款人的信用记录分配贷款等级分数
- emp_length -借款者的就业年限。
- home_ownership-借款人提供的房屋所有权状况(例如,租金、所有权、抵押贷款等)
- annual_inc -借款人提供的自我报告的年收入
- addr_state-借款人在贷款申请中提供的状态
- dti -用借款人每月偿还的债务总额(不包括按揭)除以借款人每月收入计算的比率。
- mths_since_recent_inq-最近一次查询的月份
- revol_util - 循环额度利用率,或借款人使用的信贷金额相对于所有可用的循环信贷。
- bc_open_to_buy - 银行卡的总开放购买量
- bc_util - 所有银行卡账户的总流动余额与高信用/信用限额的比率
- num_op_rev_tl - 开户数
- loan_status - 当前贷款状态(例如,完全支付或注销)。这就是我们要用模型预测的标签。
在进行下一步工作之前,需要先执行数据处理步骤。步骤包括缺失值、异常值和分类特征处理。
loans = loans.dropna()
q_low = loans["annual_inc"].quantile(0.08)
q_hi = loans["annual_inc"]