机器学习和神经网络 - 页 74

 

13.1 特征选择的不同类别(L13:特征选择)


13.1 特征选择的不同类别(L13:特征选择)

在上一个视频中,我们探讨了特征选择的概念作为降维的一个子类别。特征选择涉及从数据集中选择特征子集以提高机器学习模型的性能。我们讨论了特征选择的各种动机,例如增强预测性能和计算效率、优化存储空间以及深入了解数据。

现在,让我们更深入地研究不同类别的特征选择算法:过滤方法、嵌入方法和包装方法。过滤器方法关注特征本身的内在属性,不涉及模型或分类器。他们根据个体特征分析特征,例如方差或成对相关性。例如,计算特征的方差有助于确定其在区分不同训练示例方面的有用性。如果特征值分布在轴上,则表示其重要性。另一方面,高度相关的特征意味着冗余,可以在不丢失太多信息的情况下删除其中一个。过滤方法通常被称为单变量或双变量统计,因为它们分析单个或成对变量。

顾名思义,嵌入式方法在学习算法中结合了特征选择。这些方法嵌入到模型优化过程中,旨在优化目标函数。一个例子是决策树,其中的特征是在树生长的同时在内部选择的。决策树选择在每次拆分时使信息增益最大化的特征,从而选择重要的特征。最终决策树中未使用的特征可以被认为不太重要。

包装方法与优化预测性能的目标密切相关。这些方法涉及将模型拟合到不同的特征子集,并根据模型的性能选择或消除特征。通过比较在不同特征子集上训练的模型的性能,我们可以确定每个特征的重要性。例如,如果删除某个特征导致准确率显着下降,则表明该特征对模型的性能很重要。包装方法通过直接使用模型的准确性提供对特征重要性的有价值的见解。

虽然包装方法提供了准确的特征选择,但它们的计算量可能很大,尤其是在处理大型特征集时。将模型拟合到不同子集并评估其性能的过程可能非常耗时。相比之下,过滤器方法在计算上更有效,但它们可能无法提供与包装器方法一样准确的结果。准确性和计算效率之间的权衡是特征选择中的一个重要考虑因素。

在接下来的视频中,我们将更深入地研究每一类特征选择算法。我们将更详细地探讨过滤器方法,然后是嵌入式方法和包装器方法。通过了解这些技术,我们可以全面了解特征选择以及如何应用它来改进机器学习模型。

请继续关注下一个视频,我们将在其中深入讨论过滤方法。

 

13.2 特征选择的过滤方法——方差阈值(L13:特征选择)


13.2 特征选择的过滤方法——方差阈值(L13:特征选择)

是的,所以在之前的视频中,我们讨论了三种不同类别的特征选择:过滤方法、嵌入方法和包装方法。现在,让我们深入研究其中一个类别,即过滤方法。在接下来的视频中,我们还将探索嵌入式方法和包装器方法。但是,现在,让我们将过滤方法作为主要话题。

过滤方法是主要考虑特征本身内在属性的特征选择技术。他们不依赖特定模型进行特征选择。过滤方法的一个例子是方差阈值。让我们仔细看看方差阈值是如何工作的。

当使用方差阈值进行特征选择时,我们计算每个特征的方差。假设具有较高方差的特征可能包含对训练分类器或回归模型更有用的信息。但为什么是这样呢?为了理解这一点,让我们考虑一个称为 X1 的特征。在左侧,我们有一个具有高方差的特征,特征值分布得很好。在右侧,我们有一个低方差的特征,特征值分布较少。更高的方差允许我们根据该特征重建决策边界。这对于做出准确的预测至关重要。即使在类别重叠的最坏情况下,分布良好的特征仍然可以帮助构建决策边界。

为了进一步说明这个概念,让我们考虑一个二元分类案例。假设我们有两个类,方形类和星形类。在最好的情况下,一个类的所有数据点都在一侧,而另一类的所有数据点都在另一侧。这使得构建一个完美分离类的决策边界变得容易。然而,在现实世界中,完美分离并不总是可以实现的。即使类别重叠,具有高方差的特征仍然可以帮助构建决策边界。例如,决策树可以根据广泛分布的特征对数据点进行准确分类,如编码示例所示。

现在我们了解了方差的重要性,让我们讨论如何将它用作特征选择的度量。离散随机变量的方差可以使用特定公式计算,但在实践中,我们经常使用不知道概率分布的数据集。因此,我们假设统一权重并根据观察到的数据点计算方差。例如,在处理分类特征时,我们执行单热编码以创建二进制变量。在这种情况下,伯努利变量的方差可以计算为 p * (1 - p),其中 p 是观察值为 1 的概率。这种方差计算对于分类特征场景中的特征选择特别有用。

为了实现基于方差的特征选择,Scikit-learn 提供了 VarianceThreshold 类。这个类允许我们删除具有低方差的特征。通过指定方差阈值,我们可以剔除一定比例的标签相同的特征列。例如,如果我们要去除超过 80% 的标签相似的特征,我们可以将方差阈值设置为 0.16(计算为 0.8 * (1 - 0.8))。该阈值确保丢弃具有很小辨别力的特征。

总之,像方差阈值这样的过滤方法对于特征选择很有价值,因为它们考虑了特征的内在属性。通过分析特征的方差,我们可以识别并移除那些为分类或回归任务提供有限信息的特征。

 

13.3.1 L1 正则化逻辑回归作为嵌入式特征选择(L13:特征选择)


13.3.1 L1 正则化逻辑回归作为嵌入式特征选择(L13:特征选择)

在上一个视频中,我们讨论了不同的特征选择方法,特别关注基于特征属性的过滤方法。现在,让我们深入研究两种不同类别的特征选择:嵌入式方法和包装器方法。这两个类别都涉及使用模型(例如分类器)进行特征选择。在本视频中,我们将重点关注嵌入式方法,其中特征选择作为模型训练或优化过程的一部分隐式发生。

嵌入式方法将特征选择集成到模型训练过程中。我们将在 L1 正则化逻辑回归(也称为套索回归)的背景下探讨这个概念。在我们继续之前,请务必注意本视频假设您基本熟悉逻辑回归。但是,我们将只介绍基本概念,以免走偏。

让我们首先考虑具有两个类的二元逻辑回归模型,使用具有两个特征的 Iris 数据集:花瓣长度和花瓣宽度。逻辑回归产生一个线性决策边界来分离两个类。决策边界是通过将阈值应用于经过非线性变换的输入的加权和来确定的。

