重用带有 tf-idf 特征选择的 sklearn 文本分类模型
Reusing an sklearn text classification model with tf-idf feature selection
我对这里的 sk-learn 和机器学习还比较陌生,所以请原谅任何可能的无知。我正在制作一个模型来根据文本描述(在 python 中)对资产进行分类。只有一个预测变量(文本)和一个预测变量(类别)。对于标签,我正在分解类别,大约有 30 个,因此每个类别都由 0 到 29 之间的数字表示。对于特征,我使用的是 tf-idf 分数。建模和准确性都很好,我正在使用 pickle dump 保存模型。
但是,模型需要可重复使用,因此它必须能够在某个时间点再次加载,以便标记一组新数据。 saving/loading型号代码见下方
## 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 向量化器设置与模型 training/validation 的设置完全相同。 cat_dict 是类别的初始分解,在这里我只是确保将文本类别转换为与模型 trained/validated 相同的数字。
当我尝试这样做时,我遇到了这个错误:
ValueError: X has 24008 features per sample; expecting 20012
这是可以理解的,因为新数据集的 tf-idf 不会产生与最初使用的 training/validation 数据集相同数量的特征。
所以我想知道是否有解决方法?训练模型时我不应该首先使用 tf-idf 吗?如果不是,有哪些特征选择的替代方法不会在以后导致此问题?
提前致谢,如果我遗漏了一些明显的东西,再次抱歉。
您无法安装新的矢量化器,因为您不会选择与以前相同的功能。您需要停止使用 .fit_transform()
而是使用 .fit()
,保存矢量化器,然后 运行 在每个数据集上使用 .transform()
完全相同的拟合矢量化器
我对这里的 sk-learn 和机器学习还比较陌生,所以请原谅任何可能的无知。我正在制作一个模型来根据文本描述(在 python 中)对资产进行分类。只有一个预测变量(文本)和一个预测变量(类别)。对于标签,我正在分解类别,大约有 30 个,因此每个类别都由 0 到 29 之间的数字表示。对于特征,我使用的是 tf-idf 分数。建模和准确性都很好,我正在使用 pickle dump 保存模型。
但是,模型需要可重复使用,因此它必须能够在某个时间点再次加载,以便标记一组新数据。 saving/loading型号代码见下方
## 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 向量化器设置与模型 training/validation 的设置完全相同。 cat_dict 是类别的初始分解,在这里我只是确保将文本类别转换为与模型 trained/validated 相同的数字。
当我尝试这样做时,我遇到了这个错误:
ValueError: X has 24008 features per sample; expecting 20012
这是可以理解的,因为新数据集的 tf-idf 不会产生与最初使用的 training/validation 数据集相同数量的特征。
所以我想知道是否有解决方法?训练模型时我不应该首先使用 tf-idf 吗?如果不是,有哪些特征选择的替代方法不会在以后导致此问题?
提前致谢,如果我遗漏了一些明显的东西,再次抱歉。
您无法安装新的矢量化器,因为您不会选择与以前相同的功能。您需要停止使用 .fit_transform()
而是使用 .fit()
,保存矢量化器,然后 运行 在每个数据集上使用 .transform()