通过TF-IDF功能选择重用sklearn文本分类模型

时间:2018-11-16 16:46:15

标签: python machine-learning text-classification tf-idf tfidfvectorizer

我在这里是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吗?如果没有,那么什么是特征选择的替代方法,以后又不会导致此问题呢?

在此先感谢您,如果我遗漏了一些明显的内容,再次表示歉意。

1 个答案:

答案 0 :(得分:2)

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