Python决策树分类算法学习

  • Post category:Python

Python决策树分类算法学习

决策树是一种常用的分类算法,它可以将数据集划分为多个类别。在本攻略中,我们将介绍如何使用Python实现决策树分类算法。

步骤1:导入

Python实现决策树分类算法之前,我们需要导入相关的库。在本攻略中,我们将使用NumPy库和Matplotlib库处理数据和可视化结果,使用sklearn库中的DecisionTreeClassifier类来实现决策树分类算法。

import numpy as np
import matplotlib.pyplot as plt
from sklearn.tree import DecisionTreeClassifier

步骤2:生成数据集

在实决策树分类算法之前,我们需要一个数据集。在本攻略中,我们将使用NumPy库中的random块来生成一个包含100个数据点的二维数据集。

np.random.seed(0)
X = np.random.randn(100, 2)
y = (X[:, 0] + X[:, 1] > 0).astype(int)

步骤3:训练模型

在使用sklearn库中的DecisionTreeClassifier类实现决策树分类算法之前,我们需要先创建一个DecisionTreeClassifier对象,并使用()方法来训练模型。

model = DecisionTreeClassifier()
model.fit(X, y)

步骤4:可视化结果

在使用sklearn库中的DecisionTreeClassifier类实现决策树分类算法之后,我们可以Matplotlib库来可视化分类结果。在本攻略中,我们使用不同色的散点图来表示不同类别的数据点,并使用一条直线来表示分类边界。

plt.scatter(X[y == 0, 0], X[y == 0, 1], color='red')
plt.scatter(X[y == 1, 0], X[y == 1, 1], color='blue')
x1_min, x1_max = X[:, 0].min(), X[:, 0].max()
x2_min, x2_max = X[:, 1].min(), X[:, 1].max()
xx1, xx2 = np.meshgrid(np.linspace(x1_min, x1_max), np.linspace(x2_min, x2_max))
Z = model.predict(np.c_[xx1.ravel(), xx2.ravel()])
Z = Z.reshape(xx1.shape)
plt.contour(xx1, xx2, Z, colors='black')
plt.show()

完整代码

import numpy as np
import matplotlib.pyplot as plt
from sklearn.tree import DecisionTreeClassifier

# 生成数据集
np.random.seed(0)
X = np.random.randn(100, 2)
y = (X[:, 0] + X[:, 1] > 0).astype(int)

# 训练模型
model = DecisionTreeClassifier()
model.fit(X, y)

# 可视化结果
plt.scatter(X[y == 0, 0], X[y == 0, 1], color='red')
plt.scatter(X[y == 1, 0], X[y == 1, 1], color='blue')
x1_min, x1_max = X[:, 0].min(), X[:, 0].max()
x2_min, x2_max = X[:, 1].min(), X[:, 1].max()
xx1, xx2 = np.meshgrid(np.linspace(x1_min, x1_max), np.linspace(x2_min, x2_max))
Z = model.predict(np.c_[xx1.ravel(), xx2.ravel()])
Z = Z.reshape(xx1.shape)
plt.contour(xx1, xx2, Z, colors='black')
plt.show()

示例说明

在示例代码,我们首先生成了一个包含100个数据点的二维数据集接着,我们使用sklearn库中的DecisionTreeClassifier类来实现决策树分类算法,并使用fit()方法来训练模型。然后,我们使用Matplotlib库来可视化分类结果,其中同颜色的散点图表示不同类别的数据,黑色的直线表示分类边界。

在这个示例中,我们使用了NumPy库和Matplotlib库来处理数据和可视化结果。我们还使用了sklearn库中的DecisionTreeClassifier类来实现决策树分类算法,并使用fit()方法来训练模型。我们还使用了np.meshgrid()函数来生成网格点,并predict()方法来预测每个网格点的类别。最后,我们使用Matplotlib库来可视化分类结果,其中不同颜色的散点图表示不同别的数据点,黑色的直线表示分类边界。

示例2:使用自定义函数实现决策分类算法

除了使用sklearn库中的DecisionTreeClassifier类实现决策树分类算法,我们还可以使用自定义函数来实现决策分类算法。下面是一个使用自定义函数实现决策树分类算法的示例代码。

def entropy(y):
    _, counts = np.unique(y, return_counts=True)
    p = counts / len(y)
    return -np.sum(p * np.log2(p))

def split(X, y, feature, threshold):
    left_mask = X[:, feature] < threshold
    right_mask = X[:, feature] >= threshold
    left_X, left_y = X[left_mask], y[left_mask]
    right_X, right_y = X[right_mask], y[right_mask]
    return left_X, left_y, right_X, right_y

def information_gain(X, y, feature, threshold):
    left_X, left_y, right_X, right_y = split(X, y, feature, threshold)
    p = len(left_y) / len(y)
    left_entropy = entropy(left_y)
    right_entropy = entropy(right_y)
    return entropy(y) - p * left_entropy - (1 - p) * right_entropy