为了更好地理解逻辑回归,让我们检查模型的图形表示。在此图中,左侧有权重 (w),w1 和 w2 代表两个特征的权重。此外,我们有偏置单元 (B) 作为截距项。加权和计算为每个权重与其对应特征的乘积加上偏置项的总和。这个加权和然后通过一个 sigmoidal 函数,也称为 logistic sigmoid,它输出一个介于 0 和 1 之间的值。这个值表示类成员概率,表示给定观察到的特征,数据点属于类 1 的概率.通过应用阈值(通常为 0.5),我们可以进行二进制预测,将数据点分类为 0 类或 1 类。

现在我们对逻辑回归有了基本的了解,让我们关注一下 L1 正则化逻辑回归。 L1 正则化的关键方面是包含 L1 范数项,它衡量权重的大小。此项被添加到损失函数中,有效地惩罚具有大权重的复杂模型。在逻辑回归中,我们的目标是最小化损失函数,同时最小化权重。

为了形象化这一点,想象一下代表损失函数的等高线。外部轮廓对应较大的损失值,而靠近中心的轮廓表示较小的损失值。没有正则化的损失函数的全局最小值出现在中心,表示最小化损失的最佳权重。但是,L1 惩罚项更喜欢较小的权重并鼓励简单性。通过引入这个惩罚项,我们在最小化损失和最小化惩罚之间寻求平衡。值得注意的是,L1 正则化逻辑回归往往会产生稀疏权重,其中一些权重恰好为零。这个特征选择方面是使 L1 正则化具有吸引力的原因。

为了在实践中演示 L1 正则化逻辑回归,我们将使用 wine 数据集。该数据集包含与各种葡萄酒特性相关的 13 个不同特征,任务是将葡萄酒分类为不同的类型。我们首先将数据分成训练集和测试集,这是机器学习中的常见做法。

请注意,详细的代码示例和进一步的解释可以在本视频随附的笔记本中找到,下面将提供。

现在让我们继续使用 L1 正则化方法(也称为套索)进行特征选择部分。我们将使用 scikit-learn 中的逻辑回归模型,它允许我们应用 L1 正则化惩罚。

 from sklearn.linear_model import LogisticRegression

# Create a Logistic Regression model with L1 regularization
model = LogisticRegression(penalty= 'l1' , solver= 'liblinear' )

# Fit the model on the training data
model.fit(X_train, y_train)

通过将惩罚参数设置为“l1”,我们指定要使用 L1 正则化。求解器参数设置为“liblinear”,适用于像我们正在处理的小数据集。

在训练数据上拟合模型后,我们可以访问学习系数,它代表分配给每个特征的权重。让我们打印系数:

# Get the learned coefficients
coefficients = model.coef_

# Print the coefficients
for i, coef in enumerate(coefficients[ 0 ]):
    print(f 'Feature {i+1}: {coef:.4f}' )
模型的 coef_ 属性包含系数。我们迭代系数并将它们打印出来,将每个系数与其对应的特征相关联。

接下来,我们可以识别具有非零系数的特征,因为这些是选定的特征。让我们找到选定的特征并打印它们:

# Find the indices of non-zero coefficients
selected_features = [i for i, coef in enumerate(coefficients[ 0 ]) if coef != 0 ]

# Print the selected features
print( 'Selected features:' )
for feature in selected_features:
    print(f 'Feature {feature+1}' )
我们再次遍历系数,这次将非零系数的索引存储在 selected_features 列表中。最后,我们打印出选定的特征。

通过应用 L1 正则化,逻辑回归模型通过将某些系数驱动为零来隐式执行特征选择。具有非零系数的特征被认为对模型的预测很重要。

请务必注意,正则化参数 C 的选择会影响应用的正则化程度。较小的 C 值会导致更强的正则化,可能导致更多具有零系数的特征。

现在你已经了解了逻辑回归中使用 L1 正则化的嵌入特征选择方法。在下一个视频中,我们将探索使用决策树和随机森林进行特征选择。

在下一个视频中,我们将探索使用决策树和随机森林进行特征选择。这些方法称为集成方法,可用于分类和回归问题。

决策树是简单但功能强大的模型,它通过将特征空间划分为多个区域并为每个区域分配一个标签来进行预测。另一方面,随机森林是决策树的集合,其中每棵树都在数据和特征的随机子集上进行训练。

让我们首先使用 scikit-learn 中的随机森林分类器进行特征选择:

 from sklearn.ensemble import RandomForestClassifier

# Create a Random Forest Classifier
model = RandomForestClassifier()

# Fit the model on the training data
model.fit(X_train, y_train)

在训练数据上拟合模型后,我们可以访问特征重要性,它表示每个特征在模型预测中的相对重要性。让我们打印特征重要性:

# Get the feature importances
importances = model.feature_importances_

# Print the feature importances
for i, importance in enumerate(importances):
    print(f 'Feature {i+1}: {importance:.4f}' )
模型的 feature_importances_ 属性包含特征重要性。我们迭代重要性并将它们打印出来,将每个重要性与其对应的特征相关联。

接下来,我们可以根据重要性对特征进行排序,然后选择前 k 个特征。让我们找到前 k 个特征并打印它们:

# Rank the features based on importances
feature_ranks = sorted(range(len(importances)), key=lambda i: importances[i], reverse=True)

# Select the top k features
k = 5   # Number of top features to select
top_features = feature_ranks[:k]

# Print the top features
print(f 'Top {k} features:' )
for feature in top_features:
    print(f 'Feature {feature+1}' )

我们根据特征的重要性按降序对特征的索引进行排序。然后,我们通过对 feature_ranks 列表进行切片来选择前 k 个特征。最后,我们打印出最重要的特征。

随机森林考虑了集成中所有决策树中每个特征的平均贡献。重要性越高,特征对预测的影响就越大。

通过这种方式,随机森林提供了一种直接的方法来根据重要性分数执行特征选择。

现在您已经了解了使用决策树和随机森林进行特征选择。在下一个视频中,我们将介绍递归特征消除方法。

 

13.3.2 决策树和随机森林特征重要性(L13:特征选择)


13.3.2 决策树和随机森林特征重要性(L13:特征选择)

各位观众,大家好!在我们之前的视频中,我们开始讨论用于特征选择的嵌入式方法,重点关注正则化逻辑回归的示例。今天,我们将深入研究嵌入式方法的另一个示例,即决策树,并研究它们如何在每个节点选择特征。我们还将探讨它们与随机森林特征重要性的关系,这是一个您可能已经熟悉的概念。那么,让我们直接开始吧!

