文本分类,在另一个脚本里的测试集怎么保证和训练出的模型维度相同?

做文本分类时,保存训练好的模型后,在另一个脚本使用这个模型时

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)

训练集和验证集进行了上述两种降维,另一个脚本里的测试集怎么才能和模型的维度一样?

在文本分类任务中,当你在一个脚本中训练模型并保存它,然后在另一个脚本中使用该模型时,确实需要对测试文本执行与训练时相同的预处理步骤,包括归一化和降维。为了确保在两个脚本中使用相同的预处理参数,可以采用以下方法:

  1. 对于 TfidfVectorizer,你不能直接访问 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)
  1. 对于 SelectKBest,你同样需要将训练时的 selector 保存为一个单独的文件,然后在另一个脚本中加载它。这样,你可以确保使用相同的特征选择参数。

训练脚本:

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)

这样,在测试脚本中,你可以确保测试集的预处理和训练集保持一致。