重用带有tf-idf特征选择的sklearn文本分类模型

我对sk-learn和机器学习还比较新手,所以请原谅我的任何无知。我正在制作一个基于文本描述(用Python)对资产进行分类的模型。只有一个预测变量(文本)和一个被预测变量(类别)。对于标签,我对类别进行了因子化,大约有30个类别,每个类别由0到29之间的数字表示。对于特征,我使用了tf-idf得分。模型的构建和准确性都很好,我使用pickle.dump保存了模型。

然而,模型需要可重用,因此必须能够在某个时间点重新加载,以便为新的数据集打标签。请查看下面关于模型保存/加载的代码。

## 保存线性SVC模型filename = 'SVM_model.sav'pickle.dump(model, open(filename, 'wb'))## 加载模型并测试预测准确性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()

Related Posts

在使用k近邻算法时,有没有办法获取被使用的“邻居”?

我想找到一种方法来确定在我的knn算法中实际使用了哪些…

Theano在Google Colab上无法启用GPU支持

我在尝试使用Theano库训练一个模型。由于我的电脑内…

准确性评分似乎有误

这里是代码: from sklearn.metrics…

Keras Functional API: “错误检查输入时:期望input_1具有4个维度,但得到形状为(X, Y)的数组”

我在尝试使用Keras的fit_generator来训…

如何使用sklearn.datasets.make_classification在指定范围内生成合成数据?

我想为分类问题创建合成数据。我使用了sklearn.d…

如何处理预测时不在训练集中的标签

已关闭。 此问题与编程或软件开发无关。目前不接受回答。…

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注