好吧,我仍然遇到了这个问题,但我对哪里出错了不知所措。我以为我有一个可行的解决方案,但是我错了。
在通过TPOT找到回归管道之后,我去使用.predict(X_test)
函数,并得到以下错误消息:
ValueError: Number of features of the model must match the input. Model n_features is 117 and input n_features is 118
我read somewhere on Github认为XGBoost希望以Numpy数组而不是Pandas Dataframe的形式将X功能传递给它。因此,我做到了,现在每当RandomForestRegressor出现在我的管道中时,我都会收到此错误消息。
所以我要调查:
X_train, X_test, Y_train, Y_test = train_test_split(X, Y, test_size=test_size, random_state=seed, shuffle=False)
# Here is where I convert the features to numpy arrays
X_train=X_train.values
X_test=X_test.values
print('[INFO] Printing the shapes of the training/testing feature/label sets...')
print(X_train.shape)
print(X_test.shape)
print(Y_train.shape)
print(Y_test.shape)
[INFO] Printing the shapes of the training/testing feature/label sets...
(1366, 117)
(456, 117)
(1366,)
(456,)
# Notice 117 rows for X columns...
# Now print the X_test shape just before the predict function...
print(X_test.shape)
(456, 117)
# Still 117 columns, so call predict:
predictions = best_model.predict(X_test)
ValueError: Number of features of the model must match the input. Model n_features is 117 and input n_features is 118
为什么!!!!!! ?????
现在棘手的事情是,我正在使用自定义tpot_config仅使用回归器XGBRegressor,ExtraTreesRegressor,GradientBoostingRegressor,AdaBoostRegressor,DecisionTreeRegressor和RandomForestRegressor,所以我需要想出一种方法来训练和预测功能所有这些对象都将以相同的方式使用数据,因此无论它涉及什么管道,每次去运行代码时,我都不会遇到这个问题!
在SO上的这些链接上也曾问过类似的问题:
...但是我不明白为什么我的模型无法预测,当我通过模型时,与训练模型时使用的(X)特征数量相同!我在哪里错了?
编辑 我还应该提到,当XGBRegressor也处于管道中时,将功能保留为数据帧而不将其转换为numpy数组有时会给我一个“功能名称不匹配”的错误。因此,我对如何处理树回归列表(如数据帧)和XGBoost(如Numpy数组)既迷茫。我还尝试过“重新排列”这些列(?),以确保X_train和X_test数据框的排列顺序与某些人建议的顺序相同,但没有做任何事情。
我已将完整代码发布在Google Colab notebook here中,您可以在其中发表评论。不管TPOT带有什么管道,如何将测试数据传递给.predict()函数???
答案 0 :(得分:0)
多亏了GitHub上的weixuanfu,我可能已经找到了一个解决方案,方法是将feature_importance代码部分移到我的代码底部,并且可以使用numpy数组作为功能。如果再次遇到此问题,我将在下面发布它: