特征选择的通俗讲解!

python特征递归消除 特征递归消除官方给了两者方法 1.RFE 2.RFECV 一.RFE 官方解释 链接:sklearn.feature_selection.RFE — scikit-learn 1.0.2 documentationhttps://scikit-learn.org/stable/modules/generated/sklearn.feature_selection.RFE.html?highlight=rfe#sklearn.feature_selection.RFE给定一个为... 阅读详情

 Datawhale干货 

译者:佚名,编辑:Datawhale

简  介

据《福布斯》报道,每天大约会有 250 万字节的数据被产生。然后,可以使用数据科学和机器学习技术对这些数据进行分析,以便提供分析和作出预测。尽管在大多数情况下,在开始任何统计分析之前,需要先对最初收集的数据进行预处理。有许多不同的原因导致需要进行预处理分析,例如:

  • 收集的数据格式不对(如 SQL 数据库、JSON、CSV 等)

  • 缺失值和异常值

  • 标准化

  • 减少数据集中存在的固有噪声(部分存储数据可能已损坏)

  • 数据集中的某些功能可能无法收集任何信息以供分析

在本文中,我将通俗介绍如何使用 python 减少 kaggle Mushroom Classification 数据集中的特性数量。

减少统计分析期间要使用的特征的数量可能会带来一些好处,例如:

  • 提高精度

  • 降低过拟合风险

  • 加快训练速度

  • 改进数据可视化

  • 增加我们模型的可解释性

事实上,统计上证明,当执行机器学习任务时,存在针对每个特定任务应该使用的最佳数量的特征(图 1)。如果添加的特征比必要的特征多,那么我们的模型性能将下降(因为添加了噪声)。真正的挑战是找出哪些特征是最佳的使用特征(这实际上取决于我们提供的数据量和我们正在努力实现的任务的复杂性)。这就是特征选择技术能够帮到我们的地方!

图 1:分类器性能和维度之间的关系

特征选择

有许多不同的方法可用于特征选择。其中最重要的是:

1.过滤方法=过滤我们的数据集,只取包含所有相关特征的子集(例如,使用 Pearson 相关的相关矩阵)。

2.遵循过滤方法的相同目标,但使用机器学习模型作为其评估标准(例如,向前/向后/双向/递归特征消除)。我们将一些特征输入机器学习模型,评估它们的性能,然后决定是否添加或删除特征以提高精度。因此,这种方法可以比滤波更精确,但计算成本更高。

3.嵌入方法。与过滤方法一样,嵌入方法也使用机器学习模型。这两种方法的区别在于,嵌入的方法检查 ML 模型的不同训练迭代,然后根据每个特征对 ML 模型训练的贡献程度对每个特征的重要性进行排序。

图 2:过滤器、包装器和嵌入式方法表示 [3]

实践

在本文中,我将使用 Mushroom Classification 数据集,通过查看给定的特征来尝试预测蘑菇是否有毒。在这样做的同时,我们将尝试不同的特征消除技术,看看它们会如何影响训练时间和模型整体的精度。

数据下载:https://github.com/ffzs/dataset/blob/master/mushrooms.csv

首先,我们需要导入所有必需的库。

我们将在本例中使用的数据集如下图所示。

图 3:Mushroom Classification 数据集

在将这些数据输入机器学习模型之前,我决定对所有分类变量进行 one hot 编码,将数据分为特征(x)和标签(y),最后在训练集和测试集中进行。

X = df.drop(['class'], axis = 1)
Y = df['class']
X = pd.get_dummies(X, prefix_sep='_')
Y = LabelEncoder().fit_transform(Y)


X2 = StandardScaler().fit_transform(X)


X_Train, X_Test, Y_Train, Y_Test = train_test_split(X2, Y, test_size = 0.30,  random_state = 101)

特征重要性