但在我们继续之前,我要宣布一个小消息。不幸的是,我的 iPad 铅笔或钢笔无法使用,所以我转而使用数位板。但是,我必须承认,习惯比我预期的要难一些。我可能需要再看几个视频才能真正适应并精通它。另外,我正在试用新的屏幕标注软件,所以如果有任何问题,请多多包涵。我希望在即将发布的视频中注释过程变得更加顺畅。现在,让我们重新关注我们的主题。

回顾一下,特征选择可以大致分为三种主要方法:过滤器方法、包装器方法和嵌入方法。在我们之前的视频中,我们探讨了 Lasso 或 L1 正则化逻辑回归作为嵌入式方法的示例。今天,我们将注意力转移到决策树和随机森林上。

首先,让我们讨论决策树以及它们如何执行特征选择。为了说明这一点,让我们考虑一个我们之前检查过的数据集。它由两个特征 x1 和 x2 以及两个类组成:正方形(0 类)和三角形(1 类)。我们的目标是对数据点进行分类,我们可以将决策边界可视化为分隔两个类别的分界线。多个决策边界可以实现这一点,我将在稍后展示。

现在,让我们仔细看看决策树如何拆分数据集。我已经使用 scikit-learn 训练了一个决策树并为您绘制了它。这棵树有两个分裂。第一次拆分发生在特征 x1 上,截止值为 5.5,将数据分为两组。第二次分割发生在特征 x2 上,截止值为 10.5,进一步分割数据。通过进行这些拆分,决策树成功地对数据集进行了分类。我们可以通过检查熵来评估这些拆分的有效性,熵表示类中混合或无序的程度。我们的目标是尽可能减少熵,理想情况下达到零值,这表示完美分类。在我们的例子中,我们观察到熵在每次分裂时都会减少,最终达到零。

值得注意的是,决策树本质上执行特征选择。在每个节点,树决定使用哪个特征进行分割。这个决定是基于最大化熵减少或最大化信息增益的特征。因此,决策树会自动选择信息量最大的特征来构建分类模型。

现在,让我们将注意力转移到随机森林,它们是决策树的集合体。随机森林提供了一种估计特征重要性的方法。为了证明这一点,让我们转向葡萄酒数据集,它包含与葡萄酒的各种特性相关的 13 个不同特征,例如酒精含量、苹果酸、灰分等。在右侧,您可以看到随机森林生成的特征重要性图。特征重要性取值范围从0到1,总和为1,代表每个特征的相对重要性。该图按降序排列,最重要的特征在左侧。

为了生成此图,我使用了 scikit-learn 的 feature_importances_ 属性,它根据随机森林模型计算特征重要性。如您所见,此数据集中最重要的特征是脯氨酸,其次是类黄酮和颜色强度。

特征重要性值是通过测量随机森林中所有决策树中每个特征的分裂所实现的不纯度总减少量(通常用基尼不纯度或熵来测量)来确定的。始终导致杂质减少更多的特征被认为更重要。

重要的是要注意特征重要性是随机森林模型上下文中的相对度量。这些值特定于您训练的随机森林,可能不会推广到其他模型或数据集。然而,它仍然可以提供有价值的见解,了解哪些特征对做出预测最有影响。

现在我们已经介绍了决策树和随机森林,让我们总结一下我们到目前为止所学的内容。决策树通过在每次分割时选择信息量最大的特征来隐式地执行特征选择,旨在降低熵并改进分类。另一方面,随机森林作为决策树的集合体,通过评估所有树中每个特征实现的杂质总减少量来提供特征重要性的度量。

了解特征重要性可以通过多种方式获益。它有助于识别与预测目标变量最相关的特征,通过关注信息量最大的特征进行降维,并提供对特征与目标变量之间潜在关系的洞察。

现在,让我们更深入地研究评估随机森林中特征重要性的过程。我们将探索一种称为排列重要性的方法。但在我们这样做之前,让我们简要回顾一下自举抽样和袋外样本的概念。

Bootstrap 抽样涉及对原始数据集进行随机抽样并进行替换,从而产生重复的数据点。因此,一些示例未包含在 bootstrap 示例中,创建了我们所说的包外示例。这些样本用作验证集或评估集,因为树在训练期间看不到它们。

现在,让我们关注方法 B,它是排列重要性。它利用了我们之前讨论过的袋外样本。首先,我们可以评估训练期间随机森林中决策树的预测性能。对于每棵树,可以对袋外样本进行预测,这些样本充当该树独有的验证或测试数据点。

为了计算排列重要性,我们从包含袋外示例的原始特征值的特征矩阵开始。对于随机森林中的每个决策树,我们在袋外示例中置换特征 J 的值。这意味着我们随机打乱特征值,同时保持类标签不变。

接下来,我们使用置换特征矩阵使用当前决策树对袋外示例进行预测。请记住,这些预测是基于排列后的特征值,因此它们代表了特征 J 被随机化时模型的性能。

我们将置换后的预测与每个袋外示例的原始预测进行比较,并计算由于特征 J 的置换而导致正确类别预测发生变化的次数。此计数反映了特征 J 对模型准确性的影响。如果特征 J 很重要,则排列其值会导致预测准确性显着降低。

我们对数据集中的每个特征重复这个过程,计算每个特征对模型准确性的影响。特征的排列对预测的影响越大,它就越重要。

为了量化特征重要性,我们计算了排列每个特征所导致的准确性下降。这是通过从原始准确度中减去置换后的准确度并对随机森林中所有决策树的差异进行平均来完成的。

最后,我们将特征重要性值归一化,使它们总和为 1,从而提供特征之间重要性的相对度量。这种规范化确保重要性值具有可比性和可解释性。

但是,重要的是要知道排列重要性方法有一些限制和注意事项。

首先,排列重要性可能低估了相关特征的重要性。当排列一个特征时,它会导致对其他相关特征的预测发生变化。因此,这些相关特征的重要性可能无法准确反映在特征重要性图中。在解释它们的重要性时,考虑特征之间的相关性很重要。

其次,排列重要性假设特征重要性仅基于模型的预测准确性。虽然预测准确性是一个关键因素,但它可能无法捕捉到特征重要性的所有方面。可能还有其他重要维度,例如特征的可解释性或领域知识相关性。

尽管存在这些限制,排列重要性还是提供了一种有价值的特征重要性定量度量。它使研究人员和从业者能够了解哪些特征对模型的预测影响最大,并可以指导与特征选择、模型解释和降维相关的决策。

