【问题标题】:Multi-output regressor and sklearn's RFE module多输出回归器和 sklearn 的 RFE 模块
【发布时间】:2019-07-16 14:48:19
【问题描述】:

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

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 是一个向量。有解决办法吗?

【问题讨论】:

    标签: python scikit-learn rfe


    【解决方案1】:

    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)
    
    

    来自documentationcross_val_predict 的注释:

    将这些预测传递给评估是不合适的 公制。使用cross_validate 衡量泛化误差。

    【讨论】:

    • 感谢 RFE 对多标签格式支持的评论。我认为在这种情况下创建 2 个 RFE 将毫无意义。但一个好主意是按顺序根据不同的目标变量进行 RFE。
    猜你喜欢
    • 2020-07-04
    • 2018-05-21
    • 2021-10-31
    • 2021-02-20
    • 2020-03-24
    • 2019-02-27
    • 1970-01-01
    • 2021-03-22
    • 2015-09-27
    相关资源
    最近更新 更多