机器学习初学者 2024年10月04日
【Python】Python特征选择的总结
index_new5.html
../../../zaker_core/zaker_tpl_static/wap/tpl_guoji1.html

 

本文回顾特征选择技术,包括其重要性、方法及在Python中的实现。解答了如特征选择的定义、好处、方法等面试问题,并以金融科技数据集为例,展示了特征选择的具体过程,包括数据处理、相关分析等。

特征选择的重要性及定义:特性选择是选择与ML模型更一致、非冗余和更相关的基本特性的过程。在ML项目中使用特性选择很必要,可减少数据集大小和复杂性,使模型更易理解和解释,避免过度拟合。

特征选择的方法:包括前向特征选择,从一个或小部分特征开始拟合模型并不断添加特征;向后特征选择,从完整特征集开始迭代地逐个减少特征;还有Filtered-based、Wrapper、Embedded等方法。

使用Python进行特征选择的过程:以金融科技数据集为例,进行数据处理,包括获得领域知识、处理缺失值等,然后进行单变量分析、识别高度相关特征、处理多重共线性,最后找出特征与目标变量的相关性。

处理多重共线性的方法:检测高度相关特征,如使用Pearson相关系数并删除高度相关特征,还可使用主成分分析(PCA)降维,文中以具体特征为例进行了处理。

找出特征与目标变量相关性的方法:介绍了基于过滤的方法和包装器方法,如使用相关矩阵、pandas自带的corr函数、seaborn热点图等,以及使用mlxtend库的SequentialFeatureSelector进行前向选择。

2024-10-04 12:02 浙江

Python特征选择的总结

在本文中,我们将回顾特性选择技术并回答为什么它很重要以及如何使用python实现它。

本文还可以帮助你解答以下的面试问题:



01 什么是特征选择,为何重要?


特性选择是选择与ML模型更加一致、非冗余和更相关的基本特性的过程。在ML项目中使用特性选择是必要的,因为:


02 特征选择方法有哪些?

有两种常见的方法可以处理特征选择:

1、前向特征选择。使用一个特征(或一小部分)拟合模型并不断添加特征,直到新加的模型对ML 模型指标没有影响。可以使用相关分析等方法(例如,基于 Pearson 系数),或者您可以从单个特征或特征子集开始拟合模型。

2、向后特征选择。这是 与1的相反方法。使用这种方法,可以从完整的特征集开始,然后迭代地逐个减少功能,减少特征的同时只要 ML 模型指标保持不变即可。

我们可以将一些流行的方法总结成以下几种分类:


03 使用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()


花合理的时间来理解数据集中每个特征的含义:

在进行下一步工作之前,需要先执行数据处理步骤。步骤包括缺失值、异常值和分类特征处理。

 loans = loans.dropna()  q_low = loans["annual_inc"].quantile(0.08) q_hi = loans["annual_inc"].quantile(0.92) loans = loans[(loans["annual_inc"] < q_hi) & (loans["annual_inc"] > q_low)] loans = loans[(loans['dti'] <=45)] q_hi = loans['bc_open_to_buy'].quantile(0.95) loans = loans[(loans['bc_open_to_buy'] < q_hi)] loans = loans[(loans['bc_util'] <=160)] loans = loans[(loans['revol_util'] <=150)] loans = loans[(loans['num_op_rev_tl'] <=35)]  cleaner_app_type = {"term": {" 36 months": 1.0, " 60 months": 2.0},      "sub_grade": {"A1": 1.0, "A2": 2.0, "A3": 3.0, "A4": 4.0,          "A5": 5.0, "B1": 11.0, "B2": 12.0, "B3": 13.0, "B4": 14.0,          "B5": 15.0, "C1": 21.0, "C2": 22.0, "C3": 23.0, "C4":          24.0, "C5": 25.0, "D1": 31.0, "D2": 32.0, "D3": 33.0,          "D4": 34.0, "D5": 35.0, "E1": 41.0, "E2": 42.0, "E3":          43.0, "E4": 44.0, "E5": 45.0, "F1": 51.0, "F2": 52.0,          "F3": 53.0, "F4": 54.0, "F5": 55.0, "G1": 61.0, "G2":          62.0, "G3": 63.0, "G4": 64.0, "G5": 65.0, },      "emp_length": {"< 1 year": 0.0, '1 year': 1.0, '2 years': 2.0,          '3 years': 3.0, '4 years': 4.0, '5 years': 5.0, '6 years':            6.0, '7 years': 7.0, '8 years': 8.0, '9 years': 9.0, '10+            years': 10.0 }        } loans = loans.replace(cleaner_app_type)

在预选特征之后,下一步是进行单变量分析。分析单个特征时可以使用的最常见的两种技术:
1)删除低方差(超过90%)的特征;
2)删除有大量缺失值的特征。

低方差:假设有两个特征

1)性别只包含一个性别值(例如,女性)

2)年龄包含30到50岁之间的不同值
在这种情况下,性别特征的方差很小,因为这个属性中的值都是相同的,在模型训练时,它不会帮助模型找到任何模式;因此我们可以直接删除这个特征。

这种方式得实现非常简单,可以使用sklearn得VarianceThreshold函数。下面的代码将识别那些在至少90%的实例中相同的特性。

 from sklearn.feature_selection import VarianceThreshold variance = VarianceThreshold(threshold = (.9 * (1 - .9))) variance.fit(loans) variance.get_support()


可以看到在我们的案例中没有低方差的特征,所以不需要删除。

缺失值:在这组特征中没有任何包含大量缺失值的特征;因此,我们将跳过这一步。以前我们也发过处理缺失值的文章,如果你对这部分感兴趣,可以搜索查看。

第二步:识别高度相关的特征

第二步是识别特征的多重共线性。我们使用双变量分析来找出两组变量之间是否有关系(相关)。