在下一个视频中,我们将探索另一类特征选择方法,称为包装方法。包装方法涉及使用特定的机器学习模型评估不同的特征子集。我们将深入研究递归特征消除和前向/后向特征选择。当特征数量很大并且选择最相关的子集对模型性能至关重要时,这些方法特别有用。

回顾一下,我们已经介绍了嵌入式方法,特别是决策树和随机森林,作为特征选择技术。决策树通过在每次拆分时选择信息量最大的特征来隐式地执行特征选择,旨在减少熵并改进分类。随机森林作为决策树的集合,通过评估所有树中每个特征实现的杂质总减少量来提供特征重要性的度量。我们还讨论了排列重要性方法,该方法通过排列特征值并衡量它们对模型准确性的影响来量化特征重要性。

了解特征重要性使数据科学家和从业者能够就特征选择、解释模型做出明智的决策,并深入了解特征与目标变量之间的潜在关系。它是机器学习工具包中的一个有价值的工具,有助于提高模型性能和理解力。

在我们之前的视频中,我们介绍了不同的特征选择方法,包括过滤器方法、包装器方法和嵌入方法。在本视频中,我们将重点介绍包装器方法,特别是递归特征消除 (RFE) 和前向/后向特征选择。

包装器方法是一种特征选择技术,涉及使用特定机器学习模型评估不同的特征子集。与依赖统计测量的过滤器方法和将特征选择集成到模型训练过程中的嵌入式方法不同,包装器方法使用模型的性能作为选择特征的标准。

让我们从讨论递归特征消除 (RFE) 开始。 RFE 是一种迭代特征选择方法,它通过递归地消除特征并在剩余特征上构建模型来工作。它首先在完整的特征集上训练模型,然后根据特征的重要性对特征进行排名。然后,它消除了最不重要的特征并用剩余的特征重复该过程。这个迭代过程一直持续到达到指定数量的特征或达到预定义的性能阈值。

RFE 背后的想法是,通过递归地删除不太重要的特征,它专注于对模型性能贡献最大的信息量最大的特征。 RFE 可与任何提供特征重要性或特征权重度量的机器学习模型一起使用。与 RFE 一起使用的流行模型包括逻辑回归、支持向量机和随机森林。

现在,让我们继续前进/后退特征选择。这是两个相关的包装器方法,它们根据特征对模型性能的贡献,通过迭代添加或删除特征来搜索最佳特征子集。

正向特征选择从一个空的特征集开始,然后迭代地一次添加一个特征。在每次迭代中,它使用交叉验证或其他评估指标评估模型的性能,并选择最能提高性能的特征。该过程一直持续到满足预定义的停止标准,例如达到所需的特征数量或性能改进的平台。

另一方面,向后特征选择从完整的特征集开始,并一次迭代地删除一个特征。在每次迭代中,它都会评估模型的性能并删除对性能影响最小的特征。该过程一直持续到满足停止条件为止。

前向和后向特征选择的计算量都很大,尤其是在处理大量特征时。为了缓解这种情况,可以采用各种策略,例如使用启发式或近似法来加速搜索过程。

值得注意的是,包装方法(包括 RFE、前向选择和后向选择)可能对评估指标的选择和使用的机器学习模型很敏感。不同的评估指标可能会导致所选特征的不同子集,所选特征的性能可能因不同模型而异。

在实践中,建议执行交叉验证或使用外部验证集来获得模型在不同特征子集下的性能的稳健估计。这有助于避免过度拟合并选择能够很好地泛化到未见数据的特征。

总而言之,包装方法,例如递归特征消除 (RFE)、前向特征选择和后向特征选择,是特征选择的迭代技术,可根据模型的性能评估不同的特征子集。这些方法可以帮助识别与特定机器学习任务最相关的特征,提高模型的可解释性,并降低特征空间的维数。

在下一个视频中,我们将探索其他用于特征选择的高级技术,包括遗传算法和主成分分析 (PCA)。这些方法为根据不同的优化原则和统计技术选择特征提供了额外的选择。请继续关注!

特征选择是机器学习管道中的关键步骤,正确的特征选择方法的选择取决于特定的数据集、机器学习任务以及模型性能、可解释性和计算效率之间的理想权衡。

 

13.4.1 Recursive Feature Elimination (L13: Feature Selection)


13.4.1 Recursive Feature Elimination (L13: Feature Selection)

In this section, we will explore the topic of Wrapper methods for feature selection, building upon our previous discussions on filter methods and embedded methods. Wrapper methods employ models explicitly for selecting features. One popular example of a wrapper method is recursive feature elimination (RFE), which we will focus on in this video. Additionally, we will also delve into other feature selection methods using wrapper techniques in upcoming videos.

To provide an overview, there are three main methods for feature selection: filter methods, embedded methods, and wrapper methods. Today, our focus is on wrapper methods. The core idea behind RFE can be summarized in three steps.

First, we fit a model to the dataset, typically using linear models such as linear regression or logistic regression. This step is nothing out of the ordinary.

Next, we examine the model and specifically look at the model coefficients, which we will discuss in more detail shortly. Based on the magnitudes of these coefficients, we eliminate the feature with the smallest coefficient. By considering the feature with the smallest coefficient as the least important, we can remove it from further consideration. It's worth noting that normalization or standardization of features is important for this process, ensuring that they are on a comparable scale. We will see concrete examples of this later.

The final step is to repeat steps one and two until we reach the desired number of features. In essence, we continuously fit the model and eliminate the least important feature until we have the desired set of features. This simple yet effective method provides a straightforward approach to feature selection.

One critical aspect of recursive feature elimination lies in the elimination of model coefficients or weights. To illustrate this, let's consider linear regression and logistic regression models. Linear regression is used for modeling continuous targets, while logistic regression is a classifier for discrete or categorical labels. We won't delve into the details of these models here, as they have been covered in previous lectures.

In both linear and logistic regression, the models have coefficients or weights. In linear regression, these weights represent the slopes, while in logistic regression, they are associated with the influence of each feature on the classification outcome. By examining the magnitudes of these weights, we can determine the importance of each feature. Eliminating the feature with the smallest weight or coefficient effectively removes it from consideration. Alternatively, setting the weight to zero achieves the same outcome, as the weighted sum computation excludes the feature's contribution.

To better understand how feature elimination works, let's walk through an example using logistic regression. We have a binary classification problem with two features, x1 and x2, and we want to determine the class membership probability. By computing a weighted sum using the feature values and model weights, we obtain the net input. Applying a logistic sigmoid function to the net input, we derive the class membership probability. Comparing this probability to a threshold, typically 0.5, allows us to assign class labels.