基于集合的决策树模型(如随机森林)可以用来对不同特征的重要性进行排序。了解我们的模型最重要的特征对于理解我们的模型如何做出预测(使其更易于解释)是至关重要的。同时,我们可以去掉那些对我们的模型没有任何好处的特征。

start = time.process_time()
trainedforest = RandomForestClassifier(n_estimators=700).fit(X_Train,Y_Train)
print(time.process_time() - start)
predictionforest = trainedforest.predict(X_Test)
print(confusion_matrix(Y_Test,predictionforest))
print(classification_report(Y_Test,predictionforest))

如下图所示,使用所有特征训练一个随机森林分类器,在大约 2.2 秒的训练时间内获得 100% 的准确率。在下面的每个示例中,每个模型的训练时间都将打印在每个片段的第一行,供你参考。

一旦我们的随机森林分类器得到训练,我们就可以创建一个特征重要性图,看看哪些特征对我们的模型预测来说是最重要的(图 4)。在本例中,下面只显示了前 7 个特性。

figure(num=None, figsize=(20, 22), dpi=80, facecolor='w', edgecolor='k')


feat_importances = pd.Series(trainedforest.feature_importances_, index= X.columns)
feat_importances.nlargest(7).plot(kind='barh')

图 4:特征重要性图

现在我们知道了哪些特征被我们的随机森林认为是最重要的,我们可以尝试使用前 3 个来训练我们的模型。

X_Reduced = X[['odor_n','odor_f', 'gill-size_n','gill-size_b']]
X_Reduced = StandardScaler().fit_transform(X_Reduced)
X_Train2, X_Test2, Y_Train2, Y_Test2 = train_test_split(X_Reduced, Y, test_size = 0.30,  random_state = 101)


start = time.process_time()
trainedforest = RandomForestClassifier(n_estimators=700).fit(X_Train2,Y_Train2)
print(time.process_time() - start)
predictionforest = trainedforest.predict(X_Test2)
print(confusion_matrix(Y_Test2,predictionforest))
print(classification_report(Y_Test2,predictionforest))

正如我们在下面看到的,仅仅使用 3 个特征,只会导致准确率下降 0.03%,训练时间减少一半。

我们还可以通过可视化一个训练过的决策树来理解如何进行特征选择。

start = time.process_time()
trainedtree = tree.DecisionTreeClassifier().fit(X_Train, Y_Train)
print(time.process_time() - start)
predictionstree = trainedtree.predict(X_Test)
print(confusion_matrix(Y_Test,predictionstree))
print(classification_report(Y_Test,predictionstree))

树结构顶部的特征是我们的模型为了执行分类而保留的最重要的特征。因此,只选择顶部的前几个特征,而放弃其他特征,可能创建一个准确度非常可观的模型。

import graphviz
from sklearn.tree import DecisionTreeClassifier, export_graphviz




data = export_graphviz(trainedtree,out_file=None,feature_names= X.columns,
        class_names=['edible', 'poisonous'], 
        filled=True, rounded=True, 
        max_depth=2,
        special_characters=True)
graph = graphviz.Source(data)
graph

图 5:决策树可视化

递归特征消除(RFE)

递归特征消除(RFE)将机器学习模型的实例和要使用的最终期望特征数作为输入。然后,它递归地减少要使用的特征的数量,采用的方法是使用机器学习模型精度作为度量对它们进行排序。

创建一个 for 循环,其中输入特征的数量是我们的变量,这样就可以通过跟踪在每个循环迭代中注册的精度,找出我们的模型所需的最佳特征数量。使用 RFE 支持方法,我们可以找出被评估为最重要的特征的名称(rfe.support 返回一个布尔列表,其中 true 表示一个特征被视为重要,false 表示一个特征不重要)。

from sklearn.feature_selection import RFE


model = RandomForestClassifier(n_estimators=700)
rfe = RFE(model, 4)
start = time.process_time()
RFE_X_Train = rfe.fit_transform(X_Train,Y_Train)
RFE_X_Test = rfe.transform(X_Test)
rfe = rfe.fit(RFE_X_Train,Y_Train)
print(time.process_time() - start)
print("Overall Accuracy using RFE: ", rfe.score(RFE_X_Test,Y_Test))

