我正在尝试建立一个从集合中选择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)
答案 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_fresh
与X_train
的形状匹配,因为这是训练有素的管道所期望的。
管道通过将模型的步骤链接在一起来工作。在管道中,有一个特征选择步骤selector
和一个回归步骤regressor
。当您在管道上调用fit()
方法时,输入数据将由X_train
转换selector
以具有250个最佳功能,然后将转换后的数据馈送到{{1 }}步骤来训练回归模型。
当您在管道上调用regressor
时,输入的新数据将执行相同的步骤,因此无需从管道中独立执行任何步骤。
在装配管道之前,您应该获得predict()
以确定X_train.shape
中有多少列。适合X_train
之后,您必须确保estimator
与X_fresh
具有相同的列。然后,当您在X_train
上调用预测时,管道将自动执行功能选择并产生预测。