sklearn 特征选择

Posted

技术标签:

【中文标题】sklearn 特征选择【英文标题】:Sklearn feature selection 【发布时间】:2017-04-06 14:18:21 【问题描述】:

我无法使用任何 Sklearn 特征提取方法而没有收到以下错误:

"TypeError: 不能使用灵活类型执行 reduce"

从示例来看,特征提取方法似乎只适用于非分类问题。我当然是在尝试做一个分类问题。我怎样才能解决这个问题?

示例代码:

from sklearn.feature_selection import RFE
from sklearn.linear_model import LinearRegression
from sklearn.datasets import load_boston
import random

# Load data
boston = load_boston()
X = boston["data"]
Y = boston["target"]

# Make a classification problem
classes = ['a', 'b', 'c']
Y = [random.choice(classes) for entry in Y]

# Perform feature selection
names = boston["feature_names"]
lr = LinearRegression()
rfe = RFE(lr, n_features_to_select=1)
rfe.fit(X, Y)

print "Features sorted by their rank:"
print sorted(zip(map(lambda x: round(x, 4), rfe.ranking_), names))

【问题讨论】:

你的 load_boston() 方法在哪里? 通过线性回归处理分类问题可能不是正确的方法。 stats.stackexchange.com/questions/22381/… 【参考方案1】:

我想以下将解决您的问题。

X = np.array(X, dtype = 'float_')
Y = np.array(X, dtype = 'float_')

在调用fit 方法之前执行此操作。您也可以使用int_ 代替float_。这完全取决于您需要的数据类型。

如果您的标签是string,那么您可以使用LabelEncoder 将标签编码为整数。

from sklearn import preprocessing    
le = preprocessing.LabelEncoder()
le = le.fit_transform(Y)
model.fit(X, le)

【讨论】:

将标签编码为整数不会导致问题吗?特征选择方法可能将第 2 类理解为比第 3 类“少”,而实际上这种关系并不存在。 不,这不会造成任何问题。标签只是标签,对分类任务无关紧要。您还可以获得字符串标签和转换后的整数标签之间的映射。

以上是关于sklearn 特征选择的主要内容,如果未能解决你的问题,请参考以下文章

sklearn特征选择和分类模型

sklearn 特征选择

Sklearn MLP 特征选择

如何在 sklearn 管道中获取通过特征消除选择的特征名称?

通过 Sklearn 的 RFECV(带有交叉验证的递归特征消除)选择特定数量的特征

机器学习sklearn(十七): 特征工程特征选择卡方选择卡方检验