Python 监督学习中的特征选择
我有3个标签(男性、女性、na),表示如下: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 =
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()]
。