原文:
www.kdnuggets.com/2019/08/feature-selection-random-search-python.html
由吉安卢卡·马拉托,数据科学家、小说作者和软件开发者。
1. 谷歌网络安全证书 - 快速进入网络安全职业的快车道
2. 谷歌数据分析专业证书 - 提升你的数据分析水平
3. 谷歌 IT 支持专业证书 - 支持你的组织在 IT 方面
特征选择一直是机器学习中的一项重要任务。根据我的经验,我可以肯定地说,特征选择比模型选择更为重要。
我已经写了一篇关于特征选择的文章。这是一种无监督的方式来测量二分类模型中特征的重要性,使用了皮尔逊卡方检验和相关系数。
一般来说,无监督的方法通常足以用于简单的特征选择。然而,每个模型都有自己独特的方式来“思考”特征以及处理特征与目标变量的相关性。此外,有些模型不太关心多重共线性(即特征之间的相关性),而有些模型在发生这种情况时会显示出非常大的问题(例如线性模型)。
尽管可以通过模型引入的一些相关性指标来排序特征(例如,对线性回归系数执行的 t 检验的 p 值),但仅仅选择最相关的变量可能还不够。想象一下一个特征,它等于另一个特征,只是乘以二。这些特征之间的线性相关性为 1,这种简单的乘法不会影响与目标变量的相关性,因此如果我们只选择最相关的变量,我们将得到原始特征和被乘以二的特征。这会导致多重共线性,这对我们的模型可能非常危险。
这就是为什么我们必须引入某种方法来更好地选择特征。
随机搜索是数据科学家工具箱中的一个非常有用的工具。这是一种非常简单的技术,通常用于交叉验证和超参数优化等场景。
这非常简单。如果你有一个多维网格并且想在这个网格上寻找一个最大化(或最小化)某个目标函数的点,随机搜索的工作原理如下:
-
在网格上取一个随机点并测量目标函数值。
-
如果该值优于迄今为止取得的最佳值,则将该点保存在内存中。
-
重复一个预定义的次数。
就这样。只需生成随机点并寻找最佳点。
这是一种找到全局最小值(或最大值)的好方法吗?当然不是。我们所寻找的点只有一个(如果我们运气好的话),在一个非常大的空间中,而且我们只有有限的迭代次数。在一个N点网格中获取该单个点的概率是1/N。
那么,为什么随机搜索如此常用?因为我们并不真正想要最大化我们的性能指标;我们想要一个好的、合理高的值,它不是最高的值,以避免过拟合。
这就是为什么随机搜索有效,并且可以用于特征选择的原因。
随机搜索可以用于特征选择,效果相当好。类似于随机搜索的一个例子是随机森林模型,它对每棵树进行特征的随机选择。
这个想法很简单:随机选择特征,通过k 折交叉验证来测量模型性能,并重复多次。给出最佳性能的特征组合就是我们所寻找的。
更准确地说,以下是需要遵循的步骤:
-
生成一个随机整数N,范围在 1 到特征数量之间。
-
生成一个随机的N整数序列,范围在 0 到N-1之间,且不重复。这个序列表示我们的特征数组。请记住,Python 数组是从 0 开始的。
-
在这些特征上训练模型,并使用 k 折交叉验证进行交叉验证,保存某些性能指标的平均值。
-
从第 1 点开始重复,次数可以随意。
-
最后,获取根据所选择的性能指标提供最佳性能的特征数组。
对于这个示例,我将使用乳腺癌数据集,它包含在sklearn模块中。我们的模型将是逻辑回归,并且我们将使用准确率作为性能指标进行 5 折交叉验证。
首先,我们必须导入必要的模块。
import sklearn.datasets
from sklearn.linear_model import LogisticRegression
from sklearn.model_selection import cross_val_score
import numpy as np
然后我们可以导入乳腺癌数据并将其拆分为输入和目标。
dataset= sklearn.datasets.load_breast_cancer()
data = dataset.data
target = dataset.target
现在,我们可以创建一个逻辑回归对象。
lr = LogisticRegression()
然后,我们可以在 k 折交叉验证中测量所有特征的平均准确率。
# Model accuracy using all the features
np.mean(cross_val_score(lr,data,target,cv=5,scoring="accuracy"))
# 0.9509041939207385
这是 95%。我们要记住这一点。
现在,我们可以实现一个例如 300 次迭代的随机搜索。
result = []
# Number of iterations
N_search = 300
# Random seed initialization
np.random.seed(1)
for i in range(N_search):
# Generate a random number of features
N_columns = list(np.random.choice(range(data.shape[1]),1)+1)
# Given the number of features, generate features without replacement
columns = list(np.random.choice(range(data.shape[1]), N_columns, replace=False))
# Perform k-fold cross validation
scores = cross_val_score(lr,data[:,columns], target, cv=5, scoring="accuracy")
# Store the result
result.append({'columns':columns,'performance':np.mean(scores)})
# Sort the result array in descending order for performance measure
result.sort(key=lambda x : -x['performance'])
在循环和排序函数结束时,result列表的第一个元素就是我们所寻找的对象。
我们可以使用这个值来计算该特征子集的新性能指标。
np.mean(cross_val_score(lr, data[:,result[0][‘columns’]], target, cv=5, scoring=”accuracy”))
# 0.9526741054251634
如你所见,准确率有所提高。
随机搜索可以成为执行特征选择的强大工具。它并不是用来解释某些特征为何比其他特征更有用(与递归特征消除等其他特征选择程序相对),但它可以作为一个有用的工具,以更少的时间获得良好的结果。
原文。经许可转载。
相关: