Python 使用tf-idf特征选择重用sklearn文本分类模型

Python 使用tf-idf特征选择重用sklearn文本分类模型,python,machine-learning,text-classification,tf-idf,tfidfvectorizer,Python,Machine Learning,Text Classification,Tf Idf,Tfidfvectorizer,我对sk学习和机器学习比较陌生,所以请原谅我可能的无知。我正在创建一个模型,根据文本描述(在python中)对资产进行分类。只有一个预测值(文本)和一个预测值(类别)变量。对于标签,我正在分解类别,大约有30个,因此每个类别都由0到29的数字表示。对于这些特性,我使用tf idf分数。建模和精度都很好,我正在使用pickle转储保存模型 但是,模型需要可重用,因此它必须能够在某个时间点再次加载,以便标记新的数据集。请参阅下面的模型保存/加载代码 ## Save the linear SVC mo

我对sk学习和机器学习比较陌生,所以请原谅我可能的无知。我正在创建一个模型,根据文本描述(在python中)对资产进行分类。只有一个预测值(文本)和一个预测值(类别)变量。对于标签,我正在分解类别,大约有30个,因此每个类别都由0到29的数字表示。对于这些特性,我使用tf idf分数。建模和精度都很好,我正在使用pickle转储保存模型

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

## 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?如果不是,有哪些特征选择的替代方法不会在以后导致此问题


提前感谢,如果我遗漏了一些明显的内容,请再次道歉。

您无法安装新的矢量器,因为您将无法选择与以前相同的功能。您需要停止使用
.fit\u transform()
而改为使用
.fit()
,保存矢量器,然后使用
.transform()

在每个数据集上运行完全相同的已安装矢量器。如果我正确阅读此代码,则需要使用已安装的
fit
模型,不要对新数据进行
fit_transform
,只要做
transform
,因为你不想在看不见的数据上重新安装经过训练的模型。非常感谢,从你的评论和答案中,我设法找到了答案!非常感谢,有道理!