我对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()
。