X 有 95812 个特征,但 RandomForestClassifier 期望有 178341 个特征作为输入

问题描述 投票:0回答:1

我有一个使用文本数据的随机森林模型。但是,当我在新数据(测试集)上尝试该模型时,训练集和测试集之间的特征数量不兼容。另外,测试集上的转换有时会出现错误:sklearn.exceptions.NotFittedError:此 ColumnTransformer 实例尚未安装。在使用此估计器之前,请使用适当的参数调用“fit”。

这是我的代码:

featurizer = ColumnTransformer(
    transformers=[("vectorized_title", TfidfVectorizer(), "filtered_title"),
                  ("vectorized_author",TfidfVectorizer(), "filtered_author"),
                  ("vectorized_abstract",TfidfVectorizer(),"filtered_abstract"),
                  ("encoded_publisher",OneHotEncoder(),["publisher"]),
                  ("encoded_entrytype",OneHotEncoder(),["ENTRYTYPE"]),
                  ],
    remainder='drop')

with open('featurizer.pkl', 'wb') as featurizer_file:
    pickle.dump(featurizer, featurizer_file)

X_transformed = featurizer.fit_transform(new_df)

with open('featurizer.pkl', 'rb') as featurizer_file:
    loaded_featurizer = pickle.load(featurizer_file)

X_test_transformed = loaded_featurizer.transform(test_df)

y_pred = rf_model.predict(X_test_transformed)

我尝试将变换部分更改为 fit_transform (我知道这对于测试集来说是不正确的)。两个数据集中的列数和列顺序相同。训练集和测试集之间的特征名称不同。

python scikit-learn nlp random-forest
1个回答
0
投票

让我们弄清楚一些事情:

  • 训练集和测试集需要相同的特征。相同数量的特征,相同的特征名称。
  • 测试集必须使用与训练集相同的变压器进行转换。您可以将经过训练的变压器保存为pickle,但是您必须加载这个精确的变压器来转换测试集。您得到
    NotFittedError
    的原因很可能是因为您没有加载训练数据已拟合的拟合模型。
  • OneHotEncoder
    可能会看到训练集中不存在的类别。您可能想将
    OneHotEncoder
    的参数更改为
    handle_unknown='ignore'
    。通过这样做,
    OneHotEndoder
    能够处理测试集中尚未出现在训练集中的类别。
© www.soinside.com 2019 - 2024. All rights reserved.