python - 通过 tf-idf 特征选择重用 sklearn 文本分类模型

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

我对 sk-learn 和机器学习还比较陌生,所以请原谅任何可能的无知。我正在制作一个模型,根据文本描述(Python)对 Assets 进行分类。只有一个预测变量(文本)和一个预测变量(类别)。对于标签,我对类别进行因式分解,大约有 30 个,因此每个类别都由 0 到 29 之间的数字表示。对于特征,我使用 tf-idf 分数。建模和准确性都很好,我正在使用 pickle dump 保存模型。

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

## 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_transform() 并使用 .fit(),保存矢量化器,然后使用 在每个数据集上运行完全相同的拟合矢量化器>.transform()

关于python - 通过 tf-idf 特征选择重用 sklearn 文本分类模型,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53342128/

相关文章:

python - Scikit-Learn- 如何添加 'unclassified' 类别?

python-3.x - 如何在多文本分类中添加更多特征?

python - Django Serve .XLSX 文件并强制下载

python - Tensorflow 的开端——类的数量

algorithm - 在机器学习中使用图论的建议?

machine-learning - 聚类算法(如 Kmeans 和 EM)的特征缩放(归一化)

machine-learning - LDA 文本分类的良好训练数据?

python - 将 Windows 路径转换为 ​​Linux 路径

python - 类型错误 : request() missing 1 required positional argument: 'url' in urllib3

python - 趋势线图不适用于大数据集