用于训练机器学习模型的数据特征对您能达到的性能有着巨大影响。
不相关或部分相关的特征可能对模型性能产生负面影响。
在这篇文章中,您将发现可用于使用 scikit-learn 在 Python 中准备机器学习数据的自动特征选择技术。
通过我的新书《使用 Python 进行机器学习》来启动您的项目,其中包括分步教程和所有示例的 Python 源代码文件。
让我们开始吧。
- 2016 年 12 月更新:修复了 RFE 部分关于所选变量的打字错误。
- 2018 年 3 月更新:添加了下载数据集的备用链接。
- 2019 年 9 月更新:修复了代码以兼容 Python 3。
- 2019 年 12 月更新:更新了单变量选择以使用 ANOVA。

Python 中的机器学习特征选择
照片由 Baptiste Lafontaine 拍摄,保留部分权利。
特征选择
特征选择是一个过程,在此过程中,您会自动选择数据中对您感兴趣的预测变量或输出贡献最大的特征。
数据中存在不相关的特征可能会降低许多模型的准确性,特别是线性算法,如线性回归和逻辑回归。
在建模数据之前执行特征选择有三个好处:
- 减少过拟合:冗余数据越少意味着基于噪声做出决策的机会越少。
- 提高准确性:误导性数据越少意味着建模准确性越高。
- 缩短训练时间:数据越少意味着算法训练速度越快。
您可以在文章《特征选择》中了解更多关于 scikit-learn 中的特征选择。
需要 Python 机器学习方面的帮助吗?
参加我为期 2 周的免费电子邮件课程,探索数据准备、算法等等(附带代码)。
立即点击注册,还将免费获得本课程的 PDF 电子书版本。
机器学习的特征选择
本节列出了 4 种用于 Python 机器学习的特征选择方法。
这篇帖子包含了特征选择方法的秘诀。
每个秘诀都设计为完整且独立的,因此您可以直接复制粘贴到您的项目中并立即使用。
这些秘诀使用 Pima Indian 糖尿病发病数据集来演示特征选择方法。这是一个二元分类问题,所有属性都是数值型的。
1. 单变量选择
统计测试可以用于选择那些与输出变量关系最强的特征。
scikit-learn 库提供了 SelectKBest 类,可与一套不同的统计测试一起使用,以选择特定数量的特征。
许多不同的统计测试都可以用于此选择方法。例如,ANOVA F 值方法适用于数值输入和分类数据,就像我们在 Pima 数据集中看到的那样。这可以通过 f_classif() 函数使用。我们将在下面的示例中,使用此方法选择 4 个最佳特征。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 |
# 使用单变量统计测试进行特征选择 from pandas import read_csv 从 numpy 导入 set_printoptions 从 sklearn.特征选择 导入 SelectKBest 从 sklearn.特征选择 导入 f_classif # 加载数据 文件名 = 'pima-indians-diabetes.data.csv' 名称 = ['preg', 'plas', 'pres', 'skin', 'test', 'mass', 'pedi', 'age', 'class'] 数据框 = read_csv(文件名, 名称=名称) array = dataframe.values X = 数组[:,0:8] Y = 数组[:,8] # 特征提取 测试 = SelectKBest(score_func=f_classif, k=4) 拟合 = 测试.拟合(X, Y) # 总结得分 set_printoptions(精度=3) 打印(拟合.得分_) 特征 = 拟合.转换(X) # 总结选定的特征 打印(特征[0:5,:]) |
有关为您的数据使用哪种统计度量的帮助,请参阅教程
注意:考虑到算法或评估过程的随机性,或者数值精度的差异,您的结果可能会有所不同。建议多次运行示例并比较平均结果。
您可以看到每个属性的得分以及选择的 4 个属性(得分最高的那些)。具体是索引为 0 (preq)、1 (plas)、5 (mass) 和 7 (age) 的特征。
1 2 3 4 5 6 7 |
[ 39.67 213.162 3.257 4.304 13.281 71.772 23.871 46.141] [[ 6. 148. 33.6 50. ] [ 1. 85. 26.6 31. ] [ 8. 183. 23.3 32. ] [ 1. 89. 28.1 21. ] [ 0. 137. 43.1 33. ]] |
2. 递归特征消除
递归特征消除(RFE)通过递归地移除属性并在剩余属性上构建模型来工作。
它使用模型准确性来识别哪些属性(以及属性组合)对预测目标属性的贡献最大。
您可以在 scikit-learn 文档中了解更多关于 RFE 类的信息。
下面的示例使用 RFE 和逻辑回归算法来选择前 3 个特征。只要算法熟练且一致,算法的选择就不是太重要。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 |
# 使用 RFE 进行特征提取 from pandas import read_csv 从 sklearn.特征选择 导入 RFE 从 sklearn.线性模型 导入 LogisticRegression # 加载数据 url = "https://raw.githubusercontent.com/jbrownlee/Datasets/master/pima-indians-diabetes.csv" 名称 = ['preg', 'plas', 'pres', 'skin', 'test', 'mass', 'pedi', 'age', 'class'] 数据框 = read_csv(url, 名称=名称) array = dataframe.values X = 数组[:,0:8] Y = 数组[:,8] # 特征提取 模型 = LogisticRegression(求解器='lbfgs') rfe = RFE(模型, 3) 拟合 = rfe.拟合(X, Y) 打印("特征数量: %d" % 拟合.n_features_) 打印("选定特征: %s" % 拟合.support_) 打印("特征排名: %s" % 拟合.ranking_) |
可以看到,RFE 选择了前 3 个特征:preg、mass 和 pedi。
注意:考虑到算法或评估过程的随机性,或者数值精度的差异,您的结果可能会有所不同。建议多次运行示例并比较平均结果。
这些在 support_ 数组中标记为 True,在 ranking_ 数组中标记为“1”。
1 2 3 |
特征数量: 3 选定特征: [ True False False False False True True False] 特征排名: [1 2 3 5 6 1 1 4] |
3. 主成分分析
主成分分析(或 PCA)使用线性代数将数据集转换为压缩形式。
通常这被称为数据降维技术。PCA 的一个特性是您可以选择转换结果中的维度数量或主成分数量。
在下面的示例中,我们使用 PCA 并选择 3 个主成分。
通过查阅 PCA API,了解更多关于 scikit-learn 中 PCA 类的信息。深入了解 PCA 背后的数学原理,请参阅 主成分分析维基百科文章。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 |
# 使用 PCA 进行特征提取 import numpy from pandas import read_csv from sklearn.decomposition import PCA # 加载数据 url = "https://raw.githubusercontent.com/jbrownlee/Datasets/master/pima-indians-diabetes.csv" 名称 = ['preg', 'plas', 'pres', 'skin', 'test', 'mass', 'pedi', 'age', 'class'] 数据框 = read_csv(url, 名称=名称) array = dataframe.values X = 数组[:,0:8] Y = 数组[:,8] # 特征提取 pca = PCA(n_components=3) 拟合 = pca.拟合(X) # 总结组件 打印("解释方差: %s" % 拟合.explained_variance_ratio_) 打印(拟合.components_) |
注意:考虑到算法或评估过程的随机性,或者数值精度的差异,您的结果可能会有所不同。建议多次运行示例并比较平均结果。
您可以看到,转换后的数据集(3 个主成分)与原始数据几乎没有相似之处。
1 2 3 4 5 6 7 |
解释方差: [ 0.88854663 0.06159078 0.02579012] [[ -2.02176587e-03 9.78115765e-02 1.60930503e-02 6.07566861e-02 9.93110844e-01 1.40108085e-02 5.37167919e-04 -3.56474430e-03] [ 2.26488861e-02 9.72210040e-01 1.41909330e-01 -5.78614699e-02 -9.46266913e-02 4.69729766e-02 8.16804621e-04 1.40168181e-01] [ -2.24649003e-02 1.43428710e-01 -9.22467192e-01 -3.07013055e-01 2.09773019e-02 -1.32444542e-01 -6.39983017e-04 -1.25454310e-01]] |
4. 特征重要性
袋装决策树,如随机森林和极端随机树,可用于估计特征的重要性。
在下面的示例中,我们为 Pima 印第安人糖尿病发病数据集构建了一个 ExtraTreesClassifier 分类器。您可以在 scikit-learn API 中了解更多关于 ExtraTreesClassifier 类的信息。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 |
# 使用 Extra Trees 分类器进行特征重要性分析 from pandas import read_csv 从 sklearn.集成 导入 ExtraTreesClassifier # 加载数据 url = "https://raw.githubusercontent.com/jbrownlee/Datasets/master/pima-indians-diabetes.csv" 名称 = ['preg', 'plas', 'pres', 'skin', 'test', 'mass', 'pedi', 'age', 'class'] 数据框 = read_csv(url, 名称=名称) array = dataframe.values X = 数组[:,0:8] Y = 数组[:,8] # 特征提取 模型 = ExtraTreesClassifier(n_estimators=10) 模型.拟合(X, Y) 打印(模型.feature_importances_) |
注意:考虑到算法或评估过程的随机性,或者数值精度的差异,您的结果可能会有所不同。建议多次运行示例并比较平均结果。
可以看到,我们得到了每个属性的重要性分数,分数越大,属性越重要。分数表明了 plas、age 和 mass 的重要性。
1 |
[ 0.11070069 0.2213717 0.08824115 0.08068703 0.07281761 0.14548537 0.12654214 0.15415431] |
总结
在这篇文章中,您发现了如何使用 scikit-learn 在 Python 中准备机器学习数据的特征选择。
您学习了 4 种不同的自动特征选择技术:
- 单变量选择。
- 递归特征消除。
- 主成分分析。
- 特征重要性。
如果您正在寻找更多关于特征选择的信息,请参阅这些相关文章:
您对特征选择或此帖子有任何疑问吗?请在评论中提出您的问题,我将尽力回答。
你好 Jason!谢谢你的这篇文章——非常有用!我确信我只是遗漏了一些简单的东西,但查看你的单变量分析,你列出的相关性最强的特征似乎在打印的得分摘要中具有最高值。这只是这个函数输出结果的一个怪癖吗?再次感谢你为特征选择提供了一个很棒的切入点。
你好 Juliet,这可能只是巧合。如果你发现有什么不同,请告诉我。
听起来不错。
深度学习需要特征选择吗?
谢谢你
可能需要。最好的方法是看看特征选择能否提高结果。
是的,没错,特征选择会提高整体结果。
绝对是 Alok!继续努力!
对于递归特征消除,高重要性特征是(preg、mass、pedi)吗?
排名数组中它们的值是 1。
你好 Ansh,我相信值为 1 的特征是帖子中提到的 preg、pedi 和 age。这些是排名靠前的特征。
谢谢 Jason 的回复。我似乎犯了一个错误,我的错。很棒的帖子 🙂
没问题,Ansh。
大家好,
我同意 Ansh 的观点。有 8 个特征,索引为 True 和 1 的与 preg、mass 和 pedi 匹配。
[ 'preg', 'plas', 'pres', 'skin', 'test', 'mass', 'pedi', 'age' ]
[ True, False, False, False, False, True, True, False]
[ 1, 2, 3, 5, 6, 1, 1, 4 ]
Jason,您能更好地解释一下您是如何看到 preg、pedi 和 age 是排名靠前的特征的吗?
感谢您的帖子,它非常有用且直截了当。恭喜。
你好 Anderson,它们在各自的列索引中有一个“true”,并且都被标记为“1”。
这有帮助吗?
嗨,Jason,
这正是我所说的。我认为在以下情况下,最佳特征将是 preg、pedi 和 age
特征
[ 'preg', 'plas', 'pres', 'skin', 'test', 'mass', 'pedi', 'age' ]
RFE 结果
[ True, False, False, False, False, False, True, True ]
[ 1, 2, 3, 5, 6, 4, 1, 1 ]
然而,结果是
特征
[ 'preg', 'plas', 'pres', 'skin', 'test', 'mass', 'pedi', 'age' ]
RFE 结果
[ True, False, False, False, False, True, True, False]
[ 1, 2, 3, 5, 6, 1, 1, 4 ]
您是否错误地考虑了目标列“class”?
感谢您的快速回复,
Anderson Neves
你好 Anderson,
我明白了,你是说当你运行代码时,你得到了不同的结果?
代码是正确的,不包括 class 作为输入。
现在重新运行,我看到了相同的结果
也许我没有理解您注意到的问题?
嗨,Jason,
您的代码是正确的,我的结果和您的一样。我的观点是,使用 RFE 找到的最佳特征是 preg、mass 和 pedi。因此,我建议您修改文本“您可以看到 RFE 选择了前 3 个特征:preg、pedi 和 age。”如果您在代码末尾添加以下代码,您将明白我的意思。
# 查找最佳特征
best_features = []
i = 0
for is_best_feature in fit.support_
if is_best_feature
best_features.append(names[i])
i += 1
print ‘\nSelected features:’
print best_features
抱歉打扰了,
再次感谢,
Anderson Neves
明白了,Anderson。
感谢您耐心帮助我使这篇文章更有用。我非常感谢!
我已修复了上面的示例。
你好,谢谢你的这篇文章,我可以用这些选定的特征算法来做(knn,svm,决策树,逻辑回归)吗?例如,RFE 只能用于逻辑回归,还是我可以与任何分类算法一起使用?
您可以使用任何算法,请看这里:
https://machinelearning.org.cn/rfe-feature-selection-in-python/
通过 rfe,我如何为具有 true 值的特征形成新的数据框?
好问题,Narasimman。
凭记忆,您可以使用 numpy.concatenate() 来收集您想要的列。
https://docs.scipy.org.cn/doc/numpy/reference/generated/numpy.concatenate.html
感谢有用的教程。
Narasimman – '从 rfe,我如何为具有真实值的特征形成新的数据框?'
您可以直接将 rfe 应用于数据框,然后根据列进行选择
…
df = read_csv(url, names=names)
X = df.iloc[:, 0:8]
Y = df.iloc[:, 8]
# 特征提取
model = LogisticRegression()
rfe = RFE(model, 3)
fit = rfe.fit(X, Y)
print(“特征数量: {}”.format(fit.n_features_))
print(“选定特征: {}”.format(fit.support_))
print(“特征排名: {}”.format(fit.ranking_))
X = X[X.columns[fit.support_]]
嗨,Jason,
非常感谢你的帖子!太棒了!我对 PCA 方法有一个小问题。如何获取选定的 3 个主成分的列标题?那里只是简单的列号,但很难知道最终是哪些属性。
谢谢,
谢谢 MLBeginner,我很高兴你觉得它有用。
没有列标题,它们是总结数据的“新”特征。希望这有帮助。
你好,Jason!请问我是否可以使用 PSO 在 Python 中进行情感分析的特征选择?
当然,尝试一下,看看结果如何(就像在选定特征上训练的模型一样)与其他特征选择方法进行比较。
嘿 Jason,卡方特征选择的单变量测试可以应用于连续数据和分类数据吗?
你好 Vignesh,我相信只能用于连续数据。但我可能错了——你可以试试看。
嘿 Jason,谢谢你的回复。在单变量选择中执行卡方检验时,你从 df.values 中获取数组。在这种情况下,数组的每个元素将是数据框中的每一行。
要执行特征选择,我们应该理想地从数据框的每一列中获取值,以检查每个特征与类变量的独立性。这是 sklearn.preprocessing 的内置功能吗,所以你将值作为每一行获取?
请给我建议。
我不太明白 Vignesh。一般来说,是的,我们使用内置函数来执行测试。
嗨,Jason,
我正在尝试使用 CPU 机器进行图像分类,我有一个非常大的训练矩阵,大小为 3800*200000,这意味着有 200000 个特征。请问如何降维?
考虑使用数据集的一个样本。
考虑使用本文中的特征选择方法。
考虑使用 PCA、Sammons 映射等投影方法。
希望这些能作为一个开始有所帮助。
嗨 Jason
import numpy as np
从 sklearn.feature_selection 导入 SelectKBest
从 sklearn.feature_selection 导入 chi2
most_relevant = SelectKBest(chi2, k>=4).fit(X_train, y_train)
most_relevant_df = pd.DataFrame(zip(X_train.columns, most_relevant.scores_),
columns= ['Variables', 'score']).sort_values( 'score', ascending=False).head(20)
most_relevant_variables = most_relevant_df.Variables.tolist()
most_relevant_df
—————————————————————————
NameError Traceback (最近一次调用)
in
2 从 sklearn.feature_selection 导入 SelectKBest
3 从 sklearn.feature_selection 导入 chi2
----> 4 most_relevant = SelectKBest(chi2, k>=4).fit(X_train, y_train)
5 most_relevant_df = pd.DataFrame(zip(X_train.columns, most_relevant.scores_),
6 columns= ['Variables', 'score']).sort_values( 'score', ascending=False).head(20)
NameError: 名称 'k' 未定义
我遇到了这个问题,K 未定义,我需要怎么做,以前我使用这个代码没有问题,你知道是什么原因吗?
这将帮助您正确复制代码
https://machinelearning.org.cn/faq/single-faq/how-do-i-copy-code-from-a-tutorial
Jason,
当您使用“SelectKBest”时,请您解释一下您是如何获得以下分数的吗?
[ 111.52 1411.887 17.605 53.108 2175.565 127.669 5.393
181.304]
-Mani
我使用了卡方检验,你可以在这里了解更多信息
https://scikit-learn.cn/stable/modules/generated/sklearn.feature_selection.chi2.html#sklearn.feature_selection.chi2
Jason,
我明白你使用了卡方检验。但如果我想手动获得这些分数,我该怎么做?请解释一下。
-Mani
好问题,抱歉目前没有示例。
杰森,
请解释一下如何使用卡方检验获得以下分数。
[ 111.52 1411.887 17.605 53.108 2175.565 127.669 5.393
181.304]
-Mani
Jason,我们如何从特征排名中获取特征名称?
你好 Natheer,
将特征排名映射到 DataFrame 或其他数据上标题行中列名称的索引。
嗨,Jason,
谢谢这个很棒的博客
我有一个回归问题,需要将一堆分类变量转换为虚拟数据,这将生成 200 多个新列。我应该在此步骤之前还是之后进行特征选择?
谢谢
试一试。
那会产生很多新的二元变量。您的结果数据集将是稀疏的(很多零)。在此之前进行特征选择可能是一个好主意,也可以在此之后尝试。
嗨,Jason,
我在选择适合我数据的特征选择算法方面有点卡住了。
我的数据大约有 900 个属性(列)和大约 60 条记录。这些值只是属性的计数。
基本上,我正在统计一个可移植文件的 API 调用次数。
我的数据如下:
文件,危险,API 1,API 2,API 3,API 4,API 5,API 6……API 900
ABC,是,1,0,2,1,0,0,….
DEF,否,0,1,0,0,1,2
FGH,是,0,0,0,1,2,3
.
.
.
直到 60
您能为我的数据推荐一个合适的特征选择方法吗?
你好 Mohit,
考虑尝试几种不同的方法,以及一些投影方法,看看哪种数据“视图”能够产生更准确的预测模型。
你好!
一旦我通过 PCA 获得了数据的简化版本,我该如何将其输入到我的分类器中?
例如:原始数据大小为 100 行乘 5000 列
如果我减少 200 个特征,我将得到 100 乘 200 维的数据。对吗?
然后我创建数组:
a=array[:,0:199]
b=array[:,99]
但是当我测试我的分类器时,它的核心在测试和训练准确率方面都是 0%?
有什么想法吗?
听起来你做得对,但零准确度是个危险信号。
你在进行 PCA 时是否不小心将类别输出变量包含在数据中?它应该被排除在外。
你好,先生,
我心里有一个问题
这些特征选择算法都使用一些预定义数字,例如 PCA 中使用的 3。那么我们如何知道我的数据集只包含 3 个或任何预定义数量的特征呢?它不会自动选择特征数量。
好问题,Kamal。
不,您必须选择特征数量。我建议进行敏感性分析,尝试不同数量的特征,看看哪种方法能产生性能最佳的模型。
你好 jason,
我对 RFECV 方法有一个问题。
我正在处理一个需要使用不同估计器(回归模型)的项目。将 RFECV 与这些模型一起使用是否正确?还是只使用其中一个就足够了?一旦我选择了最佳特征,我是否可以将其用于每个回归模型?
为了更好地解释:
——我将 RFECV 与以下回归模型之一 [LinearRegression, Ridge, Lasso] 结合使用在整个数据集上。
——然后我比较了 r2 并选择了更好的模型,因此我使用了它选择的特征来做其他事情。
——实际上,我在每个回归模型中都使用了相同的“最佳”特征。
抱歉我的英语不好。
好问题。
您可以将不同的模型嵌入 RFE 中,看看结果在选择特征方面是否讲述相同或不同的故事。
您可以从每组特征构建模型并组合预测。
您可以选择一组特征并从中构建一个或多个模型。
我的建议是尝试所有你能想到的方法,看看什么能在你的验证数据集上给出最好的结果。
谢谢你,伙计。你很棒。
不客气。
你好,Jason。
感谢您的帖子,但我认为直接使用随机森林在您有相关特征的情况下不会起作用。
请查看这篇论文:
https://academic.oup.com/bioinformatics/article/27/14/1986/194387/Classification-with-correlated-features
我不确定其他方法,但特征相关性是在评估特征重要性之前需要解决的问题。
有道理,谢谢您的提醒和参考文献。
Jason,根据这些说明,您在机器学习领域中,输入向量之间的相关性何时会成为问题?毕竟,嵌入在某些算法(如梯度下降的权重优化)中的特征降维技术为相关性问题提供了一些解决方案。
谢谢
也许相关性高于 0.5。进行敏感性分析,使用不同的值,选择特征,并利用由此产生的模型技能来指导您。
你好,先生,
感谢您提供的信息丰富的帖子。我的问题是:
1) 您如何处理数据集中用于特征选择目的的 NaN。
2) 我在使用 RFE(model, 3) 时遇到了错误。它告诉我我提供了 2 个参数
而不是 1 个。
再次非常感谢您。
你好,NaN 表示缺失数据。
以下是一些处理缺失数据的方法:
https://machinelearning.org.cn/handle-missing-data-python/
先生,我解决了我的问题。我在主程序中将函数命名为 RFE。我很乐意听到
您对第一个问题的回答。
如何将嵌套的 JSON 加载到数据框中?
我目前不清楚,也许可以发到 StackOverflow 吗?Sam?
下午好
如何通过 PCA 了解哪些是主要成分?
PCA 将计算并返回主成分。
是的,但 PCA 没有告诉我哪些是最相关的变量,例如 mass test 等?
抱歉,我不太明白你的意思。
如果你想的话,你可以将特征选择或特征重要性方法应用于 PCA 结果。但这可能有点多余。
在 RFE 中我们应该输入一个估计器,那么在我进行特征选择之前,我应该调整模型还是直接使用默认参数设置?谢谢。
你可以这样做,但这并不是必需的。只要估计器在问题上表现得足够好,所选特征就会有价值。
我在这里卡了好几天。非常感谢。
卡住了…
很高兴听到建议有帮助。
如果您再次遇到困难,请尽管提出您的问题,我会尽力帮助。
嗨,Jason,
我想知道是否可以使用 SVM-RFE(其中使用的核是线性核)中的特征来构建/训练另一个模型(例如带有 RBF 核的 SVM)。
当然可以。
嗨,Jason,
首先,感谢您的所有帖子!这对像我这样的机器学习初学者非常有帮助。
我正在做一个个人项目,是关于 1 对 1 体育预测的。我的神经网络(MLP)准确率达到 65%(虽然不是很出色,但这是一个好的开始)。我有 28 个特征,我认为其中一些特征会影响我的预测。因此我应用了您帖子中提到的两种算法:
——递归特征消除,
——特征重要性。
但我有一些矛盾之处。例如,使用 RFE 我确定要选择 20 个特征,但在特征重要性中最重要的特征在 RFE 中却未被选中。这如何解释呢?
此外,在特征重要性中,所有特征都在 0.03 到 0.06 之间……这是否意味着所有特征都与我的输出不相关?
再次感谢您的帮助!
你好 Gwen,
不同的特征选择方法会选择不同的特征。这是预料之中的。
根据每组特征构建模型,并比较每种模型的性能。
考虑将模型集合起来,看看性能是否能有所提升。
一个值得考虑的获取更多特征的好领域是使用评级系统,并将评级作为高度预测性的输入变量(例如,可以直接使用国际象棋评级系统)。
告诉我进展如何。
谢谢你的回答,Jason。
我尝试了由递归特征消除选择的 20 个特征,但我的准确率约为 60%……
此外,Elo 评级系统(用于国际象棋)是我的一个特征。仅使用此特征,我的准确率约为 65%。
也许 MLP 对我的项目来说不是一个好主意。我必须考虑我的神经网络配置,我只有一个隐藏层。
而且,网球比赛的预测准确率可能无法超过 65%/70%。
(不足以获得正投资回报率!)
坚持住,Gwen。
尝试多种模型和多种模型配置。
看看其他人解决相同或类似问题时获得的技能,以了解可能性。
花几天时间头脑风暴,思考你可以使用的特征和其他数据。
请看这篇文章
https://machinelearning.org.cn/machine-learning-performance-improvement-cheat-sheet/
你好 Jason,
我对这个教程印象非常深刻。我只是一个初学者。我有一个非常基本的问题。一旦我通过 PCA 获得了数据的简化版本,我该如何将其输入到我的分类器中?我的意思是,如何将 PCA 的输出输入到分类器中?
将其分配给变量或保存到文件,然后像正常的输入数据集一样使用数据。
嗨,Jason,
我正在尝试执行 PCA,但在代码的这一点上遇到了错误:
print(“解释方差: %s”) % fit.explained_variance_ratio_
这是一个类型错误:%s 不支持的操作数类型为 'non type' 和 'float'
请帮帮我。
这看起来像是一个 Python 3 的问题。将“)”移到行尾:
谢谢 Jason。它奏效了。
很高兴听到这个消息。
如何知道我应该选择哪种特征选择技术?
考虑使用几种方法,为每种方法创建模型,然后选择能够产生最佳性能模型的方法。
你好 Jason,
我使用了 Extra Tree 分类器进行特征选择,然后输出是每个属性的重要性得分。但我想将这些重要属性提供给训练模型以构建分类器。我无法仅将这些重要特征作为输入来构建模型。
如果您能在此方面帮助我,我将不胜感激。
这些重要性得分是为您准备的。您可以使用它们来帮助决定哪些特征作为模型的输入。
你好 Jason,我非常感谢你的帖子。但我有一个小问题。为什么重要性得分之和不等于 1?
因为它们没有被归一化。
我真诚地感谢您。我使用 SelectFromModel 运行了特征重要性,其中 estimator=LinearSVC。但我得到了负的特征重要性值。我想知道这意味着什么。
分数通常是相对的。也许这些特征不如其他特征重要?
非常感谢。
嗨,Jason,
基本上,我想将特征降维的输出提供给朴素贝叶斯。如果您能提供示例代码会更好。
感谢您提供这个精彩的教程。
您可以使用特征选择或特征重要性来“建议”使用哪些特征,然后使用这些特征开发模型。
谢谢 Jason,
但是,在了解了重要特征之后,我无法从中构建模型。我不知道如何只将这些特征作为输入提供给模型。我的意思是 X_train 参数将包含所有特征作为输入。
提前感谢…。
特征选择方法会告诉您可以使用哪些特征。使用您喜欢的编程语言创建一个只包含这些列的新数据文件。
非常感谢 Jason。你做得很好。
谢谢。
我的桌面上有自己的数据集,而不是所有机器学习库中都有的标准数据集(例如 iris、diabetes)。
我有一个简单的 csv 文件,我想加载它以便正确使用 scikit-learn。
我需要一个非常简单易行的方法来做到这一点。
等待回复。
试试这个教程
https://machinelearning.org.cn/load-machine-learning-data-python/
感谢这篇非常有帮助的文章,
我应该选择哪种技术,而不选择其他技术?
这些技术的结果是否与其他技术的结果相关?我的意思是,使用多种技术来验证特征选择是否有意义?
谢谢!
根据在所选特征上训练的模型结果选择技术。
在预测建模中,我们关注的是提高预测技能和降低模型复杂性。
听起来我需要交叉验证每种技术……很有趣,我知道这很大程度上取决于数据,但我正在努力找出一种启发式方法来选择正确的方法,谢谢!
应用机器学习是经验性的。您无法分析性地选择“最佳”方法。
嗨,Jason,
在您的示例中,您写道
array = dataframe.values
X = array[:,0:8]
Y = array[:,8]
在我的数据集中,有 45 个特征。当我这样写时
X = array[:,0:44]
Y = array[:,44]
我收到一些错误
Y = array[:,44]
IndexError: index 45 is out of bounds for axis 1 with size 0
如果您能帮助我,我将不胜感激!
提前感谢。
确认您已正确加载数据,打印形状和一些行。
1. Lasso 可以使用哪些类型的预测变量?
2. 如果可以使用分类预测变量,是否应该将其重新编码为数值?例如:将是/否值重新编码为 1/0
3. 像位置(U(城市)/R(农村))这样的分类变量是否可以在不进行任何转换/重新编码的情况下使用?
回归,例如预测实数值。
分类输入必须编码为整数或独热编码(哑变量)。
嗨 Jason
我是机器学习新手,正在用 Python 做一个项目,其中一部分是识别相关特征,我想知道下一步是什么?如何处理相关特征?我们应该将它们更改为新的东西吗?也许是组合?它如何影响我们的建模和预测?如果您能指导我学习一些资源并找出答案,我将不胜感激。
祝好
通常会识别并删除相关的输入变量。
尝试一下,看看它是否提高了您模型的技能。
Brownlee博士您好,
感谢这些令人难以置信的教程。
我正在尝试对从在线评论中收集的一些文本数据进行分类,并且想知道是否有任何方法可以自动确定各种算法中的常数。例如,在 SelectKBest 中,k=3,在 RFE 中您选择 3,在 PCA 中,又是 3,而在特征重要性中,它被留作选择,仍然需要一些阈值。
有没有像经验法则或算法一样的方法来自动决定“最佳中的最佳”?比如说,我使用 n-gram;如果我在 1000 个实例数据集上使用三元组,特征数量就会爆炸。我如何根据最佳结果自动将 SelectKBest 设置为“x”数量?谢谢。
不,超参数不能分析设置。您必须通过实验来发现特定问题的最佳配置。
您可以使用启发式方法或复制值,但最好的方法是通过稳健的测试工具进行实验。
这是一个令人印象深刻的教程,很容易理解。我正在寻找使用高斯混合聚类模型在 python 中进行特征子集选择。您能帮我吗?
抱歉,我没有关于混合模型或聚类的材料。我无法提供帮助。
嗨,jason
我尝试了所有特征选择技术,哪种最适合用于预测建模的数据训练……?
针对您的数据集尝试多种方法,看看哪个特征子集能产生最熟练的模型。
你好 Jason,
我是西班牙的一名生物化学学生,我正在进行一个关于癌症预测生物标志物的项目。我使用的生物信息学方法非常简单,但我们正试图用一些蛋白质数据预测转移。在我们的研究中,我们想确定最好的生物标志物和最差的生物标志物,以及使用两种生物标志物可能产生的协同效应。这就是我的问题:我不知道如何计算哪两种是最好的预测变量。
这是我为最佳和最差预测变量所做的工作
analisis=[‘il10meta’]
X = data[analisis].values
#响应变量
response=’evol’
y = data[response].values
# 使用具有不同 random_state 值的训练/测试分割
X_train, X_test, y_train, y_test = train_test_split(X, y, random_state=5)
from sklearn.neighbors import KNeighborsClassifier
#创建分类器
knn = KNeighborsClassifier(n_neighbors=1)
#拟合分类器
knn.fit(X_train, y_train)
#预测与测试数据对应的响应变量
y_pred = knn.predict(X_test)
#计算分类精度
print(metrics.accuracy_score(y_test, y_pred))
我计算了精度。但是当我尝试对两种生物标志物做同样的事情时,我在我 6 种生物标志物的所有组合中都得到了相同的结果。
你能帮我吗?有什么建议吗?
谢谢你
通常,我建议按照此过程为您的预测建模问题获得最佳模型
https://machinelearning.org.cn/start-here/#process
通常,您必须测试许多不同的模型和许多不同的问题框架,才能找出最有效的方法。
你好 Jason,
非常感谢您的帖子。我也读过您关于特征选择的介绍文章。特征重要性属于哪种方法?即包装器还是嵌入式?
谢谢
都不是,这又是另一回事。
您可以将重要性分数用作过滤器。
很棒的帖子!谢谢你,Jason。我的问题是这里所有的值都是整数。所有算法都需要这样做。如果我有分类数据怎么办?如果存在分类特征,我如何知道哪个特征对模型更重要?有没有一种方法可以在独热编码(get_dummies)之前计算它,或者如果模型不是基于树的,如何在独热编码之后计算它?
好问题,我暂时想不出针对分类数据的特征选择方法,也许存在。需要做一些功课(例如谷歌学术搜索)。
你好,杰森,
我是否也应该在我的验证数据集上进行特征选择?还是只在我的训练集上进行特征选择,然后使用验证集进行验证?
使用训练数据集选择特征。然后,仅在测试/验证和模型使用的任何其他数据集上选择这些特征。
你好 jason
我正在做简单的分类,但出现了一个问题
ValueError 回溯 (最近一次调用)
in ()
—-> 1 fit = test.fit(X, Y)
~\Anaconda3\lib\site-packages\sklearn\feature_selection\univariate_selection.py in fit(self, X, y)
339 返回 self。
340 “””
–> 341 X, y = check_X_y(X, y, [‘csr’, ‘csc’], multi_output=True)
342
343 如果不可调用 self.score_func
~\Anaconda3\lib\site-packages\sklearn\utils\validation.py in check_X_y(X, y, accept_sparse, dtype, order, copy, force_all_finite, ensure_2d, allow_nd, multi_output, ensure_min_samples, ensure_min_features, y_numeric, warn_on_dtype, estimator)
571 X = check_array(X, accept_sparse, dtype, order, copy, force_all_finite,
572 ensure_2d, allow_nd, ensure_min_samples,
–> 573 ensure_min_features, warn_on_dtype, estimator)
574 如果 multi_output
575 y = check_array(y, ‘csr’, force_all_finite=True, ensure_2d=False,
~\Anaconda3\lib\site-packages\sklearn\utils\validation.py in check_array(array, accept_sparse, dtype, order, copy, force_all_finite, ensure_2d, allow_nd, ensure_min_samples, ensure_min_features, warn_on_dtype, estimator)
431 force_all_finite)
432 其他
–> 433 array = np.array(array, dtype=dtype, order=order, copy=copy)
434
435 如果 ensure_2d
ValueError: 无法将字符串转换为浮点数: ‘no’
你能在这方面指导我吗
您可能需要使用标签编码器和独热编码器将字符串数据转换为数字。
import numpy as np
from pandas import read_csv
来自 sklearn.feature_selection 导入 RFE
from sklearn.linear_model import LogisticRegression
# 加载数据
数据 = read_csv(‘C:\\Users\\abc\\Downloads\\xyz\\api.csv’,names = [‘org.apache.http.impl.client.DefaultHttpClient.execute’,’org.apache.http.impl.client.DefaultHttpClient.’,’java.net.URLConnection.getInputStream’,’java.net.URLConnection.connect’,’java.net.URL.openStream’,’java.net.URL.openConnection’,’java.net.URL.getContent’,’java.net.Socket.’,’java.net.ServerSocket.bind’,’java.net.ServerSocket.’,’java.net.HttpURLConnection.connect’,’java.net.DatagramSocket.’,’android.widget.VideoView.stopPlayback’,’android.widget.VideoView.start’,’android.widget.VideoView.setVideoURI’,’android.widget.VideoView.setVideoPath’,’android.widget.VideoView.pause’,’android.text.format.DateUtils.formatDateTime’,’android.text.format.DateFormat.getTimeFormat’,’android.text.format.DateFormat.getDateFormat’,’android.telephony.TelephonyManager.listen’,’android.telephony.TelephonyManager.getSubscriberId’,’android.telephony.TelephonyManager.getSimSerialNumber’,’android.telephony.TelephonyManager.getSimOperator’,’android.telephony.TelephonyManager.getLine1Number’,’android.telephony.SmsManager.sendTextMessage’,’android.speech.tts.TextToSpeech.’,’android.provider.Settings$System.getString’,’android.provider.Settings$System.getInt’,’android.provider.Settings$System.getConfiguration’,’android.provider.Settings$Secure.getString’,’android.provider.Settings$Secure.getInt’,’android.os.Vibrator.vibrate’,’android.os.Vibrator.cancel’,’android.os.PowerManager$WakeLock.release’,’android.os.PowerManager$WakeLock.acquire’,’android.net.wifi.WifiManager.setWifiEnabled’,’android.net.wifi.WifiManager.isWifiEnabled’,’android.net.wifi.WifiManager.getWifiState’,’android.net.wifi.WifiManager.getScanResults’,’android.net.wifi.WifiManager.getConnectionInfo’,’android.media.RingtoneManager.getRingtone’,’android.media.Ringtone.play’,’android.media.MediaRecorder.setAudioSource’,’android.media.MediaPlayer.stop’,’android.media.MediaPlayer.start’,’android.media.MediaPlayer.setDataSource’,’android.media.MediaPlayer.reset’,’android.media.MediaPlayer.release’,’android.media.MediaPlayer.prepare’,’android.media.MediaPlayer.pause’,’android.media.MediaPlayer.create’,’android.media.AudioRecord.’,’android.location.LocationManager.requestLocationUpdates’,’android.location.LocationManager.removeUpdates’,’android.location.LocationManager.getProviders’,’android.location.LocationManager.getLastKnownLocation’,’android.location.LocationManager.getBestProvider’,’android.hardware.Camera.open’,’android.bluetooth.BluetoothAdapter.getAddress’,’android.bluetooth.BluetoothAdapter.enable’,’android.bluetooth.BluetoothAdapter.disable’,’android.app.WallpaperManager.setBitmap’,’android.app.KeyguardManage$KeyguardLock.reenableKeyguar’,’android.app.KeyguardManager$KeyguardLock.disableKeyguard’,’android.app.ActivityManager.killBackgroundProcesses’,’android.app.ActivityManager.getRunningTasks’,’android.app.ActivityManager.getRecentTasks’,’android.accounts.AccountManager.getAccountsByType’,’android.accounts.AccountManager.getAccounts’,’Class’])
dataframe = read_csv(url, names=names)
array = dataframe.values
X = array[:,0:70]
Y = array[:,70]
# 特征提取
model = LogisticRegression()
rfe = RFE(model, 3)
fit = rfe.fit(X, Y)
#print(“Num Features: %d”) % fit.n_features_
#print(“Selected Features: %s”) % fit.support_
#print(“Feature Ranking: %s”) % fit.ranking_
—————————————————————————————————————–
我得到以下错误
ValueError 回溯 (最近一次调用)
in ()
6 模型 = LogisticRegression()
7 rfe = RFE(模型, 3)
—-> 8 fit = rfe.fit(X, Y)
9 print(“特征数量: %d”) % fit.n_features_
10 print(“已选择特征: %s”) % fit.support_
也许可以尝试将您的代码发布到 stackoverflow?
您能否发布一段代码,首先使用任何特征选择方法选择相关特征,然后使用相关特征构建分类模型?
感谢您的建议。
您会发布一段代码,演示如何使用特征选择方法选择相关特征,然后使用相关特征构建分类模型吗?
是的,请看这篇文章
https://machinelearning.org.cn/feature-selection-in-python-with-scikit-learn/
嗨,Jason,
感谢您的内容,非常有帮助。
您能否说明上述方法是否也适用于回归模型?
也许吧,我手头不确定。尝试一下,让我知道你的进展。
嗨,Jason,
我刚和 Arjun 遇到同样的问题,我尝试了一个回归问题,但两种方法都无法解决。
问题到底是什么?
嗨,Jason!您能进一步解释一下向量在 separateByClass 方法中的作用吗?
抱歉,我不明白?
嗨,Jason,
感谢您的帖子,它非常有用。
我有一个回归问题,一个输出变量 y (0<=y<=100) 和 6 个输入特征(我认为它们是不相关的)。
观测值(样本)的数量是 36980。
我使用随机森林算法来拟合预测模型。
获得的平均绝对误差约为 7。
在这种情况下,您建议我进行特征选择吗?
换句话说,从哪个特征数量开始,建议进行特征选择?
恭喜。
尝试一系列方法,从选定的特征构建模型,看看这些模型是否优于使用所有特征的模型。
你好 Jason,
首先感谢分享。
我有一个关于四种自动特征选择器和特征大小的问题。我注意到您使用了相同的数据集。Pima 数据集中,除了名为“pedi”的特征外,所有特征的大小都相当。
如果特征的大小彼此相差几个数量级,您是否需要进行任何类型的缩放?例如,如果假设一个特征,比如说“tam”的大小是 656,000,而另一个名为“test”的特征的值在 100 左右。这会影响您选择哪个自动选择器,或者您是否需要进行任何额外的预处理?
特征的尺度会影响特征选择方法,这真的取决于方法。
如果您有疑问,请考虑事先对数据进行归一化。
特征缩放应包含在示例中。
Pima Indians 糖尿病发病数据集包含尺度差异很大的特征。本文代码生成的排名受此影响,因此不准确。
感谢您的建议 Eric。
你好 Jason,
还有一个问题
我注意到当您使用三个特征选择器:单变量选择、特征重要性和 RFE 时,您会得到三个重要特征的不同结果。
1. 当使用 k=3 卡方检验的单变量时,您会得到
plas、test 和 age 作为三个重要特征。(葡萄糖耐量测试、胰岛素测试、年龄)
2. 当使用 ExtraTreesClassifier 进行特征重要性时
分数表明三个重要特征是 plas、mass 和 age。葡萄糖耐量测试、体重(BMI)和年龄)
3. 当您使用 RFE 时
RFE 选择的前 3 个特征是 preg、mass 和 pedi。怀孕次数、体重(BMI)和糖尿病家系测试。
根据您的以下文章
https://machinelearning.org.cn/an-introduction-to-feature-selection/
单变量是过滤方法,我相信 RFE 和特征重要性都是包装器方法。
所有三个选择器都列出了三个重要特征。我们可以说过滤方法只是为了过滤大量特征而不是最可靠的吗?但是,其他两种方法没有相同的前三个特征?有些方法比其他方法更可靠吗?还是这取决于领域知识?
不同的方法将采取不同的数据“视图”。
没有“最佳”视图。我的建议是尝试从数据的不同视图构建模型,看看哪个能带来更好的技能。甚至可以考虑将从数据的不同视图创建的模型组合起来。
嗨,Jason,
我是你的粉丝。你的文章很棒。关于特征选择的两个问题
1. 你不应该先将分类特征转换为“分类”吗?
2. 我们不必对数字特征进行归一化吗
在进行 PCA 或特征选择之前?在我的情况下,它将具有最大值的特征视为重要特征。
而且,并非所有方法都产生相同的结果。
有什么想法?
祝好,
Ranbeer
是的,Python 要求所有特征都是数值型的。有时重新缩放输入数据对模型有益。
嗨,杰森先生,
您的文章非常有帮助。
我有一个关于 gridserachcv() 的困惑。
我正在进行情感分析,并从数据集中创建了不同的特征组。
我正在使用线性 SVC 并想进行网格搜索以找到超参数 C 值。在获得 C 值后,拟合训练数据上的模型,然后在测试数据上进行测试。但是我也想逐个检查不同特征组的模型性能,那么我需要为每个特征组一次又一次地进行网格搜索吗?
也许吧,这真的取决于模型对您的数据的敏感程度。
此外,如此多的网格搜索可能会导致一些过拟合,请小心。
感谢Jason的耐心解释。
最后一部分“# 使用 Extra Trees Classifier 进行特征重要性”。
看起来如果我们考虑更高的分数,结果会不同?
抱歉,您确切地指什么?
嗨
先生,为什么您只使用 8 个示例,而您的数据集包含很多示例?
抱歉,我不明白。也许您可以尝试重新措辞您的问题?
嗨,Jason,
你的文章太棒了。读完这篇文章后,这在我脑海中挥之不去。
在这四种建议的技术中,我应该选择哪一种?
为什么输出会因为不同的特征选择而不同?
谢谢
全部尝试一下,看看哪个模型能带来最大的技能。
亲爱的 Jason,
感谢这篇文章。
当我尝试使用特征重要性时,我遇到了以下错误。
请帮我解决这个问题。
文件“C:/Users/bhanu/PycharmProjects/untitled3/test_cluster1.py”,第 14 行,在
model.fit(X, Y)
文件“C:\Users\bhanu\PycharmProjects\untitled3\venv\lib\site-packages\sklearn\ensemble\forest.py”,第 247 行,在 fit
X = check_array(X, accept_sparse=”csc”, dtype=DTYPE)
文件“C:\Users\bhanu\PycharmProjects\untitled3\venv\lib\site-packages\sklearn\utils\validation.py”,第 433 行,在 check_array
array = np.array(array, dtype=dtype, order=order, copy=copy)
ValueError: 无法将字符串转换为浮点数: ‘neptune’
也许您正在运行不同的数据集?“neptune”从何而来?
我能获得更多关于单变量特征选择的信息吗???我的意思是更多的模型,如 ReliefF、相关性等,
感谢您的建议。
嗨,Jason,
感谢您的帖子,它非常有用。
我有一个单类分类问题,我想从数据集中选择特征,但是,我发现已实现的方法需要指定目标,但我没有目标,因为训练数据集的类对于所有样本都是相同的。
我在哪里可以找到用于单类分类的特征选择方法?
谢谢!
如果所有类别都相同,那么您肯定不需要预测它?
嗯,我的数据集与异常检测有关。因此,训练集只包含一个类的对象(正常条件),而测试集中的文件则结合了正常条件下的样本和异常条件下的数据。
我理解的是,在特征选择技术中,标签信息经常用于指导寻找良好的特征子集,但在单类分类问题中,所有训练数据都只属于一个类。
因此,我正在寻找单类分类的特征选择实现。
感谢您的帖子,对初学者非常有帮助。
我有一个问题,我使用 Extra Trees Classifier 的特征重要性,如何
在这个样本中显示特征名称(plas, age, mass, …等)。
例如
特征排名
1. plas (0.11070069)
2. age (0.2213717)
3. mass(0.08824115)
…….
谢谢你的帮助。
……..
我想你可能需要写一些自定义代码。
使用以下方法
print(list(zip(names, model.feature_importances_)))
您得到
[(‘preg’, 0.11289758476179099), (‘plas’, 0.23098096297414206), (‘pres’, 0.09989914623444449), (‘skin’, 0.08008405837625963), (‘test’, 0.07442780491152233), (‘mass’, 0.14140399156908312), (‘pedi’, 0.11808706393665534), (‘age’, 0.142219387236102)]
太棒了!
嗨,Jason,
我尝试了特征重要性方法,但所有变量的值都在 0.05 以上,这是否意味着所有变量与预测值几乎没有关系?
也许可以尝试其他特征选择方法,从每组特征构建模型,并加强那些能产生最佳技能模型的特征视图。
你好 Jason,
感谢您的精彩文章,我有一个关于使用主成分分析(PCA)、ISOMAP 或任何其他降维技术进行特征降维的问题,我们如何确定特征/维度的数量最适合我们的数值数据分类算法。
尝试多种配置,为每种配置构建和评估一个模型,使用能产生最佳模型技能分数的配置。
你好,
当我遇到多个分类特征(如邮政编码、类别等)时该怎么办
我应该对它们进行独热编码吗
有些像邮政编码,你可以使用词嵌入。
其他的像类别可以进行独热编码。
你好,
当我们使用单变量过滤技术,如皮尔逊相关、互信息等时。我们需要在训练集上而不是整个数据集上应用过滤技术吗?
也许只使用训练数据。
杰森——我正在研究几种特征选择算法,从大约 100 个左右的输入变量列表中筛选出我正在尝试预测的连续输出变量。这些示例很有帮助,但我不确定它们是否适用于我正在尝试开发一些模型的特定回归问题……而且由于我有一个回归问题,您能否为连续输出变量预测提出任何特征选择方法?
也就是说,我已经对我的数据集进行了归一化,该数据集包含 100 多个分类、序数、区间和二元变量,以预测连续输出变量……有什么建议吗?
提前感谢!
RFE 适用于分类或回归。这是一个很好的起点。
此外,输入与输出的相关性是另一个极好的起点。
我读了你的帖子,非常有成效。
我可以使用分类变量和连续变量之间的线性相关系数进行特征选择吗?
或者请为这种类型的数据集(ISCX -2012)建议其他方法,其中目标类别是分类的,所有其他属性都是连续的。
不行。
也许可以看看特征重要性分数。
Jason,
我一直在想,在特征选择步骤中使用的机器学习工具的参数是否重要。因为我目前为止看到的大多数网站在此阶段都只使用默认参数配置。
我知道添加网格搜索会产生以下后果
-它大大增加了计算时间。(在使用包装器(递归特征消除)时确实如此)
-很难确定哪个能产生更好的结果,尤其是在最终模型是使用不同的机器学习工具构建时。
但仍然值得研究并使用特征选择机器学习工具的多个参数配置吗?
我的情况
-一个具有约 20 个特征的(非线性)数据集。
-计划在特征选择阶段使用 XGBooster(一篇类似数据集的论文指出这足够了)。
-对于模型构建,我计划使用 MLP NN,并使用网格搜索来优化参数。
提前感谢!
是的,您可以调整它们。
一般来说,我建议对输入生成许多不同的“视图”,为每个视图拟合一个模型,并比较结果模型的性能。甚至可以将它们组合起来。
最有可能的是,您的问题没有一个最佳特征集。有许多具有不同技能/能力。找到一个最适合您需求的集合或集合的集成。
嗨 Jason
我需要通过指定最佳窗口大小和帧大小来对行选择进行特征工程,您是否有任何在线示例?
谢谢
萨
对于时间序列,是的,就在这里
https://machinelearning.org.cn/sensitivity-analysis-history-size-forecast-skill-arima-python/
嗨 Jason
我是 Python 和 scikit learn 的初学者。我目前正在尝试运行 SVM 算法,根据功能连接 EEG 数据对患者和健康对照进行分类。我正在使用 rfcv 从大约 20,000 个特征中选择最佳特征。我得到了 32 个选定特征和 70% 的准确率。接下来我想尝试运行排列统计来检查我的结果是否显着。
我的问题:我必须对 32 个选定特征运行排列统计吗?还是我必须为此目的包含 20,000 个特征。
您可以在下面看到我的代码。为了简化我的问题,我将代码减少到 5 个特征,但其余部分是相同的。如果您能提供帮助,我将不胜感激,因为我找不到任何关于此主题的帖子。
此致 Yolanda
homeDir = ‘F:\Analysen\Prediction_TreatmentOutcome\PyCharmProject_TreatmentOutcome’ # 连接矩阵的位置
# #############################################################################
# 导入分类所需的包
import numpy as np
import os
import matplotlib.pyplot as plt
从 sklearn.datasets 导入 make_classification
from sklearn.model_selection import train_test_split
from sklearn.model_selection import cross_val_score
从 sklearn.model_selection 导入 cross_validate
从 sklearn.model_selection 导入 StratifiedKFold
从 sklearn.feature_selection 导入 RFECV
从 sklearn 导入 svm
从 sklearn.pipeline 导入 make_pipeline, Pipeline
from sklearn import preprocessing
从 sklearn.model_selection 导入 permutation_test_score
类 PipelineRFE(Pipeline)
def fit(self, X, y=None, **fit_params)
super(PipelineRFE, self).fit(X, y, **fit_params)
self.coef_ = self.steps[-1][-1].coef_
返回 self
clf = PipelineRFE(
[
(‘std_scaler’, preprocessing.StandardScaler()), #z-变换
(“svm”, svm.SVC(kernel = ‘linear’, C = 1)) #估计器
]
)
# #############################################################################
# 加载和准备数据集
nQuest = 5 # 问卷数量
samples = np.loadtxt(‘FBDaten_T1.txt’)
# 导入目标(基于组变量在 R 中创建)
targets = np.genfromtxt(r’F:\Analysen\Prediction_TreatmentOutcome\PyCharmProject_TreatmentOutcome\Targets_CL_fbDaten.txt’, dtype= str)
# #############################################################################
# 运行分类
skf = StratifiedKFold(n_splits = 5) # 通过保留每个类别的样本百分比来创建折叠。
# rfecv
rfecv = RFECV(estimator = clf, step = 1, cv = skf, scoring = ‘accuracy’)
rfecv.fit(samples, targets)
# 通过交叉验证选择的特征数量。
print(“最佳特征数量 : %d” % rfecv.n_features_)
# 绘制特征数量与交叉验证分数的关系图
plt.figure()
plt.xlabel(“特征子集”)
plt.ylabel(“交叉验证分数(正确分类数量)”)
plt.plot(range(1, len(rfecv.grid_scores_) + 1), rfecv.grid_scores_)
plt.show()
#所选特征的掩码
rfecv.support_
print(“所选特征掩码 : %s” % rfecv.support_)
#在布尔向量中查找真值的索引
index_features = np.where(rfecv.support_)[0]
print(index_features)
#查找索引值
reduced_features = samples[:, index_features]
print(reduced_features)
## 对降维特征进行置换检验
score, permutation_scores, pvalue = permutation_test_score(
clf, reduced_features, targets, scoring=”accuracy”, cv=skf, n_permutations=100, n_jobs=1)
print(“分类分数 %s (p值 : %s)” % (score, pvalue))
抱歉,我没有能力审查您的代码。
非常感谢您提供这个有用的教程。如果您能详细说明每种方法的优缺点,那就太好了。
提前感谢。
感谢您的建议。
我想问一下特征提取过程,停止训练和提取特征的标准是什么?它是否取决于模型的测试精度?换句话说,训练一个 epoch 或训练 100 个 epoch 后提取特征有什么区别?什么是最好的特征?也许我的问题很愚蠢,但我需要答案。
您所说的提取特征是什么意思?在这里,我们讨论的是特征选择?
我询问特征提取过程,例如,如果我训练 CNN,应该在多少个 epoch 后停止训练并提取特征?换句话说,特征提取是否取决于训练模型的测试精度?如果我构建模型(任何深度学习方法)只是为了提取特征,我可以运行一个 epoch 并提取特征吗?
我明白了。
您希望使用来自熟练模型的特征。也许是相同的任务,也许是重建任务(例如自编码器)。
我不明白答案
抱歉,哪一部分?
你好先生,
非常感谢这项伟大的工作。
您能否解释一下 Univariate Selection 中 plas、test、mass 和 age 的最高分数是如何获得的?我不明白您的意思。
你到底遇到了什么问题?
谢谢您的回复,先生……
实际上,我当时无法理解 chi^2 用于特征选择的输出。现在问题已经解决了。
非常感谢。
我很高兴听到您解决了您的问题。
哪种特征选择技术最好?我想知道为什么我多次尝试时排名总是会改变?
这是我在这里回答的一个常见问题
https://machinelearning.org.cn/faq/single-faq/what-feature-selection-method-should-i-use
你好,
在您的特征重要性示例中,您使用 ExtraTreesClassifier 作为集成分类器。
在 sci-kit learn 中,bootstrap 样本的默认值为 false。
这难道不与寻找特征重要性相矛盾吗?例如,它可能会只在一个特征上构建树,因此重要性会很高,但不能代表整个数据集。
谢谢
保罗
树将对特征进行抽样,并且总体而言,使用最多的特征将是“重要的”。
这只意味着这些特征对于构建树很重要,您可以随意解释。
嗨,Jason,
我有一个数据集,其中包含分类特征和数值特征。我应该在对分类特征进行独热编码之前进行特征选择,还是之后?
当然。这是一个廉价的操作(简单),并且对性能有很大的影响。
嗨 Jason
我没有阅读所有评论,所以不知道是否有人提到过这个。
https://hub.packtpub.com/4-ways-implement-feature-selection-python-machine-learning/
它与您在这里的帖子相同(可能经过编辑),并且正在作为一本书的一部分进行销售。我想我应该让您知道。
这太令人失望了!
谢谢你告诉我 Dean。
嗨 Jason
我有一个包含两个类的数据集。在特征选择中,我想为每个类指定重要的特征。例如,如果我选择了 15 个重要特征,确定哪个属性对哪个类更重要。请帮帮我
是的,这就是特征选择将为您做的事情。
嗨 Jason
首先,祝贺您的帖子和书籍。
我正在阅读您的《Python 机器学习精通》一书,第 8 章是关于这个主题的,我有一个疑问,我应该使用这些技术处理原始数据还是应该先对数据进行归一化?我测试了两种情况,但结果不同,例如(第一种情况,列 A 和 B 很重要,但第二种情况,列 C 和 D 很重要)
非常感谢。
谢谢。
从每个模型构建模型,并采用在保留数据集上表现更好的方法。
嗨 Jason,
我正在做一个项目,利用动物的过去数据(如位置、日期和时间)预测它们的下一步行动。我可以使用哪些模型来预测它们的下一个位置?
我建议按照此过程解决新问题
https://machinelearning.org.cn/start-here/#process
你好,
非常感谢您为向大众解释机器学习所做的辛勤工作。
我目前正在尝试优化我的 Kaggle-kernel,并且我想使用特征选择。因为我的源数据包含 NaN,所以我被迫在特征选择之前使用插补器。
不幸的是,这实际上导致 MAE 比没有特征选择时更差。
您有什么关于如何在源数据中存在 NaN 的情况下实现特征选择的建议吗?
也许您可以从用于训练特征选择器的数据中删除带有 NaN 的行?
嗨,Jason,
不知何故,你的博客几乎总是有我需要的东西。我能做的最少就是感谢你,并祝你一切顺利!
谢谢!
嗨,Jason,
你的工作太棒了。访问你的网站后对机器学习产生了兴趣。谢谢你,继续你的好工作。
我尝试在另一个数据集中使用 RFE,在该数据集中我使用 Label Encoder 将所有分类值转换为数值,但仍然出现以下错误
—————————————————————————
ValueError 回溯 (最近一次调用)
in ()
14 model = LogisticRegression()
15 rfe = RFE(model, 5)
—> 16 fit = rfe.fit(X, Y)
17 print(“特征数量:%d” % fit.n_features_)
18 print(“选择的特征:%s” % fit.support_)
~\Anaconda3\lib\site-packages\sklearn\feature_selection\rfe.py in fit(self, X, y)
132 目标值。
133 “””
–> 134 return self._fit(X, y)
135
136 def _fit(self, X, y, step_score=None)
~\Anaconda3\lib\site-packages\sklearn\feature_selection\rfe.py in _fit(self, X, y, step_score)
140 # self.scores_ 将在通过 fit 调用 _fit 时不计算
141
–> 142 X, y = check_X_y(X, y, “csc”)
143 # 初始化
144 n_features = X.shape[1]
~\Anaconda3\lib\site-packages\sklearn\utils\validation.py in check_X_y(X, y, accept_sparse, dtype, order, copy, force_all_finite, ensure_2d, allow_nd, multi_output, ensure_min_samples, ensure_min_features, y_numeric, warn_on_dtype, estimator)
571 X = check_array(X, accept_sparse, dtype, order, copy, force_all_finite,
572 ensure_2d, allow_nd, ensure_min_samples,
–> 573 ensure_min_features, warn_on_dtype, estimator)
574 如果 multi_output
575 y = check_array(y, ‘csr’, force_all_finite=True, ensure_2d=False,
~\Anaconda3\lib\site-packages\sklearn\utils\validation.py in check_array(array, accept_sparse, dtype, order, copy, force_all_finite, ensure_2d, allow_nd, ensure_min_samples, ensure_min_features, warn_on_dtype, estimator)
431 force_all_finite)
432 其他
–> 433 array = np.array(array, dtype=dtype, order=order, copy=copy)
434
435 如果 ensure_2d
ValueError: 无法将字符串转换为浮点数:‘StudentAbsenceDays’
我急需此问题的解决方案。请帮帮我。
这表明你的数据文件可能仍然包含字符串值。
也许再检查一下你加载的数据?
我已检查该列的数据类型,如下所示,它是 int64 类型
输入:
mod_StudentData[‘StudentAbsenceDays’].dtype
输出:
dtype(‘int64’)
干得好!
你好 Jason……
一如既往的精彩文章。
我是机器学习新手,这篇文章让我有些疑惑。
SelectKBest、RFE 和 ExtraTreesClassifier 正在执行特征提取,而 PCA 正在执行特征提取。
我这样理解对吗?
谢谢 Jason
是的。
嗨,Jason,
首先,教程很棒!
我的问题是,我有一个大约3万个样本的数据集,每个样本有大约150个特征,用于二元分类问题。我的计划是使用3折交叉验证(每个折叠,数据被分割两次,一次用于RFE,另一次用于网格搜索)在网格搜索(选择特征并在同一管道中调整参数)上执行RFE,这在整个数据集上完成。
现在,在确定了最佳特征和参数之后,使用相同的数据集,我将其分为训练/验证/测试集,并使用选定的特征和参数训练模型以获得其准确性(当然是最佳模型的准确性,并且在测试集上)。
这样做正确吗?我采用这种方法的原因是,特征/参数选择是一个与实际模型拟合(使用选定的特征和参数)完全不同的过程,这意味着实际模型拟合实际上不会知道特征/参数选择在整个数据集上学到了什么,因此重新使用整个数据集是可以的。
如果不是这样,您有什么建议?也许将整个数据集分为特征/参数选择集和实际模型拟合集(50:50),其中在第一个50%上确定了最佳特征和参数后,将这些特征用于剩余的50%数据来训练模型(这50%进一步分为训练/验证/测试)。
我建议在每次交叉验证折叠或预先使用单独的数据集进行特征选择。
感谢 Jason 博士的回答!另外,网格选择 + RFE 过程会输出所获得的最佳模型(具有最佳特征集和参数)的准确率/F1 分数,这可以被视为模型性能的最终分数吗?还是您真的需要构建另一个模型(具有最佳特征集和参数的最终模型)来获取模型性能的实际分数?
我建议构建一个最终模型用于进行预测。测试工具的分数可能是一个合适的模型对未见数据性能的估计——这完全取决于你的项目,关于什么是令人满意的。
谢谢 Jason 博士。最后一个问题 :),我可以使用卡方统计检验(在单变量选择部分)来反映每个特征的 p 值或统计显著性吗?比方说,我将在我的数据中显示每个特征的修剪平均值,卡方 p 值是否证实了修剪平均值的统计显著性?
不,它只是评论分类变量之间的关系。
谢谢 Jason 博士!最后一个问题,我保证 :) 我认为在构建我的最终模型时,在 3 折嵌套交叉验证的 RFE + GS 上修剪我的特征和参数,而在 10 折常规交叉验证上进行训练是没问题的。我在每个过程中使用了不同的数据集(我将原始数据集 50:50 分割,前半部分用于 RFE + GS,后半部分用于构建我的最终模型)。原因是嵌套交叉验证的 RFE + GS 计算成本太高,并且我希望以更精细的粒度训练我的最终模型,因此使用了常规的 10 折交叉验证。
非常感谢!
我无法评论您的测试方法是否可行,您必须从稳定性/方差方面评估它,如果您觉得结果可靠,就可以使用它。
非常感谢 Jason 博士
你好,Jason 博士;
我想问您一个问题:我想在类似于 Pima Indians 糖尿病发病数据集的数据集上应用 PSO 算法,我很困扰,我该怎么做
抱歉,我没有使用全局优化算法进行特征选择的示例——我不确定这些技术是否相对有效。
你好,
我是初学者,我的问题可能不对。我们可以在自动编码器中使用这些特征选择方法吗?例如,我们的网络输入和输出是图像,比如 mnist?谢谢
并非如此,你将对像素值进行特征选择。
自动编码器正在为你做这方面的工作。
嗨,Jason,
您提到的所有技术在存在目标变量(Y 或您案例中的第 8 列)时都完美运行。我正在处理的数据集使用无监督学习算法,因此没有任何目标/因变量。在这种情况下特征选择有效吗?如果有效,我该如何操作。
它可以,但你可能需要使用一种基于代理度量(如信息或相关性等)来选择特征的方法。
抱歉,我没有一个可行的例子。
你好 Jason,
您的博客以及您解释事物的方式都非常棒!我对特征选择有一个疑问,对于实际应用,某些特征选择技术的 fit 方法是只应用于训练集还是应用于整个数据集(训练 + 测试)?
非常感谢!
在评估模型时,它仅在训练数据集上进行拟合。在开发最终模型时,它在所有数据上进行拟合。
https://machinelearning.org.cn/train-final-machine-learning-model/
非常感谢!
你好 Jason,
首先,感谢您提供如此信息丰富的文章。
我需要使用过滤、封装和嵌入方法进行特征选择。计划是然后取每个选择过程分数的平均值,并选择前 10 个特征。
我的计划是最初将数据分为训练集和保留集。然后,我计划对上述 3 种方法中的每一种都使用交叉验证,并且只使用训练数据(在每个折叠内部)。一旦我获得了前 10 个特征,我将只在保留集中使用它们并预测我的模型性能。
您认为这种方法能给我一个稳定的模型吗?如果不能,我能改进/改变什么?
提前感谢。
也许可以尝试一下。
嗨,Jason,
感谢您的努力,
我想问一下 RFE 中的特征提取
我使用您提到的代码
names = [‘preg’, ‘plas’, ‘pres’, ‘skin’, ‘test’, ‘mass’, ‘pedi’, ‘age’, ‘class’]
结果是
[1 2 3 5 6 1 1 4]
当我按照我提到的方式更改列名顺序时
names = [‘pedi’,’preg’, ‘plas’, ‘pres’, ‘test’, ‘age’, ‘class’,’mass’,’skin’]
我得到相同的输出
[1 2 3 5 6 1 1 4]
你能解释一下它是如何工作的吗?
谢谢你
改变标签的顺序不会改变数据集中列的顺序。这就是你得到相同输出索引的原因。
我尝试更改列的顺序以检查 RFE 排序的有效性。
如果我想检查排序的有效性,您有什么建议?
另外,我想问一下,当我尝试选择影响我模型的特征时,我应该包含数据集中的所有特征(数值和分类)还是只包含分类特征?
谢谢你
我不确定是否需要这样做。
不过,您必须更改数据本身中的列顺序,例如 NumPy 数组或从中加载的 CSV。
在选择过程中包含哪些特征取决于特征选择方法的功能。
由于这个警告,我无法获得输出
“C:\Users\Waqar\Anaconda3\lib\site-packages\sklearn\model_selection\_split.py:626: 警告:y 中最少人口的类别只有 1 个成员,这太少了。任何类别中的最小成员数不能小于 n_splits=5。”
如果有人知道,请帮忙。
也许你可以使用更少的拆分或者使用更多的数据?
嗨,Jason,
我正在阅读您关于使用 Python 进行机器学习精通的书,并且我正在讨论上面提到的相同主题,我看到您选择了卡方进行单变量方法的特征选择,我如何决定在不同测试(卡方、t 检验、ANOVA)之间进行选择。
好问题。我在这里回答
https://machinelearning.org.cn/faq/single-faq/what-feature-selection-method-should-i-use
谢谢,下一步学习有很多东西要读 :)
谢谢。
嗨,jason
请告诉我如何在使用 SelectKBest 这个类的情况下选择最佳 k 值。
评估不同 k 值的模型,并选择能提供最熟练模型的 k 值。
嗨,杰森,
我想使用单变量选择方法。
我正在构建一个线性回归模型,它有大约 46 个分类变量。
如果我想知道用于构建模型的最佳分类特征,我需要将独热编码值发送给 fit 函数,对吗?并且 score_func 也应该是 chi2?
test = SelectKBest(score_func=chi2, k=4)
fit = test.fit(X, Y)
在上述代码中,X 应该是所有分类变量的独热编码值,对吗?
提前感谢
也许这会有帮助。
https://machinelearning.org.cn/chi-squared-test-for-machine-learning/
此外,线性回归听起来不太合适,尝试决策树和其他一些算法。
你好,
我有一个问题。
您是在创建虚拟变量之前还是之后应用特征选择?
提前感谢
特征选择是在此之前进行的。
尊敬的先生,
我正在使用“移除低方差特征”进行特征选择。我有 1452 个特征,代码返回 454 个特征,但没有特征标签,即列标题。现在我无法知道哪些特征已被接受。所以我的问题是“我如何保留输出中的列标题”?
特征选择方法通常选择列索引。一旦您拥有了列索引,您就可以将其应用于原始数据以获取每个所选列的标题。
嗨,Jason,
卡方检验仅适用于分类数据。但在您的示例中,您正在使用连续特征。我不确定,SelectKBest 是否正在进行任何类型的分箱以将卡方应用于连续数据,请解释。我也有类似的带有连续特征和二元类的数据。在使用此方法之前,我希望确保。
谢谢,
巴拉特
它实际上只用于有序/分类数据,例如计数等。
更多信息在这里
https://scikit-learn.cn/stable/modules/generated/sklearn.feature_selection.chi2.html
嗨,Jason,
如果我必须弄清楚哪种特征选择方法适用于我拥有的数据类型,(比如说)我必须选择一些对我的目标变量贡献很大的特征,目标变量和预测变量可以是连续的、分类的,或者连续和分类的。
另外,我可以直接实施一种被认为适用于所有此类情况的最佳技术,还是尝试一些技术并得出结论。
谢谢,等待您的回复。
这是我在这里回答的一个常见问题
https://machinelearning.org.cn/faq/single-faq/what-feature-selection-method-should-i-use
您能给我列出一些最佳的特征选择方法或技术吗?
如链接中所述,没有“最佳”的概念,相反,您必须找出最适合您的特定数据集和模型选择的方法。
谢谢你的回复
不客气。
嘿,Jason
感谢您的精彩教程。我只是想知道卡方检验中分数是如何计算的?我的意思是,是否有任何数学公式可以得到这个分数?如果您知道,可以解释一下吗?
提前感谢你
是的,请看这篇文章
https://machinelearning.org.cn/chi-squared-test-for-machine-learning/
你好 Jason,
感谢您的 informative 帖子。
我使用了 feature_selection 中的 GenericUnivariateSelect()。
我有以下关于此的问题
1. 它说对于 mode,我们有一些选项可供选择,即:“mode : {'percentile', 'k_best', 'fpr', 'fdr', 'fwe'} 特征选择模式。” 这种模式的 K_best 是否与 SelectKBest 函数相同,还是不同?如果不同,您能解释一下它是如何进行评分和提供 p 值吗?
2. p 值在这个输出中有什么意义?我理解通常当我们执行统计检验时,我们更喜欢选择 p 值小于 0.05 的数据点。那么在选定特征的输出中,如果特征的 p 值大于 0.05,是否建议从列表中删除这些特征?还是 p 值不应考虑?
谢谢!我将等待您的回复。
好问题,我不能立即回答。也许可以查阅 API 文档?
嗨,Jason,
感谢您的教程
我的数据中有 NaN 值,我收到了“Input contains NaN, infinity or a value too large for dtype('float64')”错误。
有没有办法转换包含 NaN 值的数据。就像 xgboost 分类器如何处理这些值一样?
是的,在处理之前用实际值替换 NaN 是个好主意,例如,也许用平均值或中位数。
下午好,
当我尝试递归特征消除的示例代码时,我收到以下消息
Num Features: %d
回溯(最近一次调用)
文件“rfe.py”,第16行,在
print("Num Features: %d") % fit.n_features_
TypeError: 不支持的 % 操作数类型:'NoneType' 和 'int'
当我运行主成分分析代码时,我得到类似的错误
解释方差:%s
回溯(最近一次调用)
文件“pca.py”,第16行,在
print(“解释方差: %s”) % fit.explained_variance_ratio_
TypeError: 不支持的 % 操作数类型:'NoneType' 和 'float'
这是在完全复制粘贴代码并确保所有空格都保留且所有库都已更新之后。我使用 Anaconda 发行版中包含的 Python 版本:3.6。如果您能提供任何帮助,我将不胜感激,因为我在 Stack Exchange 或其他地方没有找到太多信息。
谢谢!
很抱歉听到这个消息,我有一些建议可能会有所帮助
https://machinelearning.org.cn/faq/single-faq/why-does-the-code-in-the-tutorial-not-work-for-me
这是关于如何从命令行运行的建议
https://machinelearning.org.cn/faq/single-faq/how-do-i-run-a-script-from-the-command-line
如何从教程中复制代码
https://machinelearning.org.cn/faq/single-faq/how-do-i-copy-code-from-a-tutorial
这有帮助吗?
按照“为什么教程中的代码对我不起作用”中的建议,我回到 StackOverflow 并完善了我的搜索。(*我之前错误地输入了 stack exchange。)
这是我找到问题解决方案的链接:https://stackoverflow.com/questions/41788814/typeerror-unsupported-operand-types-for-nonetype-and-float
这里编写的代码是
print(“解释方差: %s”) % fit.explained_variance_ratio_
我只需要这样做就能让它工作
print((“解释方差:%s”) % fit.explained_variance_ratio_)
这太简单了,我没看到。感谢您的帮助!
谢谢,我已更新教程!
Jason,好文章,我为我的数据集运行了它。当我要求 k=1 时,最好的分数在第 101 列中为 0.01。当我要求 k=4 最佳时,我得到
第 58 列(分数 = 0.02)
第 62 列(分数 = 0.001)
第 73 列(分数 = 0.0001)
第 101 列(分数 = 0.01)
但当我要求 k=2 时,我得到
第 73 列(分数 = 0.0001)
第 101 列(分数 = 0.01)
看起来 SelectKBest 已经选择了 n 个最佳特征,并从最后一列中交付了 k 个最佳特征。我说的对吗?还是发生了别的事情??
K-best 将选择按计算分数排序的 K 个最佳特征。
因此,应该给出第 58 列和第 101 列,而不是第 73 列和第 101 列。
如果您使用 SelectKBest,它将为您选择得分最高的特征。
嗨,Jason,
这也适用于分类数据吗?
如果不行,请推荐其他算法。
谢谢
好问题。
卡方和互信息函数可用于具有分类输入和类别标签目标的特征选择。
你好,
在您的一篇文章中,您提到特征选择方法是
1. 过滤方法
2. 封装方法
3. 嵌入方法
在这篇文章中,您说特征选择方法是
单变量选择、特征重要性等
这些方法之间有什么区别?
为什么同一个主题有两篇不同的帖子?
主要有两种类型是过滤和封装,或许还有嵌入——但这可能是一种特征工程方法。
另一种思考方式是方法中使用的变量数量——单变量或多变量。
特征重要性是过滤方法的输入。
嗨,Jason
REFCV 只能用于单个 Y 输出数据吗?如果我有 2 个输出回归数据,我如何使用 REFCV 选择特征?
谢谢你
是的。
好问题。我认为需要一些自定义的东西——也许可以尝试一下。
先生您好,我想通过使用基尼不纯度指数对特征进行排名来删除所有不相关的特征,然后选择具有非零 MDI 的预测变量。请帮帮我
抱歉,我没有这方面的教程。
嗨,Jason,
在对逻辑回归进行 RFE 特征选择以寻找最佳特征时,我得到了与对单个特征拟合模型并通过最小化 AIC 找到最佳特征不同的结果。
例如:
RFE 发现特征 A,其
AIC:2.4296372383358187,观察到并预测:0,未观察到并预测:0,未预测并观察到:92,未预测并未观察到:1498
最小化 AIC 得到特征 B,其
AIC 2.337092886023634,观察到并预测:3,未观察到并预测:13,未预测并观察到:89,未预测并未观察到:1485
我假设 RFE 使用另一个分数来找到最佳特征。我曾想过应用 RFE 来识别不同数量特征 [1 到 n] 的最佳特征,并通过 [n] AIC 值的最小值找到最佳集,以规避逐步回归问题。
但现在我不确定,因为这两个步骤似乎依赖于不同的分数?
提前非常感谢您的帮助!
是的,您将对哪些是好特征有许多不同的看法。
测试每个特征,看看什么能为您的特定数据集产生具有最佳技能的模型。
嗨,jason
感谢您的帖子
我不知道在交叉验证中进行特征选择是否更好
是的,它应该在交叉验证中使用以避免数据泄露。
谢谢您的回复,但我想知道您是否能帮我解决这个问题
我还有另一个问题
在特征重要性代码中
特征数量是 8,输出是 7,您是如何知道重要特征的名称的
这里的例子会有所帮助
https://machinelearning.org.cn/automate-machine-learning-workflows-pipelines-python-scikit-learn/
您可以测试不同的重要性截止值,并找出最适合您的特定数据集的值。
嗨,Jason。
我遇到了这个问题。这是我的代码
##########################################################
mtcars_data = pd.read_csv(“D:\Python\Assignment solutions\mtcars.csv”)
# 使用 Extra Trees 分类器进行特征重要性分析
from pandas import read_csv
from sklearn.ensemble import ExtraTreesClassifier
# 加载我的数据
array = mtcars_data.values
X = array[:,1:]
Y = array[:,:-10]
# 特征提取
model = ExtraTreesClassifier(n_estimators=10)
model.fit(X, Y)
print(model.feature_importances_)
#####################################################
NotFittedError: 估计器未拟合,请在 `feature_importances_` 之前调用 `fit`。
这很令人惊讶,很抱歉听到这个消息。
我没有看到任何明显的问题。也许可以尝试将您的代码和错误发布到 StackOverflow?
非常感谢您,您的帖子对我选择最佳特征非常有帮助。
不客气。
你好 Jason,你分享了 4 种选择特征的方法,每种方法都有不同的答案。你如何在这 4 种方法中进行选择?感谢你如此有启发性的帖子。
好问题,这会有帮助
https://machinelearning.org.cn/faq/single-faq/what-feature-selection-method-should-i-use
你好 Jason,
好帖子,它真的帮助了我。
我想知道统计假设检验是否可以用于预测模型的特征选择,其中目标变量是连续的,预测变量是分类的。
我们可以使用 t 检验、anova、卡方检验进行特征选择吗?
是的,请参阅本教程
https://machinelearning.org.cn/feature-selection-with-real-and-categorical-data/
尊敬的先生,
我查看了您的博客,关于递归特征消除,请问您能否在不使用内置的 RFE 方法(特征选择过程)的情况下帮助我。
谢谢,我将推出关于这个主题的教程。
谢谢先生的回复。我期待您的教程,请问何时发布。
是的,在此处获取通知
https://machinelearning.org.cn/newsletter/
谢谢先生。
不客气。
尊敬的先生,
我正在使用带有线性核的 SVM 分类器进行递归特征消除(RFE),我对 RFE 的内部过程有点困惑,它最初是使用所有特征构建的,然后我们如何找到每个特征的重要性?它是如何一步一步地移除特征的……您能详细解释一下吗?
我将发布关于该方法的教程。
在此之前,这可能会有所帮助
https://link.springer.com/article/10.1023%2FA%3A1012487302797
谢谢先生。
不客气。
你好先生
我想将多层 CNN 应用于分类任务,数据集是多类别的,并且包含分类特征。我使用了卡方方法进行特征选择。在 DNN 之前使用卡方方法进行特征选择是有效的吗?
谢谢
好问题,这将帮助您选择特征选择方法
https://machinelearning.org.cn/feature-selection-with-real-and-categorical-data/
CNN 可能会自动执行某种形式的特征选择/特征提取。
你好 Jason,
再次感谢您发表如此精彩的帖子!
我的数据集有 200 多个变量,我正在对其运行分类模型,这导致模型过拟合。您建议使用哪种方法来减少特征数量?我从特征重要性开始,但是由于变量数量如此庞大,我无法将其可视化。有没有办法我可以绘制或展示这些值与给定变量的关系?
也许可以使用受控实验,并找出最适合您的数据集的方法。
你好 Jason,很高兴能再问一个问题。在进行特征提取后,模型性能是否有所提高?我
当然。这取决于数据集和模型的选择。
你好先生,
感谢您提供如此出色的特征选择教程。
所提出的方法将特征与单个列(或“变量”?)进行比较。
如果我的特征不是单个列,我该如何进行特征选择?
例如,如果我想对音频数据集进行分类,我可能会提取音频文件的 MFCC 特征、RMS 能量等。
我该如何比较 MFCC(有 12 列)和 RMS 能量(单列)?
我该如何比较两个多列特征?
抱歉,我没有关于处理音频数据/DSP 的教程。
实际上,我并不是特指音频。
我问的是,如果提取的特征本身包含多个列,那么我如何将上述方法应用于它们进行特征选择?
时间序列/序列问题的特征选择可能需要专门的方法。抱歉,我没有示例。
您好,感谢您这篇有用的帖子!
我想问一下主成分分析和特征重要性同样的问题。我有 2686 个样本和 86 个特征。是否可以保留所有 n_samples,只使用这两种方法减少特征数量?如果可以,如何操作?
例如,在我的数据集上应用 PCA 时,当我设置 n_components=2686 时,就会出现这个错误
ValueError: n_components=2686 必须介于 0 和 min(n_samples, n_features)=86 之间,svd_solver='full'
非常感谢您
PCA 不执行特征重要性,它使用线性代数创建新特征。
是的,如果您愿意,可以在管道中使用一系列特征选择和降维方法。
谢谢,我会尝试的。
此致,Despoina
告诉我进展如何。
谢谢,但如果我想打印所选特征的名称,我该怎么做?
从特征选择返回的索引可以用作列名列表的索引。
您可以在本教程中看到一个示例
https://machinelearning.org.cn/rfe-feature-selection-in-python/
嗨,在基于封装的特征选择中,为什么以随机方式选择 k 个特征,例如前 3 个,前 5 个等等……有人能回答这个问题吗?
它不是随机选择的,我们必须选择一个最适合我们的模型和数据集的值。
谢谢,如果我想从 csv 文件中选择特征,代码是什么?
示例:file = pd.read_csv(“dataset.csv”)
#选择特征
或许可以看看这个例子
https://machinelearning.org.cn/rfe-feature-selection-in-python/
嘿,Jason,我目前正在 mengerjakan 我的学校项目。
我们有一个不同患者的数据集,他们的生命体征每小时检查一次。生命体征例如血压、PH 值、心率。所以我们每个患者有 10 小时的生命体征数据(有很多缺失数据)。然后我们必须预测,例如,他们是否会在下一小时内死亡。
我们每个患者的数据看起来像这样
患者编号 小时 血压 心率 PH
1 1 NaN 80 NaN
1 2 NaN 78 NaN
1 3 NaN 75 7.1
1 4 30 NaN NaN
1 5 35 NaN NaN
1 6 30 NaN NaN
1 7 NaN NaN NaN
1 8 NaN 78 7.2
1 9 NaN 75 NaN
1 10 NaN 80 NaN
我们使用 SimpleImputer 和均值策略替换了缺失值。我们展平了数据,因此每个患者基本上只有一行数据,并尝试用线性回归拟合它,但我感觉这种方法就像用两块石头生火一样,虽然可行,但肯定有更好的方法。而且结果预测很差。
对于 1) 一般方法 2) 填充缺失值的策略 3) 使用哪个模型 4) 也许一个好的教程可以帮助我更深入地了解细节,您有什么建议吗?
非常感谢这个博客
也许您可以尝试将问题建模为时间序列分类。
也许这些建议中的一些会对您有所帮助
https://machinelearning.org.cn/faq/single-faq/how-do-i-handle-discontiguous-time-series-data
抱歉,最初的问候不太正式,您是博士,我只是一个为作业苦苦挣扎的学生。称呼布朗利博士会更合适
🙂
不,请叫我“Jason”。这只是一个博客,我只是一个在网上帮助别人的人。
各位亲爱的
这是一个很棒的网站,我非常喜欢。我在这里学到了大部分使用 Python 进行机器学习和深度学习的专业知识,非常感谢。
谢谢!
嗨,Jason Brownlee,
感谢您的教程
请问,如果我想从 2048 个特征中选择前十个特征,ExtraTreesClassifier 中的 n_estimators 的值应该是什么?
持续增加该值,直到模型性能不再有进一步改善为止。
@ Jason Brownlee 感谢您的回复。
您能告诉我如何知道模型性能没有进一步提高吗?因为使用 ExtraTreesClassifier,我只会得到重要的特征,而这些特征会随着 n_estimators 的变化而变化。
要知道不同配置是否有改进的唯一方法是使用该配置拟合模型并进行评估。
你好,先生
如何将mRMR算法与CNN或(任何预训练模型)结合?
您有什么想法或参考代码吗?
感谢您的努力…
“mRMR”是什么?
mrmr是一种特征选择算法
抱歉,我对这种方法一无所知。
如果我想在入侵检测问题中使用深度学习中的特征选择技术,这可能吗?
为什么不呢!你尝试过什么吗?结果如何?
Jason博士您好,
我正在尝试使用特征选择进行分类。我的数据集中有36个特征,我想运行多种特征选择方法来计算所有特征的特征分数。我如何使用特征选择方法计算所有特征的特征分数?你能帮帮我吗?
好问题,请看这个
https://machinelearning.org.cn/feature-selection-with-real-and-categorical-data/
我的工作是开发一个用于多输出预测的模型(即,通过单个模型预测五个输出)。当我应用Kbest和递归特征消除方法来选择最佳特征时,我得到了一个错误“坏的输入形状(x,5)”。
这是否意味着我们只能将这些特征选择算法应用于单输出预测问题?
不。这只是意味着模型期望一个形状的数组,而您提供了一个不同形状的数组。您需要做的是检查我们的输入和输出并进行更正。
抱歉,但我没听懂您的回答。也许我没能解释清楚我的问题。
我有一个形状为 (x,60) 的输入数组和一个形状为 (x,5) 的输出数组。
现在,当我应用 SelectKbest 算法将输入向量的特征数量从 60 减少到 20 时,它会报错“错误的输入形状 (x,5)”。
然而,如果我使用只有一个列的形状为 (x,) 的输出向量,SelectKbest 会给出所需的结果。
所以这意味着输出向量应该是一个一维数组吗?
所以我的问题是,SelectKbest 如何在输出向量中列数可以大于一的多输出问题中工作?
好的,没错。RFE 的 fit(X,y) 函数期望 y 是一个向量,而不是矩阵。因此,您不能拥有形状为 (x,5) 的输出——这仅仅是 scikit-learn 的 RFE 的一个限制,但如果您能定义如何测量五维输出的误差,理论仍然适用。
你好。非常感谢您分享如此有价值的信息。我非常喜欢您的内容。我有一个问题:执行特征选择后,我们是否可以直接在模型中使用最重要的特征,或者我们是否应该检查最重要的特征之间没有相互关联(例如,从相关图来看)?谢谢!
嗨,Jessica……是的,我建议总是检查相关性,而不是对其做出假设。以下内容您可能也会感兴趣
https://machinelearning.org.cn/optimization-for-machine-learning/
如果我们有一个混合数据集,包含数值数据和分类数据,哪种特征选择方法会更合适?
嗨 Adil……您可能会在以下资源中找到一些明确的答案
https://towardsdatascience.com/learn-how-to-do-feature-selection-the-right-way-61bca8557bef
感谢分享此代码。我运行了PCA示例代码,但我认为存在一个问题,因为加载数据集的维度是(768,8),所以我们有768个样本和8个特征。通过应用PCA,我们将找到n_components(这里=3)个新特征,因此在应用PCA后我们应该得到(768,3)。但是所写的代码给出的数据集维度是:(3,8)
即,降维应用于样本而不是特征。
我认为在PCA之前应该对X进行转置。
嗨,Fatemeh……你实施你的想法了吗?
嗨 James,
我对这篇帖子和“https://machinelearning.org.cn/feature-selection-with-numerical-input-data/”这篇帖子有点困惑。它们都是用于分类目标数据特征选择的,都使用数值数据吗?如果是,为什么有两篇帖子用不同的方法解决同一个问题。为什么有两篇文章用不同的方法?我是否遗漏了什么?!
感谢您花时间制作如此出色的教程,它是我的最佳资源。
我想知道f_classif方法中分数是如何计算的?
嗨,Berkay……以下内容可能会让您感兴趣
https://datascience.stackexchange.com/questions/74465/how-to-understand-anova-f-for-feature-selection-in-python-sklearn-selectkbest-w
嗨 Jason,您的网站很棒
我怎么知道一个特征是否对监督机器学习模型中的每个因变量都有贡献,例如。假设我预测数据中一些人的体重,我想看看“炸薯条”特征是否比“番茄”特征更能帮助模型预测体重较高的人的概率。
我有一堆特征,想知道每个特征是贡献给“0”还是“1”
感谢您的帮助
嗨,Tal……以下内容您可能感兴趣
https://machinelearning.org.cn/an-introduction-to-feature-selection/
你好,使用f_classif方法对用二进制代码(0, 1)或(0, 1, 2, 3)表示的特征进行评分是一种正确的方法吗?
例如,一个表示人们性别的特征被编码为0和1。
谢谢,非常有用的主题,我完全理解这个概念
但我有一个问题,是否可能应用PCA和DT的特征重要性,然后提取它们之间的共同属性。然后使用这些属性来应用机器学习模型以提高准确性?有没有方法可以在对数据集应用PCA后打印特征?
你好 Jason Brownlee,很棒的网站,信息量很大!!
我有一个关于如何为我的问题选择正确的特征选择算法的问题?我读过您的一篇关于这方面的文章。然而,它只讨论如何选择过滤方法,那么包装器和嵌入式方法呢?我如何选择它们,基于什么?
非常感谢 James 博士
嗨 Carl……感谢您的反馈和支持!以下资源您可能会感兴趣
https://machinelearning.org.cn/feature-selection-with-real-and-categorical-data/
嗨 Jason,我尝试了您书中关于RFE的示例——《Python机器学习精通》。
我遇到了一个错误。model = LogisticRegression(solver=’liblinear’)
然后,rfe = RFE(model, 3),但是它抛出了一个错误消息,并且找不到原因?消息是需要2个位置参数,但您提供了3个。