The key takeaway is that the weights in these models reflect the importance of each feature. Larger weights indicate greater importance, as they contribute more significantly to the net input and subsequently affect the classification outcome. Standardizing or normalizing the weights ensures they are on the same scale, facilitating a better interpretation of their importance.

Moving on, let's explore an example of using recursive feature elimination in scikit-learn with the wine dataset. The code presented here demonstrates the process. We first prepare the dataset by splitting it into training and test sets, followed by standardizing the features. Then, we instantiate an RFE object from the RFE class in scikit-learn. We pass a logistic regression estimator to the RFE object and specify the desired number of features to select (e.g., 5 in this case).

Once we have instantiated the RFE object, we can fit it to our training data using the fit method. This will start the recursive feature elimination process. The RFE object will train the logistic regression model on the training data and then eliminate the feature with the smallest coefficient. It will repeat this process iteratively until the desired number of features is reached.

After fitting the RFE object, we can access the selected features using the support_ attribute. This attribute returns a Boolean mask indicating which features were selected. We can also obtain the ranking of the features based on their importance using the ranking_ attribute. The lower the rank, the more important the feature.

In the next step, we can transform our original training data and test data to include only the selected features using the transform method of the RFE object. This will create new feature sets with the selected features only.

Finally, we can train a logistic regression model on the transformed training data and evaluate its performance on the transformed test data. This will allow us to assess the effectiveness of the feature selection process and determine if it improved the model's predictive accuracy.

It's worth noting that the number of features to select and the step size are hyperparameters that can be tuned to find the optimal configuration for a specific dataset and model. Grid search or other hyperparameter optimization techniques can be employed to find the best combination of these parameters.

Overall, recursive feature elimination is a wrapper method for feature selection that relies on training a model and iteratively eliminating the least important features. It can be applied to both regression and classification problems and can be used with different types of models. The selection of features is based on the coefficients or weights assigned to the features by the model. By iteratively removing the least important features, RFE aims to improve model performance by focusing on the most informative features.

 

13.4.2 特征排列重要性(L13:特征选择)


13.4.2 特征排列重要性(L13:特征选择)

欢迎观看本视频,我们将深入探讨排列重要性这一主题。排列重要性是用于特征选择的包装方法的一部分,我们在之前的视频中对此进行了简要讨论。包装方法涉及使用模型来执行特征选择或估计特征重要性。在之前的讲座中,我们探讨了递归特征消除作为包装方法的一个例子。现在,我们将把注意力转移到排列重要性上。在接下来的视频中,我们还将探索另一种称为顺序特征选择的方法。

在深入探讨排列重要性如何工作的具体细节之前,让我简要概述一下该方法。本质上,排列重要性涉及打乱数据集中的每个特征列。然后,使用已经训练好的模型,我们评估模型在混洗数据集上的性能,并将其与原始性能进行比较。通常,当特征列被打乱时,我们会观察到性能下降。这种性能下降可作为该功能重要性的指标。当然,将方法总结为两步似乎有点复杂,因此在接下来的幻灯片中,我将以更详细和更慢的方式向您介绍该过程。

通过对数据集中的每一列应用排列重要性,我们可以生成一个条形图来说明每个特征的重要性。此外,我们可以选择在图中包含重要性值的标准差。在接下来的视频中,我将提供一个代码示例来说明如何创建这样的情节。

现在,在深入研究排列重要性及其背后的算法的详细解释之前,让我们回顾一些值得注意的事实。排列重要性通常会产生与基于杂质的随机森林特征重要性相似的结果。然而,排列重要性的优点是它与模型无关,这意味着它可以与任何类型的机器学习算法或模型一起使用。重要的是要注意,虽然排列重要性严格来说并不是一种特征选择方法,但它确实提供了对模型最依赖的特征的洞察力。因此,我们可以使用特征重要性度量作为选择特征的基础。

如果您还记得我们之前关于随机森林特征重要性的讨论,您可以将排列重要性视为该视频中其中一种方法(特别是方法 B)的概括。但是,排列重要性不是使用袋外样本,而是使用 holdout 集。如果您需要复习现成示例,请随时重温之前的视频。

现在,让我们深入研究排列重要性的分步算法。首先,我们从一个适合训练集的模型开始。该模型可以是任何机器学习模型或算法。例如,让我们考虑一个随机森林分类器。我们在训练集上训练随机森林,这是一个标准步骤。

接下来,我们评估模型在独立数据集(例如验证集或测试集)上的预测性能。我们将此性能记录为基准性能。例如,假设我们使用拟合的随机森林模型在验证集上实现了 99% 的准确率。我们将此视为基准性能。

对于数据集中的每个特征列,我们随机打乱该特定列,同时保持其他列和类标签不变。这个改组过程用一个示例数据集来说明。假设我们有一个包含三个特征列和四个训练示例的数据集。我们专注于洗牌第一列,在示例中用不同的颜色表示。洗牌后,该列中值的顺序发生变化。我们随机排列值,同时保持第二列和第三列中的原始值。

排列重要性的另一个优点是它可以很好地处理相关特征。由于它通过打乱其值来单独评估每个特征的重要性,因此它捕获了每个特征对模型性能的独特贡献,而不管与其他特征的相关性。这在存在具有相互关联特征的高维数据集的情况下特别有用。

排列重要性还提供了一种比某些模型提供的固有特征重要性更可靠的特征重要性度量。例如,在决策树或随机森林中,特征的重要性基于它在拆分数据时实现的杂质减少。但是,此度量可能会偏向于具有许多可能拆分的特征或那些在树结构中看起来更高的特征。排列重要性通过直接评估洗牌每个特征的影响来提供更直接和无偏的特征重要性估计。

不利的一面是,排列重要性的计算成本可能很高,尤其是在模型训练过程非常耗时或具有大量特征的情况下。由于排列过程需要多次重新评估模型的性能,因此会增加大量开销。然而,有一些优化技术和并行化策略可以帮助缓解这个问题,例如使用并行计算或减少排列的数量。

值得注意的是,排列重要性并不是特征选择或模型解释的灵丹妙药。虽然它提供了对个别特征重要性的宝贵见解,但它应该与其他技术和领域知识结合使用。特征重要性本身并不能保证特征的预测能力或相关性。必须考虑上下文、具体问题和模型的局限性。

