0

我想知道是否可以使用带有sklearn包的多变量估计器进行 RFE。我检查了文档,找不到任何支持或反对它的东西。这是最小的代码:

import sklearn.linear_model as skl
from sklearn.feature_selection import RFE
from scat import *
from sklearn import metrics, model_selection

# -- params
n_folds = 5
N       = 5000
# -- regressor
regress = skl.RidgeCV(alphas=[1e-6, 1e-5, 1e-4, 1e-3, 1e-2, 1e-1, 1])

# -- cross-validation
P = np.random.permutation(N).reshape((n_folds, -1))
cross_val_folds = []

for i_fold in range(n_folds):
    fold = (np.concatenate(P[np.arange(n_folds) != i_fold], axis=0), P[i_fold])
    cross_val_folds.append(fold)

my_X = np.random.normal(0,1,[N, 315])
my_y = np.random.normal(0,1,[N, 2])
my_pred = model_selection.cross_val_predict(regress, X=my_X, y=my_y, cv=cross_val_folds)

MAE = metrics.mean_absolute_error(my_y, my_pred)
RMSE = np.sqrt(metrics.mean_squared_error(my_y, my_pred))
print('MAE: {}, RMSE: {}'.format(round(MAE, 5), round(RMSE, 5)))

rfe = RFE(regress, 300)
feature_final = rfe.fit_transform(my_X, my_y)

但我在测试时收到以下错误

ValueError: 错误的输入形状 (5000, 2)

这并没有提供太多信息。


编辑:

显然,使用 RFE 功能, y 经历

y = column_or_1d(y, warn=True)

这要求 y 是一个向量。有解决方法吗?

4

1 回答 1

2

RFE不支持多标签格式,因为每个目标都会导致选择不同的输入特征组合。因此,您需要RFE为每个目标变量创建个体。

例如:

rfe = {}
for i in range(my_y.shape[1]):
    rfe[i] = RFE(regress, 300) 
    rfe[i].fit(my_X, my_y[:,i])

feature_final = rfe[0].transform(my_X)
feature_final.shape
# (5000, 300)

来自文档的注释cross_val_predict

将这些预测传递到评估指标中是不合适的。用于cross_validate衡量泛化误差。

于 2019-07-18T17:16:44.113 回答