如何用Scikit-learn基于两个不同特征集训练决策树?
关于scikit-learn决策树多特征集训练的问题
首先明确:直接执行clf.fit(Z, Y)会完全覆盖之前基于X的训练结果。scikit-learn里的fit()方法是从头开始训练模型,每次调用都会重置模型的所有参数,用新传入的数据集重新学习,之前的训练数据和参数都会被丢弃,第二次fit之后,模型只记住了Z和对应的Y,和X没有任何关系。
你现在的核心问题是X和Z的特征维度不一致(X是2特征,Z是3特征),且样本数不同,没法直接合并。要同时用两个数据集训练,得按以下步骤处理:
- 统一特征维度:决策树要求所有输入样本的特征数量必须一致。要么给X补充一个特征列(比如补0、对应特征的均值,或根据业务逻辑补合理值),把X变成3维;要么给Z删掉一个特征列,降到2维。
- 合并数据集:维度统一后,把X和Z合并成一个大的特征矩阵,对应的标签Y也合并起来,再用合并后的数据集一次性训练。
举个代码例子(给X补0特征列):
import numpy as np from sklearn import tree # 第一个特征集 X = [[0, 0], [1, 1]] Y1 = ['a','b'] # 第二个特征集 Z = [[1,2,0.5],[2,1,0.5],[0.5,2,2]] Y2 = ['a','b','a'] # 给X补一个特征列,转为3维 X_3d = np.hstack([X, np.zeros((len(X), 1))]) # 合并特征矩阵与标签列表 combined_features = np.vstack([X_3d, Z]) combined_labels = Y1 + Y2 # 训练模型 clf = tree.DecisionTreeClassifier() clf.fit(combined_features, combined_labels)
如果不想修改特征维度,也可以考虑分别用X和Z训练两个决策树模型,之后通过模型融合(比如投票)来综合结果,但这是另一种思路,适合两个特征空间差异较大的场景。
内容的提问来源于stack exchange,提问作者Niki
相关产品推荐
相关产品推荐