def best_split(X, y):
    best_feature, best_threshold, best_gain = None, None, 0
    for feature in range(X.shape[1]):
        thresholds = np.unique(X[:, feature])
        for threshold in thresholds:
            gain = information_gain(X, y, feature, threshold)
            if gain > best_gain:
                best_feature, best_threshold, best_gain = feature, threshold, gain
    return best_feature, best_threshold

class Node:
    def __init__(self, X, y, depth=0, max_depth=None):
        self.X = X
        self.y = y
        self.depth = depth
        self.max_depth = max_depth
        self.feature = None
        self.threshold = None
        self.left = None
        self.right = None
        self.predicted_class = None
        self.calculate_predicted_class()

    def calculate_predicted_class(self):
        self.predicted_class = np.bincount(self.y).argmax()

    def split(self):
        if self.depth == self.max_depth:
            return
        best_feature, best_threshold = best_split(self.X, self.y)
        if best_feature is None or best_threshold is None:
            return
        left_X, left_y, right_X, right_y = split(self.X, self.y, best_feature, best_threshold)
        if len(left_y) == 0 or len(right_y) == 0:
            return
        self.feature = best_feature
        self.threshold = best_threshold
        self.left = Node(left_X, left_y, self.depth + 1, self.max_depth)
        self.right = Node(right_X, right_y, self.depth + 1, self.max_depth)

    def predict(self, X):
        if self.feature is None or self.threshold is None:
            return self.predicted_class
        if X[self.feature] < self.threshold:
            return self.left.predict(X)
        else:
            return self.right.predict(X)

class DecisionTree:
    def __init__(self, max_depth=None):
        self.max_depth = max_depth

    def fit(self, X, y):
        self.root = Node(X, y, max_depth=self.max_depth)
        self.root.split()

    def predict(self, X):
        return np.array([self.root.predict(x) for x in X])

在这个示例中,我们首先定义了entropy()函数来计算熵,定义了split()函数来划分数据集,定义了information_gain()函数来计算信息增益,定义了best_split()函数来找到最佳划分点,定义了Node类来决策树的节点,定义了DecisionTree类来表示决策树。然后,我们使用DecisionTree类来训练模型,并使用Matplotlib库来可视化分类结果。

在这个示例中,我们使用了NumPy库和Matplotlib库来处理数据和可视化结果。我们还使用了自定义函数来实现决策树分类算法,并使用信息增益来选择最佳划分点。我们还使用了Node类来表示决策树的节点,并使用递归的方式来构建决策树。最后,我们使用Matplotlib库来可视化分类结果,其中不同颜色的散点图表示不同别的数据点,黑色的直线表示分类边界。

示例说明

在示例代码,我们首先定义了entropy()函数来计算熵,了split()函数来划分数据集,定义了information_gain()函数来计算信息增益,定义了best_split()函数来找到最佳划分点,定义了Node类来表示决策树的节点,定义了DecisionTree类来表示决策树。然后,我们使用Decision类来训练模型,并使用Matplotlib库来可视化分类结果。

在这个示例中,我们使用了NumPy库和Matplotlib库来处理数据和可视化结果。我们还使用了自定义函数来实现决策树分类算法,并使用信息增益来选择最佳划分点。还使用了Node类来表示决策树的节点,并使用递归的方式来构建决策树。最后,我们使用Matplotlib库来可视化结果,其中不同颜色的散点图表示不同类别的数据点,黑色的直线表示分类边界。

示例2:使用sklearn库中的iris数据集

除了使用自定义函数实现决策树分类算法,我们还可以sklearn库中的DecisionTreeClassifier类来实现决策树分类算法。下面是一个使用sklearn库中的iris数据集的示例代码。

from sklearn.datasets import load_iris
from sklearn.tree import DecisionTreeClassifier
from sklearn.model_selection import train_test_split
from sklearn.metrics import accuracy_score

# 加载数据集
iris = load_iris()
X = iris.data
y = iris.target

# 划分数据集
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=0)

# 训练模型
model = DecisionTreeClassifier()
model.fit(X_train, y_train)

# 预测结果
y_pred = model.predict(X_test)

# 计算准确率
accuracy = accuracy_score(y_test, y_pred)
print('Accuracy:', accuracy)

在这个示例中,我们首先使用sklearn库中的load_iris()来加载iris数据集。接着,我们使用train_test_split()函数来划分数据集为训练集和测试集。然后,我们使用DecisionTreeClassifier类来实现决策树分类算法,并使用fit()方法来训练模型。接着,我们使用predict()方法来预测测试集的结果,并使用accuracy_score()函数来计算准确率。

在这个示例中,我们使用了sklearn库中的DecisionTreeClassifier类来实现决策树分类算法,并使用train_test_split()函数来划分数据集为训练集和测试集。我们还使用了accuracy_score()函数来计算准确。