总之,排列重要性是一种强大且与模型无关的方法,用于评估机器学习模型中特征的重要性。通过打乱特征值并比较打乱前后模型的性能,它提供了特征重要性的可靠度量。它易于理解,可以很好地处理相关特征,并且不易过拟合。但是,它的计算量可能很大,应该与其他技术一起使用以进行全面的特征选择和模型解释。

 

13.4.3 特征排列重要性代码示例(L13:特征选择)


13.4.3 特征排列重要性代码示例(L13:特征选择)

好的,现在我们已经介绍了排列重要性的基本介绍,让我们看一些代码示例,看看我们如何在实践中使用排列重要性。是的,一如既往,我还在视频下方链接了 Jupyter Notebooks 中的代码示例。而且,与往常不同的是,我们将再次使用风数据集,只是为了简单起见。

因此,风数据集也是一个由 13 列组成的数据集。这是前五行的概览。所以一共有三个班,一班,二班,三班。共有 13 列,但由于篇幅限制,此处并未显示所有列。但是,是的,我们不会详细讨论这个风数据集,因为我们之前已经看过很多次了。

是的,然后像往常一样,我们将把数据集分成训练集和测试集。所以在这里,我们正在做的是获取数据集,除了第一列,即标签列。所以我们将把数据集分成训练集和测试集,其中 30% 的数据用于测试,70% 用于相应的训练。请注意,我们没有创建任何验证集。所以这只是我个人的看法。但我认为如果我们计算排列性能,我们不一定需要验证集,因为是的,通常我们应该保持测试集独立。但是如果你回想一下排列性能是如何工作的,根据之前的视频,我们在这里只关注排列特征列时性能的下降。所以我们并没有真正重新计算测试准确性,我们只是使用测试集来查看如果我们对列进行打乱,性能会下降多少。

是的,我们仍处于设置阶段。所以在这张幻灯片中,我们正在准备我们的模型。事实上,这是一个随机森林分类器。所以在之前的视频中,我们了解到排列重要性是一种与模型无关的方法。这意味着我们可以为任何类型的模型计算它。然而,我们在这里使用随机森林,这样我们就可以将排列重要性与随机森林基于杂质的性能进行比较,这可能是一个有趣的比较。所以在这里,我们设置了一个有 100 棵树的随机森林分类器。我们正在将其拟合到训练集中。这里只是精度计算。并且我们可以看到训练准确率是100%,测试准确率也是100%,说明这其实是一个很不错的模型,或者也可以说明这个数据集很容易分类。

我在这里还想指出的一件事是,当我们计算排列重要性时,如果我们想将特征重要性解释为一般特征重要性,那么拥有一个性能非常好的模型是很重要的。因为如果我们没有一个表现良好的模型,我们可能会发现该模型最依赖哪些特征,但它并不能真正告诉我们,比方说,该特征在目标变量的上下文中有多重要如果模型不是很准确。因此,在我们查看排列重要性之前,仅供参考,这里还是基于杂质的重要性。因此,这就是我们已经在之前的视频中讨论过的基于随机森林杂质的重要性。同样,这仅供参考,我们在拟合模型后访问此特征重要性属性。

然后,我们应用 arg_sort,以便我们获得重要性值从大到小的排序顺序。所以,从大到小。然后我们正在做的是创建一个条形图来可视化基于杂质的重要性。条形图将在 x 轴上显示特征名称,在 y 轴上显示相应的重要性值。通过按降序对重要性值进行排序,将首先绘制最重要的特征。

接下来,代码继续计算排列重要性。排列重要性是通过随机打乱测试集中每个特征的值并测量模型性能的下降来计算的。性能下降越大,该功能被认为越重要。该代码使用 for 循环迭代数据集中的每个特征。

在循环内,测试集中的特征值使用 np.random.permutation() 进行混洗。然后,将打乱后的测试集通过训练好的随机森林分类器得到预测标签。使用 accuracy_score() 函数计算模型在混洗测试集上的准确性。原始测试准确率和混洗测试准确率之间的差异表示由排列特征引起的性能下降。

每个特征的性能下降都存储在一个名为 importance_vals 的列表中。遍历所有特征后,importance_vals 列表包含每个特征的性能值下降。

最后,创建条形图以可视化排列重要性。特征名称绘制在 x 轴上,相应的性能值下降绘制在 y 轴上。同样,重要性值按降序排序以突出显示最重要的特征。

此代码提供了基于杂质的重要性和排列重要性之间的比较。通过比较这两个图,您可以观察两种方法在特征重要性排名上是否存在差异。

import matplotlib.pyplot as plt
import numpy as np
from sklearn.ensemble import RandomForestClassifier
from sklearn.datasets import load_iris
from sklearn.metrics import accuracy_score

# Load the Iris dataset
iris = load_iris()
X = iris.data
y = iris.target

# Create a random forest classifier
clf = RandomForestClassifier(n_estimators= 100 , random_state= 42 )
clf.fit(X, y)

# Compute impurity-based feature importances
importances = clf.feature_importances_

# Plot impurity-based feature importances
plt.figure(figsize=( 8 , 6 ))
plt.bar(range(X.shape[ 1 ]), importances, align= 'center' )
plt.xticks(range(X.shape[ 1 ]), iris.feature_names, rotation= 90 )
plt.xlabel( 'Features' )
plt.ylabel( 'Importance' )
plt.title( 'Impurity-based Feature Importances' )
plt.show()

# Compute permutation importances
importance_vals = []
for feature in range(X.shape[ 1 ]):
    X_permuted = X.copy()
    np.random.shuffle(X_permuted[:, feature])
    y_pred = clf.predict(X_permuted)
    accuracy = accuracy_score(y, y_pred)
    drop_in_performance = accuracy_score(y, y_pred) - accuracy
    importance_vals.append(drop_in_performance)

# Plot permutation importances
plt.figure(figsize=( 8 , 6 ))
plt.bar(range(X.shape[ 1 ]), importance_vals, align= 'center' )
plt.xticks(range(X.shape[ 1 ]), iris.feature_names, rotation= 90 )
plt.xlabel( 'Features' )
plt.ylabel( 'Drop in Performance' )
plt.title( 'Permutation Importances' )
plt.show()
此代码将并排创建两个条形图。第一个图将显示基于杂质的特征重要性,第二个图将显示排列重要性。通过检查这些图,您可以根据这两种方法深入了解 Iris 数据集中不同特征的相对重要性。

确保已导入必要的库,例如 matplotlib、numpy、sklearn.ensemble.RandomForestClassifier、sklearn.datasets.load_iris 和 sklearn.metrics.accuracy_score。

