数据结构与算法之决策树 多分类问题 one vs rest / 层次划分 策略

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


摘要:

决策树是一种常用的机器学习算法,尤其在分类问题中表现出色。在多分类问题中,如何有效地构建决策树模型是一个关键问题。本文将深入探讨两种常见的多分类策略:One-vs-Rest和层次划分,并给出相应的代码实现,以帮助读者更好地理解这两种策略在决策树中的应用。

一、

多分类问题是指将数据集中的每个样本分类到多个类别中的一个。在多分类问题中,决策树算法可以通过不同的策略来处理。本文将介绍两种常见的策略:One-vs-Rest和层次划分,并分别给出Python代码实现。

二、One-vs-Rest策略

One-vs-Rest策略是一种简单而有效的方法,它将多分类问题转换为多个二分类问题。具体来说,对于每个类别,我们构建一个决策树,将其他所有类别作为负类。这样,每个决策树的目标就是将当前类别与所有其他类别区分开来。

1. 算法步骤

(1)对于每个类别,构建一个决策树,将其他所有类别作为负类。

(2)训练完成后,对于每个样本,计算其在每个决策树上的预测概率。

(3)选择概率最高的类别作为最终预测结果。

2. 代码实现

python

from sklearn.tree import DecisionTreeClassifier


from sklearn.datasets import load_iris


from sklearn.model_selection import train_test_split

加载数据集


data = load_iris()


X, y = data.data, data.target

划分训练集和测试集


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

One-vs-Rest策略


classifiers = []


for i in range(len(set(y_train))):


构建决策树


clf = DecisionTreeClassifier()


clf.fit(X_train[y_train != i], y_train[y_train != i])


classifiers.append(clf)

预测


y_pred = []


for i in range(len(X_test)):


probabilities = [clf.predict_proba([X_test[i]])[0][j] for j, clf in enumerate(classifiers)]


y_pred.append(probabilities.index(max(probabilities)))

评估模型


from sklearn.metrics import accuracy_score


print("Accuracy:", accuracy_score(y_test, y_pred))


三、层次划分策略

层次划分策略是一种更复杂的策略,它将多分类问题分解为多个二分类问题,并通过层次结构来组织这些二分类问题。这种方法可以减少冗余,提高模型的性能。

1. 算法步骤

(1)将多分类问题分解为多个二分类问题。

(2)构建一个层次结构,将二分类问题组织起来。

(3)从根节点开始,根据层次结构逐步进行分类。

2. 代码实现

python

from sklearn.tree import DecisionTreeClassifier


from sklearn.datasets import load_iris


from sklearn.model_selection import train_test_split

加载数据集


data = load_iris()


X, y = data.data, data.target

划分训练集和测试集


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

层次划分策略


def build_tree(X, y):


if len(set(y)) == 1:


return y[0]


mid = len(set(y)) // 2


left_tree = build_tree(X[y < mid], y[y < mid])


right_tree = build_tree(X[y >= mid], y[y >= mid])


return (left_tree, right_tree)

构建层次结构


tree = build_tree(X_train, y_train)

预测


def predict(tree, x):


if isinstance(tree, int):


return tree


left, right = tree


if x < left[0]:


return predict(left, x)


else:


return predict(right, x)

y_pred = [predict(tree, x) for x in X_test]

评估模型


print("Accuracy:", accuracy_score(y_test, y_pred))


四、结论

本文介绍了两种常见的多分类策略:One-vs-Rest和层次划分,并给出了相应的Python代码实现。通过实际案例,读者可以了解到这两种策略在决策树中的应用,以及如何根据具体问题选择合适的策略。在实际应用中,可以根据数据集的特点和需求,选择合适的策略来提高模型的性能。