import numpy as np
from sklearn import svm
from sklearn.feature_selection import SelectKBest, f_classif
我有3个标签(男性,女性,na),表示如下:
labels = [0,1,2]
每个标签由3个特征(身高,体重和年龄)定义为训练数据:
男性培训数据:
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])
完整标签是:
labels = np.repeat(labels,5)
现在,我想选择最佳功能,输出名称,并仅应用那些最佳功能来拟合支持向量机模型。
我根据@eickenberg的回答和@larsmans的评论
在下面尝试过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]]
但是,所有选定的元素都属于标签'男性'具有以下特征:身高,体重和年龄。我无法弄清楚我搞砸了哪里?有人能引导我走向正确的方向吗?
答案 0 :(得分:2)
您可以使用例如SelectKBest
如下
from sklearn.feature_selection import SelectKBest, f_classif
keep = 2
selector = SelectKBest(f_classif, k=keep)
并将其放入您的管道
pipe = make_pipeline(selector, StandardScaler(), svm.SVC())
pipe.fit(trainingData, labels)
答案 1 :(得分:2)
老实说,我在文本分类上使用了支持向量机模型(这完全是一个完全不同的问题)。但是,通过这种经验,我可以自信地说,你拥有的功能越多,你的预测就越好。
总而言之,不要过滤掉最重要的功能,因为支持向量机将使用功能而不管重要性如何。
但是,如果这是一个巨大的必需品,请查看scikit learn's Random Forest Classifier。它可以使用“feature_importances_”属性准确评估哪些功能更重要。
以下是我将如何使用它的示例(未经测试的代码):
clf = RandomForestClassifier() #tweak the parameters yourself
clf.fit(X,Y) #if you're passing in a sparse matrix, apply .toarray() to X
print clf.feature_importances_
希望有所帮助。