import matplotlib.pyplot as plt
import numpy as np
from sklearn.ensemble import RandomForestClassifier
from sklearn.datasets import load_iris
from sklearn.inspection import permutation_importance
from sklearn.model_selection import train_test_split

# Load the Iris dataset
iris = load_iris()
X = iris.data
y = iris.target

# Split the data into training and testing sets
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size= 0.2 , random_state= 42 )

# Create a random forest classifier
clf = RandomForestClassifier(n_estimators= 100 , random_state= 42 )
clf.fit(X_train, y_train)

# Perform permutation importances
result = permutation_importance(clf, X_test, y_test, n_repeats= 10 , random_state= 42 , n_jobs=- 1 )

# Get the feature importances and their indices
importances = result.importances_mean
indices = np.argsort(importances)

# Plot permutation importances
plt.figure(figsize=( 8 , 6 ))
plt.barh(range(X.shape[ 1 ]), importances[indices], align= 'center' )
plt.yticks(range(X.shape[ 1 ]), iris.feature_names[indices])
plt.xlabel( 'Importance' )
plt.ylabel( 'Features' )
plt.title( 'Permutation Importances' )
plt.show()
在这段代码中,我们使用 sklearn.inspection 模块中的 permutation_importance 函数来计算排列重要性。使用 train_test_split 将数据集拆分为训练集和测试集。然后,我们在训练数据上拟合一个随机森林分类器,并使用测试数据计算排列重要性。

生成的排列重要性存储在重要性变量中。我们使用 np.argsort 来获取将按升序对重要性进行排序的索引。这有助于以正确的顺序绘制重要性。

最后,我们使用 plt.barh 创建一个水平条形图来显示排列重要性。 y 轴表示特征,而 x 轴表示重要性值。 plt.xlabel、plt.ylabel 和 plt.title 函数用于向绘图添加标签和标题。

请确保已导入必要的库,例如 matplotlib、numpy、sklearn.ensemble.RandomForestClassifier、sklearn.datasets.load_iris、sklearn.inspection.permutation_importance 和 sklearn.model_selection.train_test_split。

import matplotlib.pyplot as plt
import numpy as np
from sklearn.ensemble import RandomForestClassifier
from sklearn.datasets import load_iris
from sklearn.inspection import permutation_importance
from sklearn.model_selection import train_test_split

# Load the Iris dataset
iris = load_iris()
X = iris.data
y = iris.target

# Split the data into training and testing sets
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size= 0.2 , random_state= 42 )

# Create a random forest classifier
clf = RandomForestClassifier(n_estimators= 100 , random_state= 42 )
clf.fit(X_train, y_train)

# Perform permutation importances
result = permutation_importance(clf, X_test, y_test, n_repeats= 10 , random_state= 42 , n_jobs=- 1 )

# Get the feature importances and their indices
importances = result.importances_mean
indices = np.argsort(importances)

# Plot permutation importances
plt.figure(figsize=( 8 , 6 ))
plt.barh(range(X.shape[ 1 ]), importances[indices], align= 'center' )
plt.yticks(range(X.shape[ 1 ]), iris.feature_names[indices])
plt.xlabel( 'Importance' )
plt.ylabel( 'Features' )
plt.title( 'Permutation Importances' )
plt.show()
在这段代码中,我们使用 sklearn.inspection 模块中的 permutation_importance 函数来计算排列重要性。使用 train_test_split 将数据集拆分为训练集和测试集。然后,我们在训练数据上拟合一个随机森林分类器,并使用测试数据计算排列重要性。

生成的排列重要性存储在重要性变量中。我们使用 np.argsort 来获取将按升序对重要性进行排序的索引。这有助于以正确的顺序绘制重要性。

最后,我们使用 plt.barh 创建一个水平条形图来显示排列重要性。 y 轴表示特征,而 x 轴表示重要性值。 plt.xlabel、plt.ylabel 和 plt.title 函数用于向绘图添加标签和标题。

确保已导入必要的库,例如 matplotlib、numpy、sklearn.ensemble.RandomForestClassifier、sklearn.datasets.load_iris、sklearn.inspection.permutation_importance 和 sklearn.model_selection.train_test_split。

 

13.4.4 顺序特征选择(L13:特征选择)


13.4.4 顺序特征选择(L13:特征选择)

在之前的视频中,我使用排列重要性作为我最喜欢的技术介绍了特征重要性的概念。在本视频中,我想讨论另一种称为顺序特征选择的重要技术,它也是我们之前谈到的包装方法的一部分。

在深入研究顺序特征选择之前,让我们简要回顾一下到目前为止我们讨论过的不同类型的特征选择方法。我们从过滤器方法开始,然后转向嵌入式方法,如递归特征消除,现在我们专注于包装器方法。

包装方法旨在通过尝试所有可能的特征组合来找到最佳特征子集。这种方法被称为穷举特征选择。为了理解它是如何工作的,让我们考虑鸢尾花数据集的例子,它有四个特征:萼片长度、萼片宽度、花瓣长度和花瓣宽度。为了找到我们模型的最佳特征组合,我们需要尝试所有可能的子集,从单个特征到完整特征集。

对于 Iris 数据集,这将产生 15 种可能的组合,包括一个、两个、三个和四个特征的子集。然而,详尽的特征选择可能在计算上很昂贵并且容易过度拟合。为了缓解这些问题,我们可以使用验证集或 K 折交叉验证来评估不同特征子集的性能。

尽管它很简单,但当应用于具有大量特征的数据集时,详尽的特征选择具有局限性。可能的特征子集的数量随着特征的数量呈指数增长,这使得它对于大型数据集不切实际。这种限制激发了顺序特征选择的使用,这是一种探索特征组合子集而不是评估所有可能组合的近似技术。

顺序特征选择是一个迭代过程,从原始特征集开始,根据特征的性能逐渐选择或删除特征。一种流行的方法是顺序向后选择,我们从完整的特征集开始,一次迭代地删除一个特征。在每次迭代中,我们评估剩余特征的性能并选择具有最高性能的子集。这个过程一直持续到我们有一个只剩下一个特征的子集。

顺序向后选择算法可以总结如下:

  1. 从原始功能集开始。
  2. 通过一次删除一个特征来生成所有可能的大小为 n-1 的特征子集。
  3. 评估每个候选子集的性能。
  4. 选择具有最高性能的子集并永久删除该子集中不存在的特征。
  5. 重复步骤 2-4,直到达到所需的特征尺寸(例如,只剩下一个特征)。

