如何测试OneHotEncoder构建的pandas模型并传入单条VIN完成预测
实现方法
你需要完全复现训练阶段对VIN的预处理逻辑,核心是复用训练时已经拟合好的OneHotEncoder实例,不能重新训练编码器,具体步骤如下:
第一步:训练阶段留存预处理工具
你训练时的代码需要先把用到的编码器实例留存,不要丢弃,示例修正如下:
# 训练阶段的预处理代码,留存编码器 X_data = dataframe['VIN'].str.split(r"", expand=True).drop([0, 18], axis = 1) # 实例化编码器并拟合训练数据,将该实例留存用于后续预测 onehot_encoder = OneHotEncoder(sparse_output=False) # 若你之前用默认稀疏输出可去掉sparse_output参数 x_data_encoded = onehot_encoder.fit_transform(X_data)
第二步:单VIN预测逻辑
对输入的单个VIN字符串,按如下流程处理后传入模型即可:
import numpy as np def predict_vin_info(vin_str, encoder, model, model_label_mask, version_label_mask): # 1. 拆分VIN为单个字符,和训练时拆分逻辑完全对齐 # 拆分后得到长度为17的字符列表,对应训练时X_data的17列 vin_char_list = list(vin_str) # 转换为二维结构,符合编码器输入要求:(样本数, 特征数) 单样本就是(1,17) vin_input = [vin_char_list] # 2. 用训练好的编码器做编码,仅调用transform,禁止重新fit encoded_vin = encoder.transform(vin_input) # 若编码器输出为稀疏矩阵,需要加一行转稠密:encoded_vin = encoded_vin.toarray() # 3. 传入模型预测 pred_result = model.predict(encoded_vin, verbose=0) # 4. 解析预测结果 pred_model = model_label_mask[np.argmax(pred_result[0])] pred_version = version_label_mask[np.argmax(pred_result[1])] return { "车型": pred_model, "版本": pred_version } # 调用示例 target_vin = "WAUAFK8P0CA014105" result = predict_vin_info(target_vin, onehot_encoder, model, modelo_mask, versao_mask) print(result)
注意事项
- 预处理逻辑必须和训练阶段完全一致,VIN拆分后得到的17个字符顺序不能变
- 必须使用训练阶段拟合完成的
OneHotEncoder实例,若重新fit会导致编码规则变化,预测结果完全错误 - 单样本输入需要保证维度是
(1, 171),和训练时的特征维度对齐
内容的提问来源于stack exchange,提问作者Guilherme
相关产品推荐
相关产品推荐

