2020-05-04

2020-05-04  本文已影响0人  十二支箭

介绍

在本练习中,您将使用一些特征选择算法来改进模型。有些方法需要一些时间才能运行,因此您将编写函数并验证它们是否适用于小样本。

要开始,只需运行以下单元格。运行大约需要一分钟。

基准分数

让我们看看到目前为止我们所有功能的基线得分。

1)哪些数据用于特征选择?

由于许多特征选择方法需要从数据集中计算统计信息,因此您是否应将所有数据用于特征选择?

确定答案后,运行以下行。

解决方案:在功能选择中包含验证和测试数据是泄漏的根源。您只想在训练集中执行特征选择,然后使用那里的结果从验证和测试集中删除特征。

现在,我们有91个用于预测的功能。使用所有这些功能,模型很有可能会过度拟合数据。我们也许可以通过删除某些功能来减少过度拟合的情况。当然,模型的性能可能会降低。但是至少我们会在不损失很多性能的情况下使模型更小,更快。

2)单变量特征选择

在下面,将SelectKBest与f_classif评分功能一起使用,以从数据的91个特征中选择40个特征。

提示:使用f_classif作为评分函数,使用SelectKBest创建选择器。 .fit_transform方法将返回保留了最佳功能的数组。但是,它不会保留列名,因此您需要将其取回。最简单的方法是使用selector.inverse_transform(X_new)返回具有与原始特征相同形状但将删除的列清零的数组。由此,您可以构建一个具有与原始功能相同的索引和列的DataFrame。在这里,您可以通过找到所有方差为零的列来查找被删除列的名称。

3)K的最佳值

通过这种方法,我们可以选择最佳的K特征,但我们仍然必须自己选择K。您如何找到K的“最佳”值?也就是说,您希望它很小,以便保留最佳功能,但又不能太小,以至于降低了模型的性能。

确定答案后,运行以下行。

解决方案:要找到最佳的K值,可以将K的值增加来拟合多个模型,然后选择验证分数高于某个阈值或其他条件的最小K。做到这一点的一种好方法是对K值进行循环并记录每次迭代的验证分数。

4)使用L1正则化进行特征选择

现在尝试使用L1正则化的更强大方法。实现一个函数select_features_l1,该函数返回要保留的功能列表。

使用具有L1罚分的LogisticRegression分类器模型来选择要素。对于模型,将随机状态设置为7,将正则化参数设置为0.1。拟合模型,然后使用SelectFromModel返回具有选定特征的模型。

检查代码将对数据集中的样本运行您的函数,以提供更多即时反馈。

提示:首先拟合逻辑回归模型,然后将其传递给SelectFromModel。那应该为您提供具有选定特征的模型,您可以使用X_new = model.transform(X)获得选定特征。但是,这遗漏了列标签,因此您需要将其取回。最简单的方法是使用model.inverse_transform(X_new)取回原始X数组,并将删除的列全为零。然后,您可以使用索引和X列创建一个新的DataFrame。从那里,保留不全为零的列。

5)使用树进行特征选择

由于我们使用的是基于树的模型,因此使用另一个基于树的模型进行特征选择可能会产生更好的结果。使用树分类器选择要素有什么不同?

确定答案后,运行以下行。

解决方案:您可以使用RandomForestClassifier或ExtraTreesClassifier之类的功能来查找功能的重要性。 SelectFromModel可以使用功能重要性来查找最佳功能。

6)具有L1正则化的前K个功能

在这里,您设置了正则化参数C = 0.1,这导致某些功能被删除。但是,通过设置C,您将无法选择要保留的特定数量的功能。您将如何使用L1正则化来保持最重要的K个重要功能?

确定答案后,运行以下行。

#检查您的答案(运行此代码单元即可获得积分!)

q_6.solution()

解决方案:要选择具有L1正则化功能的特定数量的特征,您需要找到保留所需特征数量的正则化参数。为此,您可以从低到高遍历具有不同正则化参数的模型,然后选择保留K个特征的模型。注意,对于scikit学习模型,C是正则化强度的倒数。

上一篇下一篇

猜你喜欢

热点阅读