【发布时间】:2014-12-21 01:54:09
【问题描述】:
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 的cmets 在下面尝试了
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]]
但是,所有选定的元素都属于标签“男性”,其特征分别为:身高、体重和年龄。我不知道我在哪里搞砸了?有人可以引导我走向正确的方向吗?
【问题讨论】:
-
您正在使用支持来选择示例而不是功能。要实际选择功能,请执行
selector.transform(trainingData)。要检查这些功能,请按照@eickenberg 的建议执行np.array(["height", "weight", "age"])[selector.get_support()]。
标签: python scikit-learn