SelecFromModel

selectfrommodel 是另一种 scikit 学习方法,可用于特征选择。此方法可用于具有 coef 或 feature 重要性属性的所有不同类型的 scikit 学习模型(拟合后)。与 rfe 相比,selectfrommodel 是一个不太可靠的解决方案。实际上,selectfrommodel 只是根据计算出的阈值(不涉及优化迭代过程)删除不太重要的特性。

为了测试 selectfrommodel 的有效性,我决定在这个例子中使用一个 ExtraTreesClassifier。

ExtratreesClassifier(极端随机树)是基于树的集成分类器,与随机森林方法相比,它可以产生更少的方差(因此减少了过拟合的风险)。随机森林和极随机树的主要区别在于极随机树中节点的采样不需要替换。

from sklearn.ensemble import ExtraTreesClassifier
from sklearn.feature_selection import SelectFromModel


model = ExtraTreesClassifier()
start = time.process_time()
model = model.fit(X_Train,Y_Train)
model = SelectFromModel(model, prefit=True)
print(time.process_time() - start)
Selected_X = model.transform(X_Train)


start = time.process_time()
trainedforest = RandomForestClassifier(n_estimators=700).fit(Selected_X, Y_Train)
print(time.process_time() - start)
Selected_X_Test = model.transform(X_Test)
predictionforest = trainedforest.predict(Selected_X_Test)
print(confusion_matrix(Y_Test,predictionforest))
print(classification_report(Y_Test,predictionforest))

相关矩阵分析

为了减少数据集中的特征数量,另一种可能的方法是检查特征与标签的相关性。

使用皮尔逊相关,我们的返回系数值将在-1 和 1 之间变化:

  • 如果两个特征之间的相关性为 0,则意味着更改这两个特征中的任何一个都不会影响另一个。

  • 如果两个特征之间的相关性大于 0,这意味着增加一个特征中的值也会增加另一个特征中的值(相关系数越接近 1,两个不同特征之间的这种联系就越强)。

  • 如果两个特征之间的相关性小于 0,这意味着增加一个特征中的值将使减少另一个特征中的值(相关性系数越接近-1,两个不同特征之间的这种关系将越强)。

在这种情况下,我们将只考虑与输出变量至少 0.5 相关的特性。

Numeric_df = pd.DataFrame(X)
Numeric_df['Y'] = Y
corr= Numeric_df.corr()
corr_y = abs(corr["Y"])
highest_corr = corr_y[corr_y >0.5]
highest_corr.sort_values(ascending=True)

我们现在可以通过创建一个相关矩阵来更仔细地研究不同相关特征之间的关系。

figure(num=None, figsize=(12, 10), dpi=80, facecolor='w', edgecolor='k')


corr2 = Numeric_df[['bruises_f' , 'bruises_t' , 'gill-color_b' , 'gill-size_b' ,  'gill-size_n' , 'ring-type_p' , 'stalk-surface-below-ring_k' ,  'stalk-surface-above-ring_k' , 'odor_f', 'odor_n']].corr()


sns.heatmap(corr2, annot=True, fmt=".2g")

图 6:最高相关特征的相关矩阵

在这项分析中,另一个可能要控制的方面是检查所选变量是否彼此高度相关。如果是的话,我们就只需要保留其中一个相关的,去掉其他的。

最后,我们现在可以只选择与 y 相关度最高的特征,训练/测试一个支持向量机模型来评估该方法的结果。

单变量选择

单变量特征选择是一种统计方法,用于选择与我们对应标签关系最密切的特征。使用 selectkbest 方法,我们可以决定使用哪些指标来评估我们的特征,以及我们希望保留的 k 个最佳特征的数量。根据我们的需要,提供不同类型的评分函数:

  • Classification = chi2, f_classif, mutual_info_classif

  • Regression = f_regression, mutual_info_regression

