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

决策树在稀疏/非稀疏数据集上的验证准确率疑问与原理探究

关于稀疏特征下决策树过拟合的实验分析与解答

实验背景

有观点提到决策树在存在稀疏特征时会过拟合数据,为验证这一点,设计了如下实验:在仅含单个feature属性和二分类标签y的数据集上拟合决策树,对比两种场景的平均验证准确率:

  • 数据集稀疏(feature列多数值为0)
  • 数据集非稀疏

实验代码

import random
import pandas as pd
from sklearn.tree import DecisionTreeClassifier
from sklearn.model_selection import train_test_split
from sklearn.metrics import accuracy_score


def accuracy_for_given_percentage_of_sparse_data(percentage_of_sparse_data):
    n = 1000  # size of the dataframe or number of datapoints

    number_of_sparse_datapoints = int(percentage_of_sparse_data * n)
    number_of_non_sparse_datapoints = n - number_of_sparse_datapoints

    average_accuracy = 0
    number_of_runs = 1000

    for run in range(0, number_of_runs):
        # Setting 0s as values of feature
        feature = [0 for i in range(0, number_of_sparse_datapoints)]

        # Setting some random non zero values for feature
        for i in range(0, number_of_non_sparse_datapoints):
            feature.append(random.randint(1, 50))

        # Generate the random binary class labels
        y = [random.randint(0, 1) for i in range(0, n)]

        d = {
            'feature': feature,
            'y': y
        }

        df = pd.DataFrame(data=d)
        clf = DecisionTreeClassifier(criterion="gini", splitter='best', class_weight='balanced')

        feature_cols = ['feature']
        X = df[feature_cols]
        y = df.y

        X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.33, random_state=42)

        # Train Decision Tree Classifer
        clf = clf.fit(X_train, y_train)

        average_accuracy += accuracy_score(y_test, clf.predict(X_test))

    return average_accuracy / number_of_runs


print("Average accuracy for sparse data: ", accuracy_for_given_percentage_of_sparse_data(0.9))
print("Average accuracy for non-sparse data: ", accuracy_for_given_percentage_of_sparse_data(0.1))

实验输出

Average accuracy for sparse data:  0.5015030303030307
Average accuracy for non-sparse data:  0.5009696969696967

问题解答

1. 两种场景准确率无明显差异的原因

实验的核心疏漏在于生成的特征与标签完全独立,不存在任何关联:

  • 标签y是完全随机生成的,和feature的取值没有任何统计相关性。这种情况下,不管feature是否稀疏,决策树都无法从数据中学到有效的预测模式,训练时只能拟合噪声,而测试集的预测结果本质是随机猜测,准确率自然接近二分类的随机水平(0.5),因此两种场景不会有明显差异。
  • 额外补充:即使设置了class_weight='balanced',但由于数据本身无关联,该参数无法改变模型的随机预测本质;单特征的实验设计也限制了决策树的分裂空间,但核心问题还是特征与标签的独立性。

2. 决策树在稀疏特征下过拟合的数学直觉

决策树的核心目标是通过特征分裂最小化节点的不纯度(如Gini系数、熵),稀疏特征的特性会放大其过拟合风险:

  • 稀疏特征的样本分布极端:大部分样本为0,仅少数样本为非零值。决策树在分裂时,会倾向于把这些少数非零样本单独划分为一个节点——只要这些样本的标签在训练集中恰好呈现一致(哪怕只是偶然的噪声),该节点的不纯度会被降到极低,符合决策树的优化目标。
  • 但这种分裂是针对训练集的偶然情况拟合的,而非数据的真实模式。当测试集中出现非零值样本时,其标签可能和训练集的偶然情况不符,导致预测错误,体现为模型过拟合。
  • 从数学角度看,稀疏特征的非零子集样本量极小,节点不纯度的计算容易被小样本的随机波动主导,决策树会过度拟合这些波动,而忽略整体数据的分布规律。

内容的提问来源于stack exchange,提问作者Deepak Tatyaji Ahire

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.28 22:20:47