2

我对这里的 sk-learn 和机器学习比较陌生,所以请原谅任何可能的无知。我正在制作一个模型来根据文本描述(在 python 中)对资产进行分类。只有一个预测变量(文本)和一个预测变量(类别)。对于标签,我正在分解类别,大约有 30 个,所以每个都由一个从 0 到 29 的数字表示。对于特征,我使用的是 tf-idf 分数。建模和准确性都很好,我正在使用泡菜转储保存模型。

但是,模型需要可重用,因此它必须能够在某个时间点再次加载,以便标记一组新数据。请参阅下面的模型保存/加载代码。

## Save the linear SVC model
filename = 'SVM_model.sav'
pickle.dump(model, open(filename, 'wb'))

## Load model and test prediction accuracy
tfidf = TfidfVectorizer(analyzer='word',sublinear_tf=True, min_df=3, 
norm='l2', ngram_range=(1, 2), encoding='latin-1', stop_words='english')
testdf=pd.read_excel('learning_df.xlsx').tail(54068)
testdf['input']=testdf['item_description'].astype(str)+'- 
'+testdf['category_name_client'].astype(str)
testdf=testdf[['input','category_id_D&P']].dropna()
testdf['factor']=testdf['category_id_D&P'].apply(lambda x: cat_dict[x])
loaded_model = pickle.load(open(filename, 'rb'))
X_test1=tfidf.fit_transform(testdf.input).toarray()
y_test1=testdf['factor']
result = loaded_model.score(X_test1, y_test1)
print(result)

请注意,tfidf 矢量化设置与模型训练/验证的设置完全相同。cat_dict 是类别的初始分解,在这里我只是确保将文本类别转换为与模型训练/验证的数字相同的数字。

当我尝试这样做时,我遇到了这个错误:

ValueError: X has 24008 features per sample; expecting 20012

这是可以理解的,因为新数据集的 tf-idf 不会产生与最初使用的训练/验证数据集相同数量的特征。

所以我想知道是否有解决方法?在训练模型时我不应该首先使用 tf-idf 吗?如果不是,那么以后不会导致此问题的特征选择的替代方法是什么?

提前感谢,如果我遗漏了一些明显的东西,再次抱歉。

4

1 回答 1

2

您无法安装新的矢量化器,因为您不会选择与以前相同的功能。您需要停止使用.fit_transform(),而是使用.fit(),保存矢量化器,然后在每个数据集上运行完全相同的拟合矢量化器.transform()

于 2018-11-16T16:51:58.440 回答