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

基于sklearn的ID3算法决策树训练及相关技术问题咨询

关于ID3决策树训练与评估的疑问解答

嘿,作为刚入门的新手,你已经走得挺远了!针对你的三个疑问,我来逐一拆解:

1. 如何获取训练中使用的特征索引列表?

不用手动遍历树结构,scikit-learn的DecisionTreeClassifier提供了更直接的方式:

  • 方法一:利用**feature_importances_**属性。这个属性会返回每个特征的重要性得分,得分大于0的就是在决策树构建中被实际用到的特征。你可以用numpy快速筛选出这些特征的索引:
import numpy as np
# 注意:这里的clf是已经完成拟合的模型(比如执行过clf.fit(X_train, y_train)后的实例)
used_feature_indices = np.where(clf.feature_importances_ > 0)[0]
print("被使用的特征索引:", used_feature_indices)
  • 方法二:直接查看树结构的特征节点。决策树的tree_.feature属性会存储每个节点使用的特征索引(叶子节点用-2标记),你只需要过滤掉叶子节点后去重,就能得到所有被用到的特征:
used_feature_indices = np.unique(clf.tree_.feature[clf.tree_.feature != -2])
print("被使用的特征索引:", used_feature_indices)

需要注意的是:如果是用交叉验证(比如cross_val_score或cross_val_predict),每个折的模型可能会选择不同的特征。如果需要获取每个交叉验证折的特征使用情况,你需要手动用KFold循环每个折,拟合模型后提取特征索引:

kf = KFold(n_splits=4, random_state=0, shuffle=True)
for fold_num, (train_idx, val_idx) in enumerate(kf.split(X_train), 1):
    fold_clf = DecisionTreeClassifier(criterion='entropy', random_state=0)
    fold_clf.fit(X_train[train_idx], y_train[train_idx])
    fold_used_features = np.where(fold_clf.feature_importances_ > 0)[0]
    print(f"第{fold_num}折使用的特征索引:", fold_used_features)

2. 是否必须同时使用fit、cross_val_score和cross_val_predict?

这三个函数的作用完全不同,不是必须同时使用,要根据你的实际需求选择:

  • fit():让模型在指定数据集上完成训练,得到一个可以用于预测、可视化(比如你用export_graphviz导出决策树)的拟合后模型。
  • cross_val_score():执行交叉验证,返回每个折的性能评分(比如准确率),用来评估模型的稳定性和泛化能力——它会自动在每个折上重新拟合模型,不受你之前fit操作的影响。
  • cross_val_predict():执行交叉验证,返回每个样本在作为测试集时的预测值,用来计算混淆矩阵、ROC曲线等指标,同样会自动在每个折上重新拟合模型。

你的代码里有个小冗余:你先调用了clf.fit(X_train,y_train),但后续的cross_val_score和cross_val_predict会克隆传入的clf实例,在每个折上重新训练,所以之前的fit操作只对你后续导出决策树有用,对交叉验证的结果没有影响。

如果你的需求是:

  • 得到一个可用于部署/可视化的最终模型 + 交叉验证的准确率 + 交叉验证的混淆矩阵:可以先在训练集上fit模型,同时用cross_val_score在训练集上做交叉验证,再用cross_val_predict生成预测值计算混淆矩阵。
  • 只需要交叉验证的评估结果(准确率+混淆矩阵):不需要提前fit,直接用cross_val_score和cross_val_predict即可,传入未拟合的clf实例就行。

3. 应该使用测试集还是交叉验证的折分数据集进行评估?

这取决于你的评估阶段:

  • 交叉验证的折分数据集:用于模型调参、模型选择阶段。它能更可靠地评估模型的泛化能力,避免单次划分训练/测试集带来的随机性,帮你判断模型是否过拟合,或者在不同数据分布下的性能表现。
  • 独立测试集:用于最终模型的性能验证。当你确定了模型的参数、结构后,用一个从未被模型见过的独立测试集评估,得到的结果更接近模型在真实场景中的表现。

推荐的标准流程是:

  1. 用train_test_split把整个数据集划分为训练集(比如80%)和独立测试集(20%),测试集暂时搁置,不要用于任何模型训练或调参。
  2. 在训练集上做交叉验证,用来调优模型参数(比如决策树的最大深度、最小样本分割数等),选择最优模型。
  3. 用最优参数的模型在整个训练集上重新拟合,然后用独立测试集评估最终性能。

如果你的数据量很小,没有足够的数据划分独立测试集,可以直接用交叉验证的结果作为模型性能的估计。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.15 04:49:59