利用这些相关性,你可以得到以下的结论:

当数据集的特征之间具有高度的正相关或负相关时,ML模型可能会受到多重共线性的影响。高度相关的特征可能提供相同的信息。在这种情况下可能会导致扭曲或误导的结果,为了解决这个问题,我们可以只保留一个特征,删除多余的特征,这样是不丢失任何信息的。

比如月薪和年薪;虽然它们可能不一样,但它们可能有相同的模式。像逻辑回归和线性回归这样的模型对这个问题很敏感,如果用这样的冗余特征训练模型,可能会产生误导的结果。因此我们应该以消除其中一个为目标。

注意:决策树和增强树等算法不受多重共线性的影响。

第三步:处理多重共线性

有很多方法可以处理它。检测高度相关特征的最简单方法是使用 Pearson 相关系数并删除十分(~90%)相关特征。主成分分析(PCA)也可以用作降维算法。它通常用于降维,它将每个数据点仅投影到前几个主成分上获得低维数据的同时尽可能多地保留数据的变化。

这里我们使用pandas_profiling来进行分析

 from pandas_profiling import ProfileReport profile = ProfileReport (loans, title = 'Loans Defaults Prediction', html = {'style': {'full_width': True }}) profile


你会发现Pearson和Phik之间不同类型的相关性。当数据中包含未处理的分类特性时,Phik是非常好用的。例如,下面的“grade”分类特征,它在相关矩阵上绘制得很好:

如何理解相关矩阵:相关性范围从+1到-1,其中:

上图可以观察到以下高度相关的特征:


 loans.drop(["bc_util", "bc_open_to_buy","int_rate", "grade"],  axis = 1, inplace = True)

第四步:找出特征与目标变量之间的相关性

我们希望能够找到与目标变量(在本例中为loan_status)高度相关的特性。这里将回顾上面介绍的两种流行的方法:

1 基于过滤的方法

相关矩阵可以帮助我们识别高度相关的特征。pandas_profiling生成分析报告可能需要时间,因此了解绘制相关矩阵的其他技术是必要的。下面是两种可选方法:

使用pandas自带的corr函数

 loans_cor=loan.corr() loans_cor


使用seaborn热点图

 import seaborn as sns import matplotlib.pyplot as plt %matplotlib inline plt.figure(figsize=(10,6)) sns.heatmap(loans_cor, annot=True)


我们可以观察到以下高度相关的特征:sub_grade, term, loan_amnt, dti, emp_length, annual_inc与loan_status。这可以让我们知道哪些特性是重要的。

2 包装器方法

包装器的方法是一种选择特征的更自动化的方式,我们将使用内置函数 SequentialFeatureSelector()实现前向选择,该函数是 mlxtend 库的一部分。此函数具有不同的特征选择技术。

SequentialFeatureSelector() 有 11 个参数,您可以调整这些参数以获得最佳结果。我们这里将调整以下参数:

现在让我们将上面定义的特征选择器应用到的数据集中。

对于给定的数据将尝试一个非常常见的算法-逻辑回归序列特征选择器。Loan_status将被用作预测的标签以查找预测的依赖项:

 from sklearn.model_selection import train_test_split, RandomizedSearchCV from sklearn.linear_model import LogisticRegression from sklearn import metrics from sklearn.preprocessing import MinMaxScaler X = loans.drop('loan_status', axis=1) y = loans[['loan_status']] y = y.values.ravel() X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.25, random_state=42, stratify=y) scaler = MinMaxScaler() X_train = scaler.fit_transform(X_train) X_test = scaler.transform(X_test)

下一步是我们将使用SequentialFeatureSelector来寻找“最佳”特征:

 from mlxtend.feature_selection import SequentialFeatureSelector as SFS  sfs = SFS(LogisticRegression(),          k_features='best',          forward=True,          floating=False,          scoring = 'precision',          cv = 0)

将上面的特征选择器应用到我们的数据:

 sfs.fit(X, y) sfs.k_feature_names_

返回并查看ML任务应该使用的最佳特性:

通过比较每个训练步骤中的性能和特征数量来了解选择过程。还可以看到所选择的模型度量在迭代步骤中不会发生很大的变化。
 from mlxtend.plotting import plot_sequential_feature_selection as plot_sfs import matplotlib.pyplot as plt fig1 = plot_sfs(sfs.get_metric_dict(), kind='std_dev') plt.title('Sequential Forward Selection') plt.grid() plt.show()


可以看到不同特征的指标表现

04 总结

在本文中,我们介绍了特征选择技术的基本原理,这对理解重要特征和结果变量之间的相关性是非常关键的。

本篇文章的代码:
https://www.kaggle.com/code/mariiagusarova/feature-selection-techniques
作者:Maria Gusarova

往期精彩回顾





欢迎加入机器学习爱好者微信群一起和同行交流,目前有机器学习交流群、博士群、博士申报交流、CV、NLP等微信群,请扫描下面的微信号加群,备注:”昵称-学校/公司-研究方向“,例如:”张小明-浙大-CV“。请按照格式备注,否则不予通过。添加成功后会根据研究方向邀请进入相关微信群。请勿在群内发送广告,否则会请出群,谢谢理解~(也可以加入机器学习交流qq群772479961



跳转微信打开

Fish AI Reader

Fish AI Reader

AI辅助创作,多种专业模板,深度分析,高质量内容生成。从观点提取到深度思考,FishAI为您提供全方位的创作支持。新版本引入自定义参数,让您的创作更加个性化和精准。

FishAI

FishAI

鱼阅,AI 时代的下一个智能信息助手,助你摆脱信息焦虑

联系邮箱 441953276@qq.com

相关标签

特征选择 Python ML模型 数据集 相关性
相关文章