数据结构与算法之决策树 类别不平衡 加权节点 / 过采样 处理

数据结构与算法阿木 发布于 2025-07-12 7 次阅读


摘要:

在机器学习中,类别不平衡是一个常见的问题,特别是在分类任务中。当数据集中某些类别的样本数量远多于其他类别时,模型可能会偏向于多数类别,导致对少数类别的预测性能不佳。本文将探讨在决策树模型中如何通过加权节点和过采样技术来处理类别不平衡问题,并给出相应的代码实现。

关键词:决策树,类别不平衡,加权节点,过采样,机器学习

一、

决策树是一种常用的机器学习算法,广泛应用于分类和回归任务。当数据集存在类别不平衡时,传统的决策树模型可能会倾向于预测多数类别,从而忽略少数类别的特征。为了解决这个问题,本文将介绍两种处理策略:加权节点和过采样。

二、加权节点

加权节点是一种在决策树训练过程中对节点进行加权的方法。具体来说,在计算节点的不纯度(如基尼指数或信息增益)时,对每个类别赋予不同的权重。这样,模型在训练过程中会更多地关注少数类别,从而提高对少数类别的预测性能。

以下是一个使用Python的scikit-learn库实现加权节点的简单示例:

python

from sklearn.tree import DecisionTreeClassifier


from sklearn.datasets import make_classification


from sklearn.model_selection import train_test_split

生成一个类别不平衡的数据集


X, y = make_classification(n_samples=1000, n_features=20, n_informative=2,


n_redundant=10, n_clusters_per_class=1, weights=[0.99],


flip_y=0, random_state=1)

划分训练集和测试集


X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.3, random_state=1)

创建决策树模型,设置类别权重


class_weight = {0: 1, 1: 10} 假设类别0是少数类别


clf = DecisionTreeClassifier(class_weight=class_weight)

训练模型


clf.fit(X_train, y_train)

评估模型


print("Accuracy on training set:", clf.score(X_train, y_train))


print("Accuracy on test set:", clf.score(X_test, y_test))


三、过采样

过采样是一种通过增加少数类别样本数量来平衡数据集的方法。在决策树模型中,可以使用不同的过采样技术,如随机过采样、SMOTE(合成少数过采样技术)等。

以下是一个使用Python的imbalanced-learn库实现过采样的示例:

python

from sklearn.tree import DecisionTreeClassifier


from sklearn.datasets import make_classification


from sklearn.model_selection import train_test_split


from imblearn.over_sampling import SMOTE

生成一个类别不平衡的数据集


X, y = make_classification(n_samples=1000, n_features=20, n_informative=2,


n_redundant=10, n_clusters_per_class=1, weights=[0.99],


flip_y=0, random_state=1)

划分训练集和测试集


X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.3, random_state=1)

使用SMOTE进行过采样


smote = SMOTE(random_state=1)


X_train_res, y_train_res = smote.fit_resample(X_train, y_train)

创建决策树模型


clf = DecisionTreeClassifier()

训练模型


clf.fit(X_train_res, y_train_res)

评估模型


print("Accuracy on training set:", clf.score(X_train_res, y_train_res))


print("Accuracy on test set:", clf.score(X_test, y_test))


四、结论

本文介绍了在决策树模型中处理类别不平衡问题的两种技术:加权节点和过采样。通过加权节点,模型在训练过程中会更多地关注少数类别;而过采样则通过增加少数类别的样本数量来平衡数据集。这两种技术可以单独使用,也可以结合使用,以提高模型对少数类别的预测性能。

在实际应用中,选择合适的处理策略需要根据具体的数据集和任务需求进行评估。通过实验和比较,可以找到最适合当前问题的解决方案。