在本例中,我们将使用 chi2(图 7)。

图 7:卡方公式 [4]

卡方(chi-squared,chi2)可以将非负值作为输入,因此,首先,我们在 0 到 1 之间的范围内缩放输入数据。

from sklearn.feature_selection import SelectKBest
from sklearn.feature_selection import chi2


min_max_scaler = preprocessing.MinMaxScaler()
Scaled_X = min_max_scaler.fit_transform(X2)


X_new = SelectKBest(chi2, k=2).fit_transform(Scaled_X, Y)
X_Train3, X_Test3, Y_Train3, Y_Test3 = train_test_split(X_new, Y, test_size = 0.30,  random_state = 101)
start = time.process_time()
trainedforest = RandomForestClassifier(n_estimators=700).fit(X_Train3,Y_Train3)
print(time.process_time() - start)
predictionforest = trainedforest.predict(X_Test3)
print(confusion_matrix(Y_Test3,predictionforest))
print(classification_report(Y_Test3,predictionforest))

套索回归

当将正则化应用于机器学习模型时,我们在模型参数上加上一个惩罚,以避免我们的模型试图太接近我们的输入数据。通过这种方式,我们可以使我们的模型不那么复杂,并且我们可以避免过度拟合(使我们的模型不仅学习关键的数据特征,而且学习它的内在噪声)。

其中一种可能的正则化方法是套索回归。当使用套索回归时,如果输入特征的系数对我们的机器学习模型训练没有积极的贡献,则它们会缩小。这样,一些特征可能会被自动丢弃,即将它们的系数指定为零。

from sklearn.linear_model import LassoCV


regr = LassoCV(cv=5, random_state=101)
regr.fit(X_Train,Y_Train)
print("LassoCV Best Alpha Scored: ", regr.alpha_)
print("LassoCV Model Accuracy: ", regr.score(X_Test, Y_Test))
model_coef = pd.Series(regr.coef_, index = list(X.columns[:-1]))
print("Variables Eliminated: ", str(sum(model_coef == 0)))
print("Variables Kept: ", str(sum(model_coef != 0)))

一旦训练了我们的模型,我们就可以再次创建一个特征重要性图来了解哪些特征被我们的模型认为是最重要的(图 8)。这是非常有用的,尤其是在试图理解我们的模型是如何决定做出预测的时候,因此使我们的模型更易于解释。

figure(num=None, figsize=(12, 10), dpi=80, facecolor='w', edgecolor='k')


top_coef = model_coef.sort_values()
top_coef[top_coef != 0].plot(kind = "barh")
plt.title("Most Important Features Identified using Lasso (!0)")

图 8:套索特征重要性图

来源:https://towardsdatascience.com/feature-selection-techniques-1bfab5fe0784

【特征重要性揭秘:为什么同一个数据集会有不同结果】 因此,选择特征重要性分析方法时,最佳实践包括尝试多种方法以获得更全面的视图,使用集成方法聚合结果,更关注特征的相对顺序而不是绝对值,并且了解差异的原因,以深入了解数据和模型。同时,超参数的选择,比如PCA的主成分数量或树模型的深度,也会对结果产生影响,增加了结果的不确定性。然而,并非所有特征都同样重要。在PCA中,前几个主成分上的特征权重较大,说明这些特征在数据中具有较高的方差,因此,在这些主成分上具有较高的负载。在PCA中,数据的方差最大的方向被称为第一个主成分,第二大的方向是第二个主成分,以此类推。 阅读详情

相关推荐

基于特征排列的特征重要性计算及可视化Python实现

