做文本分类时,保存训练好的模型后,在另一个脚本使用这个模型时
1. 需要对测试文本进行和训练时一样的归一化、降维吗?
2. 若一样,那是需要在训练模型的工程里额外保存fit的均值方差等值吗?我有查到说fit(X_train)会返回一个对象,含有mean_和scale_等参数。可是我输出时会报错
比如vec = TfidfVectorizer(ngram_range=(1, 2), analyzer='char').fit(X_train)输出vec.mean_报错has no attribute ‘mean_'
selector = SelectKBest(f_classif, k=1000)
selector.fit(X_train_vec, y_train)
训练集和验证集进行了上述两种降维,另一个脚本里的测试集怎么才能和模型的维度一样?
在文本分类任务中,当你在一个脚本中训练模型并保存它,然后在另一个脚本中使用该模型时,确实需要对测试文本执行与训练时相同的预处理步骤,包括归一化和降维。为了确保在两个脚本中使用相同的预处理参数,可以采用以下方法:
mean_
属性。TfidfVectorizer
本身就是一个转换器,你可以直接在另一个脚本中使用训练时的 vectorizer 对测试文本进行转换。将训练好的 vectorizer 保存为一个单独的文件,比如使用 Python 的 pickle
模块。在另一个脚本中,你可以加载保存的 vectorizer,然后使用 transform
方法对测试文本进行转换。训练脚本:
import pickle
from sklearn.feature_extraction.text import TfidfVectorizer
vectorizer = TfidfVectorizer(ngram_range=(1, 2), analyzer='char')
X_train_vec = vectorizer.fit_transform(X_train)
# 保存 vectorizer
with open('vectorizer.pkl', 'wb') as f:
pickle.dump(vectorizer, f)
测试脚本:
import pickle
# 加载 vectorizer
with open('vectorizer.pkl', 'rb') as f:
loaded_vectorizer = pickle.load(f)
X_test_vec = loaded_vectorizer.transform(X_test)
训练脚本:
import pickle
from sklearn.feature_selection import SelectKBest, f_classif
selector = SelectKBest(f_classif, k=1000)
X_train_selected = selector.fit_transform(X_train_vec, y_train)
# 保存 selector
with open('selector.pkl', 'wb') as f:
pickle.dump(selector, f)
测试脚本:
import pickle
# 加载 selector
with open('selector.pkl', 'rb') as f:
loaded_selector = pickle.load(f)
X_test_selected = loaded_selector.transform(X_test_vec)
这样,在测试脚本中,你可以确保测试集的预处理和训练集保持一致。