【问题标题】:Feature Selection for Supervised Learning监督学习的特征选择
【发布时间】: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


【解决方案1】:

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

总而言之,不要过滤掉最重要的特征,因为无论多么不重要,支持向量机都会利用特征。

但是,如果这是非常必要的,请查看 scikit learn 的 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_

希望对您有所帮助。

【讨论】:

    【解决方案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)
    

    【讨论】:

    • 感谢您的回答。但是,我怎么知道选择了哪些功能。我想输出他们的名字。
    • selector.get_support 返回与所选特征对应的布尔掩码。
    • 您能否更新您的问题,具体说明您是如何做到这一点的?支持应该清楚地表明 3 个功能的某个子集,这里没有发生。此外,查看您发布的代码,您的标签似乎与您构建示例的方式不符。
    • 好的,根据您的更新,您可以看到正在发生的事情:您可能想做selected = np.array(["height", "weight", "age"])[selector.get_support()]。或者直接选择感兴趣的数据,selected_columns = trainingData[:, selector.get_support()]
    • @eickenberg 后面的表达式就是selector.transform(trainingData)
    猜你喜欢
    • 2013-12-01
    • 2018-10-01
    • 2011-07-21
    • 1970-01-01
    • 2016-09-25
    • 2014-04-20
    • 2013-03-24
    • 2021-10-17
    • 2015-08-26
    相关资源
    最近更新 更多