在特征选择和模型优化中,特色重要性被广泛地应用,而特征重要性计算方法有很多种,其中之一便是特征排列法。本篇文章将介绍如何使用Python实现基于特征排列的特征重要性计算及可视化。通过以上步骤,我们已经成功地使用Python实现了基于特征排列法的特征重要性计算及可视化。在这里,我们使用了100棵决策树的随机森林模型,并使用permutation_importance方法计算每个特征的重要性。接着,我们可以载入所需要的数据,并对数据进行预处理(比如缺失值填充、异常值处理等),这里不再赘述。

. 865

Python可视化 | 计算特征重要性的3种必备方法

正如之前提到的,以这种方式获取重要性是轻松的,但结果可能会有点偏倚。它只是一个单一的特征,但它解释了数据集中超过60%的方差。如您从图像5中所看到的,它与平均半径特征的相关系数几乎为0.8 — 这被认为是强正相关。唯一明显的问题是规模。简单来说,如果分配的系数是一个较大的(负数或正数)数字,它对预测有一定的影响。PCA不会直接显示您最重要的特征,就像前两种方法所做的那样。首先,让我们将PCA适应我们的缩放数据,并看看会发生什么。一个要记住的要点是,系数越大(无论是正数还是负数),它对预测的影响就越大。

aobulaien001的博客 1637

【AIOPS实战】Dify+Zabbix:构建智能告警分析助手的核心架构与实现

本文详细介绍了如何利用Dify平台与Zabbix-MCP接口构建智能告警分析助手,实现自然语言查询告警、智能分析和报告生成。该系统通过AIOPS技术显著提升运维效率,支持中英文混合查询、自动根因分析,并内置多种优化方案确保稳定可靠。

weixin_29238147的博客 319

【特征选择】特征选择的通俗讲解!

点击上方,选择星标,每天给你送干货!文章作者:佚名内容来源:DataWhale导读:据《福布斯》报道,每天大约会有 250 万字节的数据被产生。然后,可以使用数据科学和机器学习技术对这些数...

zenRRan的博客 476

麒麟V10安装图形化界面

在配置VNC时发现,原本麒麟V10系统最小化安装,导致无图形化界面,先需要对其进行安装。 首先确保无图形化界面,可以在终端输入startX命令查看是否报错。 安装介绍: 1、 安装图形化界面 yum grouplist //查看可用yum安装组 注:这里一般会有缺少包或者出现包不符合的问题 导入软件包分组信息文件xxxx-comps.xml arm: 将此文件传送到源服务器, 然后createrepo -g导入到arm的base目录和updates目录 createrepo -g e33dc

Pro_jhf的博客 8076

组合导航 | RTK、IMU与激光雷达组合导航算法:原理、实现与验证

当激光雷达噪声增加至0.1m时,系统位置RMSE仅上升18%,验证了滤波算法的鲁棒性[110]:融合方案在RTK信号丢失30秒后,位置误差仍控制在1.5m内,显著优于IMU单独导航[28]:ESKF框架能有效建模传感器误差特性,状态向量需包含外参与时间偏移等关键参数。:传感器标定精度直接影响系统性能,建议每3个月进行一次重新标定。:IMU预积分与特征匹配是系统实时性的关键瓶颈,需重点优化。:维持10秒窗口内的关键帧,平衡精度与实时性[132]:特征匹配占总耗时的65%,可通过。

尘世冰封的专栏 950

【干货】特征选择的通俗讲解!

译者:佚名,编辑:Datawhale简 介据《福布斯》报道,每天大约会有 250 万字节的数据被产生。然后,可以使用数据科学和机器学习技术对这些数据进行分析,以便提供分析和作出预测。尽管...

lsxxx2011的专栏 311

知道LPDDR和DDR什么关系吗?

话不多说,先上大白话,一个网友总结的很好:简单地说DRR4是标准电压版的PC和服务器内存,LPDDR4属于手机等嵌入式移动设备使用的低电压低功耗内存,LPDDR4X则是LPDDR4的升级版,下面详细看看老哥的博客。LPDDR4是与DDR4内存等效的移动设备。。LPDDR4具有两个16位通道,从而使每个DIMM的总线总长度为32位。相比之下,DDR4每个DIMM具有64位通道。