通过重复步骤 2-4,我们逐渐减少特征集,直到达到最佳子集。最终子集是根据最高评估分数选择的,如果出现平局,则较小的子集是计算效率的首选。顺序向后选择中的迭代次数等于特征数减一。

顺序前向选择是顺序特征选择的另一种变体。顺序向前选择不是删除特征,而是从一个空特征集开始,然后逐渐一次添加一个特征。该过程涉及在每个单独的特征上训练分类器并评估其性能。选择具有最高性能的特征并将其添加到子集中。此过程一直持续到达到最大特征数为止。

总之,顺序特征选择是一种用于寻找最佳特征子集的有用技术。它提供了计算效率和寻找良好特征组合之间的权衡。顺序向后选择和顺序向前选择是顺序特征选择的两种常见变体,每种都有自己的优势和用例。在下一个视频中,我们将探索如何以编程方式实现顺序特征选择并解决穷举特征选择的局限性。

 

13.4.5 顺序特征选择——代码示例(L13:特征选择)


13.4.5 顺序特征选择——代码示例(L13:特征选择)

好了,是时候结束我们关于特征选择的讨论了。在本视频中,我将演示如何在 Python 中使用顺序特征选择。我将首先向您展示一个使用 MLxtend 库的示例,这是我几年前开发的原始实现。稍后,我还将演示如何使用 scikit-learn 实现相同的结果,它提供了更简化的实现。

在我们深入研究代码之前,我鼓励您查看文档,其中包含我不会在本视频中介绍的其他示例,以免使视频过于冗长和难以理解。参考文档以获得更深入的信息总是有帮助的。

首先,让我们开始加载我开发的“水印”插件,用于跟踪多年来我的笔记本和软件库的版本。确保版本号符合我们的预期是一个很好的做法,尤其是当某些选项可能由于版本差异而不再起作用时。稍后我们还将使用 matplotlib 库,因此让我们导入它以确保绘图在笔记本中正确显示。

现在,让我们继续为特征选择准备数据集。与之前的视频一样,我们将使用 wine 数据集。我们使用 Pandas 从 UCI 机器学习数据集存储库加载数据集。加载数据集后,我们打印出一些基本信息以确保所有内容都正确加载。检查类标签是否表示为整数也很重要。

接下来,我们将数据集分为训练集和测试集,就像我们在之前的视频中所做的那样。此外,我们对数据集进行了标准化,因为我们将使用对特征缩放敏感的 K 最近邻分类器。我们将数据集分为 80% 的训练集和 20% 的测试集,并对两组进行标准化。

为了在特征选择之前建立基线,我们在标准化数据集上安装了一个 K 最近邻分类器,并计算了训练和测试精度。在这个例子中,我们为分类器任意选择了五个邻居,但是这个参数可以进行网格搜索以获得最佳性能。虽然我们不会在这里执行网格搜索以使代码和视频更简单,但将网格搜索与顺序特征选择相结合是一种常见的方法。您可以在文档中找到这方面的示例。

基线结果表明,我们在训练集上达到了 98.6% 的准确率,在测试集上达到了 94% 的准确率。使用 wine 数据集中的所有 13 个特征,性能非常好。然而,由于与 K 最近邻分类器相关的维数灾难,可能会出现一些过度拟合。为了缓解这种情况,我们可以选择较小的功能子集来潜在地提高性能。

现在,让我们演示如何使用顺序特征选择来选择五个特征的子集。我们从 MLxtend 库中导入 SequentialFeatureSelector 类,为了方便起见,将导入名称缩短为 sfs。该类将模型、所需的特征子集大小和选择方向(向前、向后、浮动)作为输入。我们将方向设置为向前以进行顺序向前选择。 verbose 参数允许我们控制训练期间显示的输出量,这对于监控进度很有用。我们将评分指标指定为准确性,并使用 5 折交叉验证来评估特征子集。可以通过将 n_jobs 参数设置为正整数或 -1 来启用并行处理以利用所有可用的 CPU 内核。在这种情况下,我们将其设置为 8 以加快执行速度。

输出显示特征选择过程的进度,从一个特征开始,逐渐增加特征数量,直到达到所需的五个子集大小。还会显示每个功能子集的性能,表明随着添加更多功能而有所改进。

完成后,我们可以分别使用 sfs 对象的 k_feature_idx_ 和 k_feature_names_ 属性访问选定的特征索引和相应的特征名称。此外,我们可以使用 k_score_ 属性访问特征子集的性能历史记录。让我们打印出选定的特征索引、名称及其相应的分数:

print( 'Selected feature indices:' , sfs.k_feature_idx_)
print( 'Selected feature names:' , sfs.k_feature_names_)
print( 'Selected feature scores:' , sfs.k_score_)

输出将显示所选五个特征的索引、名称和分数。

接下来,我们可以在选定的特征子集上重新训练 K 最近邻分类器。为此,我们需要创建一个只包含所选特征的新训练和测试集。我们可以使用 sfs 对象的 transform 方法将原始数据集转换到新的特征空间:

X_train_selected = sfs.transform(X_train)
X_test_selected = sfs.transform(X_test)
转换数据集后,我们可以在选定的特征子集上拟合一个新的 K 最近邻分类器,并计算训练和测试精度。让我们打印出结果:

knn_selected = KNeighborsClassifier(n_neighbors= 5 )
knn_selected.fit(X_train_selected, y_train)

train_acc_selected = knn_selected.score(X_train_selected, y_train)
test_acc_selected = knn_selected.score(X_test_selected, y_test)

print( 'Training accuracy on selected features:' , train_acc_selected)
print( 'Test accuracy on selected features:' , test_acc_selected)
输出将显示仅使用选定的五个特征实现的训练和测试精度。

通过将结果与基线精度进行比较,我们可以评估特征选择对分类器性能的影响。在某些情况下,特征选择可以通过减少过度拟合和移除不相关或冗余的特征来实现更好的泛化和改进的模型性能。

这就是使用 MLxtend 库的演示。现在,让我们继续使用 scikit-learn 进行顺序特征选择。

在 scikit-learn 中,SequentialFeatureSelector 类在 feature_selection 模块中可用。我们按如下方式导入它:

from sklearn.feature_selection import SequentialFeatureSelector
scikit-learn 版本的用法与 MLxtend 版本类似,但在参数名称和属性访问方面有一些细微差别。 scikit-learn 版本还在使用不同的特征选择算法和评分指标方面提供了更大的灵活性。

我希望这个演示可以帮助您了解如何在 Python 中使用顺序特征选择。请记住参考文档以获取更多示例和信息。

原因: