Python 监督学习中的特征选择

Python 监督学习中的特征选择,python,scikit-learn,Python,Scikit Learn,我有3个标签(男性、女性、na),表示如下: import numpy as np from sklearn import svm from sklearn.feature_selection import SelectKBest, f_classif 每个标签由3个特征(身高、体重和年龄)定义为训练数据: 男性培训数据: labels = [0,1,2] 女性培训数据: male_height = np.array([111,121,137,143,157]) male_weight =

我有3个标签(男性、女性、na),表示如下:

import numpy as np
from sklearn import svm
from sklearn.feature_selection import SelectKBest, f_classif
每个标签由3个特征(身高、体重和年龄)定义为训练数据:

男性培训数据:

labels = [0,1,2]
女性培训数据:

male_height = np.array([111,121,137,143,157])
male_weight = np.array([60,70,88,99,75])
male_age = np.array([41,32,73,54,35])

males = np.vstack([male_height,male_weight,male_age]).T
不可用的培训数据:

female_height = np.array([91,121,135,98,90])
female_weight = np.array([32,67,98,86,56])
female_age = np.array([51,35,33,67,61])

females = np.vstack([female_height,female_weight,female_age]).T
因此,完整的培训数据如下:

na_height = np.array([96,127,145,99,91])
na_weight = np.array([42,97,78,76,86])
na_age = np.array([56,35,49,64,66])

nas = np.vstack([na_height,na_weight,na_age]).T
完整的标签包括:

trainingData = np.vstack([males,females,nas])
现在,我想选择最佳特征,输出它们的名称,并仅应用这些最佳特征来拟合支持向量机模型

根据@Eikenberg的回答和@larsmans的评论,我在下面进行了尝试

labels =  np.repeat(labels,5)

但是,所有选定元素都属于标签“男性”,其特征分别为:身高、体重和年龄。我不知道我把事情搞砸了?有人能把我引向正确的方向吗?

您可以使用例如
选择kbest
,如下所示

selector = SelectKBest(f_classif, k=keep)
clf = make_pipeline(selector, StandardScaler(), svm.SVC())
clf.fit(trainingData, labels)

selected = trainingData[selector.get_support()]

print selected

[[111 60 41]
 [121 70 32]]
然后把它放到你的管道里

from sklearn.feature_selection import SelectKBest, f_classif
keep = 2
selector = SelectKBest(f_classif, k=keep)

您可以使用,例如
选择kbest
,如下所示

selector = SelectKBest(f_classif, k=keep)
clf = make_pipeline(selector, StandardScaler(), svm.SVC())
clf.fit(trainingData, labels)

selected = trainingData[selector.get_support()]

print selected

[[111 60 41]
 [121 70 32]]
然后把它放到你的管道里

from sklearn.feature_selection import SelectKBest, f_classif
keep = 2
selector = SelectKBest(f_classif, k=keep)

老实说,我在文本分类上使用了支持向量机模型(这是一个完全不同的问题)。但是,通过这次经历,我可以自信地说,你拥有的功能越多,你的预测就会越好

总之,不要过滤掉最重要的特征,因为支持向量机将利用这些特征,不管这些特征的重要性有多小

但是,如果这是一个巨大的必要性,看看scikit learn的。它可以使用“feature\u importances\u”属性准确评估哪些特征更重要

下面是一个我将如何使用它的示例(未测试的代码):


希望能有所帮助。

老实说,我在文本分类中使用了支持向量机模型(这是一个完全不同的问题)。但是,通过这次经历,我可以自信地说,你拥有的功能越多,你的预测就会越好

总之,不要过滤掉最重要的特征,因为支持向量机将利用这些特征,不管这些特征的重要性有多小

但是,如果这是一个巨大的必要性,看看scikit learn的。它可以使用“feature\u importances\u”属性准确评估哪些特征更重要

下面是一个我将如何使用它的示例(未测试的代码):


希望能有所帮助。

谢谢你的回答。但是,我如何知道选择了哪些功能。我想输出它们的名称。
selector.get\u support
返回与所选功能相对应的布尔掩码。您是否可以更新您的问题,说明您是如何做到这一点的?支持应该清楚地指出3个特性中的某个子集,这在这里没有发生。另外,查看您发布的代码,您的标签似乎与您构建示例的方式不一致。好的,根据您的更新,可以看到发生了什么:您可能希望执行
selected=np.array([“height”、“weight”、“age”])[selector.get_support()]
。或者直接选择感兴趣的数据,
selected\u columns=trainingData[:,selector.get\u support()]
@eickenberg后一个表达式就是
selector.transform(trainingData)
。谢谢你的回答。但是,我如何知道选择了哪些功能。我想输出它们的名称。
selector.get\u support
返回与所选功能相对应的布尔掩码。您是否可以更新您的问题,说明您是如何做到这一点的?支持应该清楚地指出3个特性中的某个子集,这在这里没有发生。另外,查看您发布的代码,您的标签似乎与您构建示例的方式不一致。好的,根据您的更新,可以看到发生了什么:您可能希望执行
selected=np.array([“height”、“weight”、“age”])[selector.get_support()]
。或者直接选择感兴趣的数据,
selected\u columns=trainingData[:,selector.get\u support()]
@eickenberg后一个表达式就是
selector.transform(trainingData)
。您使用支持选择样本而不是特征。要实际选择功能,请执行选择器.transform(trainingData)。要检查功能,请按照@Eikenberg的建议执行
np.array([“身高”、“体重”、“年龄”)[selector.get_support()]
。您使用支持来选择样本而不是功能。要实际选择功能,请执行选择器.transform(trainingData)。要检查这些功能,请按照@Eikenberg的建议执行
np.array([“身高”、“体重”、“年龄”)[selector.get_support()]