叫好与叫座虽然不是对立面,但想在同一个作品中达到双重效果很难。 2806

面向小白的特征选择通俗讲解,赶紧收藏!

简 介据《福布斯》报道,每天大约会有 250 万字节的数据被产生。然后,可以使用数据科学和机器学习技术对这些数据进行分析,以便提供分析和作出预测。尽管在大多数情况下,在开始任何统计分析之前,需要先对最初收集的数据进行预处理。有许多不同的原因导致需要进行预处理分析,例如:收集的数据格式不对(如 SQL 数据库、JSON、CSV 等)缺失值和异常值标准化减少数据集中存在的固有噪声(部分存储数据可能已...

weixin_43373042的博客 160

保姆级YOLOv8改进 | 基于DWRSeg扩张式残差机制的小目标检测优化(附修改后的C2f与Bottleneck模块)

DWRSeg机制:通过动态权重调整和扩张卷积有效提升了小目标的检测能力。C2f和Bottleneck模块修改:通过集成DWRSeg模块,增强了特征提取和残差学习能力。实验结果:在多个应用场景中,改进后的YOLOv8展现了更高的检测精度,特别是在小目标检测中表现突出。

一键难忘的博客 3221

【PINN物理信息网络】基于PINN物理信息网络求解瞬态薛定谔方程(python)

【PINN物理信息网络】基于PINN物理信息网络求解瞬态薛定谔方程(python)

k8291121的博客 2724

面向入门者的特征选择通俗讲解,赶紧收藏

创建一个 for 循环,其中输入特征的数量是我们的变量,这样就可以通过跟踪在每个循环迭代中注册的精度,找出我们的模型所需的最佳特征数量。通过这种方式,我们可以使我们的模型不那么复杂,并且我们可以避免过度拟合(使我们的模型不仅学习关键的数据特征,而且学习它的内在噪声)。这是非常有用的,尤其是在试图理解我们的模型是如何决定做出预测的时候,因此使我们的模型更易于解释。这两种方法的区别在于,嵌入的方法检查 ML 模型的不同训练迭代,然后根据每个特征对 ML 模型训练的贡献程度对每个特征的重要性进行排序。

m0_59596937的博客 225

elevation mapping算法3之使用D435i相机离线或在线订阅点云和tf关系生成高程图

本文主要学习使用D435i相机发出的点云作为高程图的点云输入,如何离线输入点云生成高程图,进一步学习如何在线订阅点云生成高程图。

重点记录机器人和自动驾驶相关领域的技术,尤其是计算机视觉,视觉SLAM等,不仅有前言文献或必备算法的学习,也会有实际应用的点滴经验 3491

机器学习的通俗讲解!

↑↑↑关注后"星标"Datawhale每日干货&每月组队学习,不错过Datawhale干货译者:Ahong,来源:dataxon机器学习人人都在谈论,但除了...

Datawhale 1268

Allegro如何把分离的线段变成封闭连续的图形

Allegeo支持把分离的线段变成封闭连续的图形,以下图为例,线段是分离的。Allegro如何把分离的线段变成封闭连续的图形。Find选择other segs 和Lines。Find选择other segs 和Lines。选择shape-compose shape。分离线段已经是连续封闭的shape形式了。框选图形,删除剩下的无用的分离线段。Find选择shapes。鼠标右击选择done。选择delete命令。鼠标右击选择done。

weixin_54787054的博客 6244

锂电池充电器电路设计 里面有电路

锂电池充电器电路设计 里面有电路 3.7V升压到5V电路设计。

上一篇: 分分钟甩 Word 几条街!用Python编辑公式竟可以如此简单
下一篇: 初学者应该知道4个隐藏的Python特性
机器学习算法那些事
博客等级 码龄9年 1633粉丝 62原创
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值