特征选择管线:X的形状与拟合期间的形状不同

时间:2018-10-08 13:04:05

标签: python machine-learning scikit-learn pipeline random-forest

我正在尝试建立一个从集合中选择250个最佳特征,然后在这些特征上拟合随机森林回归器的管道。然后,我希望使用它来对新数据X_fresh进行预测。为此,我首先还使用行X_fresh=X_fresh[:,selector.get_support(indices=True)]从新鲜数据中选择了250个最佳功能。但是,在运行完整代码之后,这将产生错误“ X的形状与装配期间的形状不同”。

似乎当我适合管道时,它不会自动将X_train中的值转换为仅包含250个最佳功能。

我该如何纠正?完整的代码如下:

from imblearn.pipeline import Pipeline

selector=SelectKBest(f_regression)
pipeline=Pipeline(steps=[('selector', selector),('regressor', RandomForestRegressor())])

estimator=pipeline.set_params(selector__k=250,regressor__n_estimators=175).fit(X_train, y_train)

X_fresh=X_fresh[:,selector.get_support(indices=True)]

#Use it to predict the target values of the test data set
y_pred=estimator.predict(X_fresh)

1 个答案:

答案 0 :(得分:0)

您正在执行到X_fresh的转换,而没有执行到X_train的转换。您的管道期望X_fresh的输入数据与X_train的形状相同。通过在管道之前进行此selector转换,您可以更改X_fresh的形状,使其不再与X_train匹配。

由于selector已经成为管道的一部分,因此该代码是不必要的:

X_fresh=X_fresh[:,selector.get_support(indices=True)

当您调用y_pred=estimator.predict(X_fresh)时,selector步骤将作为管道的一部分运行,因此不需要单独调用该步骤。这是使用管道开始的好处之一。当您调用estimator时,请确保X_freshX_train的形状匹配,因为这是训练有素的管道所期望的。

管道通过将模型的步骤链接在一起来工作。在管道中,有一个特征选择步骤selector和一个回归步骤regressor。当您在管道上调用fit()方法时,输入数据将由X_train转换selector以具有250个最佳功能,然后将转换后的数据馈送到{{1 }}步骤来训练回归模型。

当您在管道上调用regressor时,输入的新数据将执行相同的步骤,因此无需从管道中独立执行任何步骤。

在装配管道之前,您应该获得predict()以确定X_train.shape中有多少列。适合X_train之后,您必须确保estimatorX_fresh具有相同的列。然后,当您在X_train上调用预测时,管道将自动执行功能选择并产生预测。