SGD分类器葡萄酒实验特征维度报错与评估输出重复问题
问题原因分析与解决方案
问题1:predict调用抛出特征维度不匹配错误
根因
模型训练阶段使用了葡萄酒数据集全部13个特征完成拟合,而绘制决策边界时构造的网格输入仅包含2个特征,与模型要求的输入特征维度不一致,触发报错。
修复方案
若需要绘制指定两个特征的决策边界,必须仅使用该组特征训练SGD分类器,不要用全量特征训练。调整训练逻辑:每选择一组特征对后,单独提取该组特征组成训练/测试集,再完成模型拟合,后续预测的输入维度即可匹配。
问题2:交叉验证指标不随特征对变化
根因
循环逻辑未随特征对切换更新输入模型的特征矩阵,始终使用全量特征或首次循环的特征对计算指标;或是指标变量未在每次循环中重置,每次打印的都是首次循环的计算结果。
修复方案
- 每次循环切换特征对时,重新提取对应两个特征生成新的特征矩阵
- 每次循环的交叉验证、指标计算逻辑都基于当前循环的特征矩阵完成,不得复用全局特征矩阵或之前循环的指标变量
- 检查打印逻辑,确认输出的是当前循环生成的指标结果,而非循环外定义的固定值
参考实现代码
from sklearn.datasets import load_wine from sklearn.linear_model import SGDClassifier from sklearn.model_selection import cross_val_score import numpy as np wine = load_wine() # 待测试的特征对列表 feature_pairs = [[0, 1], [0, 2], [2, 3]] clf = SGDClassifier(loss="log_loss", random_state=42) for pair in feature_pairs: # 每次循环重新提取当前特征对的数据集 X = wine.data[:, pair] y = wine.target # 基于当前特征计算指标 recall = cross_val_score(clf, X, y, scoring="recall_macro").mean() precision = cross_val_score(clf, X, y, scoring="precision_macro").mean() f1 = cross_val_score(clf, X, y, scoring="f1_macro").mean() print(f"特征对{pair} | 召回率:{recall:.3f} 精确率:{precision:.3f} F1:{f1:.3f}") # 拟合后生成决策边界 clf.fit(X, y) x_min, x_max = X[:, 0].min() - 1, X[:, 0].max() + 1 y_min, y_max = X[:, 1].min() - 1, X[:, 1].max() + 1 xx, yy = np.meshgrid(np.arange(x_min, x_max, 0.02), np.arange(y_min, y_max, 0.02)) Z = clf.predict(np.c_[xx.ravel(), yy.ravel()]) # 后续绘图逻辑自行补充
内容的提问来源于stack exchange,提问作者bugzoid
相关产品推荐
相关产品推荐

