SVM+HOG目标检测器单样本预测时StandardScaler使用问题咨询
问题成因
- 预测阶段标准化逻辑错误:
StandardScaler的核心作用是使用训练集的统计量(均值、标准差)对所有输入特征做统一尺度变换,你在批量预测时重新针对测试集拟合新的标准化器属于完全不符合规范的操作,只是因为批量测试集的特征分布和训练集接近,才碰巧得到了正常结果。当测试样本仅有1个时,新拟合的标准化器得到的标准差为0,变换后的特征全部变为0,和模型训练时见过的特征分布完全不匹配,自然输出无效结果。 - 训练阶段代码存在逻辑漏洞:你在训练环节已经对全量特征做了标准化得到
scaled_X,但划分训练集、测试集时依然使用未标准化的原始特征,相当于SVM是在未做标准化的特征上训练的,进一步放大了预测阶段的特征分布差异问题。
解决方案
步骤1:修正训练阶段代码,保留训练拟合的标准化器
训练阶段必须仅使用训练集拟合标准化器,避免数据泄露,同时将拟合好的X_scaler留存下来供预测阶段使用,修正后代码如下:
import numpy as np from sklearn.preprocessing import StandardScaler from sklearn.model_selection import train_test_split # 训练集原始特征与标签 features = 所有训练集提取的HOG特征列表 labels = 对应标注标签 # 先划分训练集、测试集,避免数据泄露 rand_state = np.random.randint(0, 100) X_train, X_test, y_train, y_test = train_test_split(np.array(features), labels, test_size=0.3, random_state=rand_state) # 仅用训练集拟合标准化器 X_scaler = StandardScaler().fit(X_train) # 对训练集、测试集分别做标准化变换 X_train_scaled = X_scaler.transform(X_train) X_test_scaled = X_scaler.transform(X_test) # 用标准化后的训练集训练SVM clf.fit(X_train_scaled, y_train) # 训练完成后X_scaler必须保留,预测阶段直接使用
步骤2:修正预测阶段的标准化逻辑
不管是批量预测还是单样本预测,都直接使用训练阶段留存的X_scaler做变换,绝对不要重新拟合新的标准化器,单样本预测代码如下:
# 提取单个样本的HOG特征 test_feature = 单样本提取得到的HOG特征列表 # 调整特征维度为(1, 特征维度),适配sklearn的输入要求 test_feature_arr = np.array(test_feature).reshape(1, -1) # 用训练阶段留存的标准化器做变换,无需重新fit scaled_test_feature = X_scaler.transform(test_feature_arr) # 执行预测 y_pred = clf.predict(scaled_test_feature)
内容的提问来源于stack exchange,提问作者sensationti
相关产品推荐
相关产品推荐

