You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

DictVectorizer训练集特征学习及非Pipeline等价实现问题咨询

问题排查与正确实现方案

嘿,你的代码问题其实很典型——测试集的特征转换步骤用错方法了!

你看,在Pipeline里,DictVectorizer只会在训练数据上执行一次fit,学习训练集里的所有特征映射规则,之后对测试集只会做transform,保证训练和测试用的是同一套特征体系。但你自己写的代码里,对测试集调用了v.fit_transform(X_test),这相当于让DictVectorizer重新去测试集里学特征,这会导致:

  • 训练集和测试集的特征数量、顺序完全可能不一样
  • 模型训练时学的是一套特征,测试时面对的是另一套,分数肯定不对,甚至可能报错

给你修正后的正确代码:

# 初始化特征转换器
v = DictVectorizer(sparse=False)
# 仅在训练集上完成拟合+转换,学习特征规则
Xdv_train = v.fit_transform(X[:size])
# 测试集只做转换,严格复用训练集学到的特征映射
Xdv_test = v.transform(X_test)

# 初始化并训练分类器
clf = DecisionTreeClassifier(criterion='entropy')
clf.fit(Xdv_train, y[:size])
# 评估模型
score = clf.score(Xdv_test, y_test)

另外提个小细节:你原来代码里的clf.fit(Xdv[:size], y[:size])其实没必要切片,因为Xdv已经是X[:size]转换后的结果了,直接用转换好的训练集数据就行,避免搞混索引。

记住一个机器学习的核心原则:所有预处理的拟合操作(fit)都只能在训练数据上做,测试数据只做转换(transform),不然会引入数据泄露,还会破坏特征空间的一致性,这也是Pipeline能帮我们自动规避的坑~

内容的提问来源于stack exchange,提问作者torayeff

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.26 09:42:31