监督学习的特征选择

0 投票
2 回答
2228 浏览
提问于 2025-04-29 14:36
import numpy as np
from sklearn import svm
from sklearn.feature_selection import SelectKBest, f_classif

我有三个标签(男性、女性和未提供),分别表示如下:

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])

完整的标签是:

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]]

然而,所有选中的元素都属于“男性”标签,特征分别是:身高、体重和年龄。我搞不清楚哪里出错了?有人能指引我正确的方向吗?

暂无标签

2 个回答

2

老实说,我之前在文本分类上用过支持向量机模型(这其实是个完全不同的问题)。但通过这次经历,我可以很自信地说,特征越多,预测结果就会越好。

简单来说,不要把那些最重要的特征过滤掉,因为支持向量机会利用所有特征,即使它们的重要性很小。

不过,如果你真的需要筛选特征,可以看看scikit-learn里的随机森林分类器。它可以准确评估哪些特征更重要,使用“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_

希望这对你有帮助。

3

你可以像下面这样使用 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)

撰写回答