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
相关产品推荐
相关产品推荐

