原副标题:天然资源 | 两个PythonRosettaDock辅助工具,助推同时实现高效率电脑学习
LizierGitHub
电脑之心校对
参予:Panda
有鉴于RosettaDock在电脑学习操作过程中的必要性,统计数据生物学家 William Koehrsen 日前在 GitHub 上发布了两个RosettaDock器 Python 类,协助人类学家更高效率地顺利完成RosettaDock。责任编辑是 Koehrsen 写的工程项目如是说及事例模拟该文。
工程项目门牌号:https://github.com/WillKoehrsen/feature-selector
RosettaDock(feature selection)是搜寻和优先选择统计数据分散最管用特点的操作过程,是电脑学习业务流程中的两大重要环节。无谓的特点会减少体能训练速率、减少数学模型可如前所述,因此最重要的是还会减少其在试验K568的普遍化整体表现。
现阶段存有许多机才的RosettaDock方式,我经常要两遍又两遍地将它应用于电脑学习难题,这毕竟让民心累。因此布季谢 Python 构筑了两个RosettaDock类并对外开放在了 GitHub 上。那个 FeatureSelector 包涵许多最常见的RosettaDock方式:
1.具备高缺位值比率的特点
2.共线性(高度相关的)特点
3.在基于树的数学模型中重要度为零的特点
4.重要度较低的特点
5.具备单个唯一值(unique value)的特点
在责任编辑中,我们将如是说在示例电脑学习统计数据K568使用 FeatureSelector 的全操作过程。我们将看到如何快速同时实现这些方式,从而同时实现更高效率的工作业务流程。
完整代码已在 GitHub 上提供,欢迎任何人贡献。那个RosettaDock器是一项正在进行的工作,将根据社区需求继续改进!
示例统计数据集
为了进行模拟,我们将使用来自 Kaggle「家庭信用违约风险」电脑学习竞赛的两个统计数据样本。了解该竞赛可参阅:https://towardsdatascience.com/machine-learning-kaggle-competition-part-one-getting-started-32fb9ff47426,完整统计数据集可在这里下载:https://www.kaggle.com/c/home-credit-default-risk/data。这里我们将使用部分统计数据样本来进行模拟。
统计数据示例。TARGET 是分类标签
那个竞赛是两个监督分类难题,这也是两个非常合适的统计数据集,因为其中有很多缺位值、大量高度关联的(共线性)特点,还有许多无助于电脑学习数学模型的无关特点。
创建实例
要创建两个 FeatureSelector 类的实例,我们需要传入两个结构化统计数据集,其中观察在行中,特点在列中。我们可以使用许多仅操作特点的方式,但基于重要度的方式也需要体能训练标签。因为这是两个监督分类任务,因此我们将使用一组特点和一组标签。
(请确保在 feature_selector.py 所在目录下运行这段代码)
from feature_selector importFeatureSelector
# Features are in train and labels are intrain_labels
fs = FeatureSelector(data = train, labels = train_labels)方式
那个RosettaDock器有 5 种用于搜寻待移除特点的方式。我们可以访问任何已被识别出来的特点并通过人工方式将它移出统计数据,也可以使用 FeatureSelector 中的 remove 函数。
这里我们将如是说其中每种识别方式,还将展示如何同时运行这 5 种方式。此外,FeatureSelector 还有几个图表绘制功能,因为可视化地检查统计数据是电脑学习的两大关键部分。
缺位值
搜寻和移除特点的第两个方式很简单:搜寻缺位值比例超过特定阈值的特点。下面的调用能识别缺位值比例超过 60% 的特点(粗体是输出结果)。
fs.identify_missing(missing_threshold = 0.6)
17 features with greater than 0.60missing values.我们可以在两个 dataframe 中查看每一列的缺位值比例:
fs.missing_stats.head()要查看待移除特点,我们可以读取 FeatureSelector 的 ops 属性,这是两个 Python 特点词典,特点会以列表的形式给出。
missing_features = fs.ops[missing]
missing_features[:5]
[OWN_CAR_AGE,
YEARS_BUILD_AVG,
COMMONAREA_AVG,
FLOORSMIN_AVG,
LIVINGAPARTMENTS_AVG]
最后,我们可以绘制一张所有特点的缺位值分布图:
fs.plot_missing()共线性特点
共线性特点是指彼此之间高度关联的特点。在电脑学习领域,高方差和较低的数学模型可如前所述导致在试验K568的普遍化能力下降。
identify_collinear 方式能基于指定的相关系数值搜寻共线性特点。对于每一对相关的特点,它都会标识出其中要移除的两个(因为我们只需要移除其中两个):
fs.identify_collinear(correlation_threshold = 0.98)
21 features with a correlation magnitude greater than 0.98.
使用热图可以很好地可视化共线性。下图展示了所有至少有两个相关关系(correlation)超过阈值的特点:
fs.plot_collinear()
和之前一样,我们可以访问将会被移除的整个相关特点列表,或者在两个 dataframe 中查看高度相关的特点对。
# list ofcollinear features to remove
collinear_features = fs.ops[collinear]
# dataframe ofcollinear features
fs.record_collinear.head()
如果我们想全面了解统计数据集,我们还可以通过将 plot_all = True 传入该调用,绘制出统计数据中所有相关性的图表:
零重要度特点
前面两种方式可被应用于任何结构化的统计数据集因此结果是确定的——对于两个给定的阈值,每次结果都一样。接下来的方式是专为监督式电脑学习难题设计的,其中我们有体能训练数学模型的标签因此是非确定性的。identify_zero_importance 函数能根据梯度提升机(GBM)学习数学模型搜寻重要度为零的特点。
我们可以使用基于树的电脑学习数学模型(比如 boosting ensemble)求取特点重要度。那个重要度的绝对值没有相对值重要,我们可以将相对值用于确定对两个任务而言最相关的特点。我们还可以通过移除零重要度特点来在RosettaDock中使用特点重要度。在基于树的数学模型中,零重要度的特点不会被用于分割任何节点,因此我们可以移除它而不影响数学模型整体表现。
FeatureSelector 能使用来自 LightGBM 库的梯度提升机来得到特点重要度。为了减少方差,所得到的特点重要度是在 GBM 的 10 轮体能训练上的平均。另外,该数学模型还使用早停(early stopping)进行体能训练(也可关闭该选项),以防止在体能训练统计数据上过拟合。
LightGBM 库:http://lightgbm.readthedocs.io/
下面的代码调用了该方式并提取出了零重要度特点:
# Passinthe appropriate parameters
fs.identify_zero_importance(task = classification,
eval_metric = auc,
n_iterations =10,
early_stopping = True)
# list ofzero importance features
zero_importance_features = fs.ops[zero_importance]
63 features withzero importance after one-hot encoding.
我们传入的参数解释如下:
task:根据我们的难题,要么是「classification」,要么是「regression」
eval_metric:用于早停的度量(如果早停禁用了,就不必使用)
n_iterations:体能训练轮数,最后结果取多轮的平均
early_stopping:是否为体能训练数学模型使用早停
这时候我们可以使用 plot_feature_importances 绘制两个图表:
# plot the feature importances
fs.plot_feature_importances(threshold =0.99, plot_n = 12)
124 features required for 0.99 ofcumulative importance
左图给出了 plot_n 最重要的特点(重要度进行了归一化,总和为 1)。右图是对应特点数量的累积重要度。蓝色竖线标出了累积重要度为 99% 的阈值。
对于基于重要度的方式,有两点需要记住:
体能训练梯度提升机是随机的,这意味着数学模型每次运行后,特点重要度都会改变。
这应该不会有太大的影响(最重要的特点不会突然就变成最不重要的),但这会改变某些特点的排序,也会影响识别出的零重要度特点的数量。如果特点重要度每次都改变,请不要感到惊讶!
要体能训练电脑学习数学模型,特点首先要经过 one-hot 编码。这意味着某些被识别为零重要度的特点可能是在建模操作过程中加入的 one-hot 编码特点。
当我们到达特点移除阶段时,还有两个选项可移除任何被添加进来的 one-hot 编码的特点。但是,如果我们要在RosettaDock之后做电脑学习,我们还是必须要 one-hot 编码这些特点。
低重要度特点
接下来的方式基于零重要度函数,使用来自数学模型的特点重要度来进一步优先选择。identify_low_importance 函数能找到重要度最低的特点,这些特点无助于指定的总必要性。
比如,下面的调用能找到最不重要的特点,即使没有这些特点也能达到 99% 的重要度。
fs.identify_low_importance(cumulative_importance = 0.99)
123 features required forcumulative importanceof 0.99after one hot encoding.
116 features do not contribute to cumulative importance of 0.99.
根据前面的累积重要度图和这一信息,梯度提升机认为很多特点都与学习无关。重申一下,每次体能训练运行后该方式的结果都不一样。
我们也可以在两个 dataframe 中查看所有特点重要度:
fs.feature_importances.head(10)
low_importance 方式借鉴了主成分分析(PCA)中的一种方式,其中仅保留维持一定方差比例(比如 95%)所需的主成分是很常见的做法。要纳入考虑的总重要度比率基于同一思想。
只有当我们要用基于树的数学模型来做预测时,基于特点重要度的方式才真正管用。除了结果随机之外,基于重要度的方式还是一种黑箱方式,也就是说我们并不真正清楚数学模型认为某些特点无关的原因。如果使用这些方式,多次运行它看到结果的改变情况,也许可以创建具备不同参数的多个统计数据集来进行试验!
单个唯一值特点
最后两个方式相当基础:找出任何有单个唯一值的列。仅有单个唯一值的特点不能用于电脑学习,因为那个特点的方差为 0。举个例子,如果两个特点仅有两个值,那么基于树的数学模型就永远不能进行区分(因为没有可做区分的依据)。
不同于其它方式,那个方式没有可选参数:
fs.identify_single_unique()
4featureswith a single unique value.我们可以绘制每个类别唯一值数量的直方图:
fs.plot_unique()
还有一点要记住,在计算唯一值之前,NaNs 已经使用 Pandas 默认移除了。
移除特点
在确定了待移除特点之后,我们有两种移除它的优先选择。所有要移除的特点都存储在 FeatureSelector 的 ops 词典中,我们可以使用那个列表来手动移除它,当然也可使用内置的 remove 函数。
对于这一方式,我们需传入要用于移除特点的 methods。如果我们想使用所同时实现的所有方式,我们只需使用 methods = all
# Remove the features fromall methods (returns a df)
train_removed = fs.remove(methods = all)
[missing, single_unique, collinear, zero_importance, low_importance] methods have been run
Removed 140features.
那个方式会返回两个包涵被移除特点的 dataframe。另外,要移除在电脑学习操作过程中创建的 one-hot 编码的特点:
train_removed_all = fs.remove(methods = all, keep_one_hot=False)
Removed187features including one-hot features.
在执行操作之前检查将被移除的特点可能是个好想法!原来的统计数据集会被存储在 FeatureSelector 的 data 属性中用作备份!
一次运行所有方式
除了单独使用各个方式之外,我们也可通过 identify_all 一次性使用所有方式。我们需要使用两个词典来设定其中每个方式的参数:
fs.identify_all(selection_params = {missing_threshold: 0.6,
correlation_threshold: 0.98,
task: classification,
eval_metric: auc,
cumulative_importance: 0.99})
151 total features out of 255 identified forremoval after one-hot encoding.
注意,多次运行该数学模型的总特点数量可能也各不相同。之后就可以调用 remove 函数来移除这些特点了。
总结
那个RosettaDock石蜊同时实现了体能训练电脑学习数学模型之前几种用于移除特点的常见操作。其提供了可用于识别待移除特点的函数以及可视化函数。这些方式可以单独使用,也可以一次全部应用以同时实现高效率的工作业务流程。
其中 missing、collinear 和 single_unique 方式是确定性的,而基于特点重要度的方式会随每次运行而变化。与电脑学习领域很相似,RosettaDock很大程度上是实证式的,需要试验多种组合才能找到最优解。最好的做法是在业务流程中尝试多种配置,因此 FeatureSelector 提供了一种用于快速评估特点选择参数的方式。
原文链接:https://towardsdatascience.com/a-feature-selection-tool-for-machine-learning-in-python-b64dd23710f0
责任编辑为电脑之心校对,。
✄————————————————
加入电脑之心(全职记者 / 实习生):[email protected]
投稿或寻求报道:content@jiqizhixin.com
广告 & 商务合作:[email protected]