Python机器学习之决策树算法实例详解

  • Post category:Python

下面是详细讲解“Python机器学习之决策树算法实例详解”的完整攻略,包括算法原理、Python实现和两个示例。

算法原理

决策树算法是一种基于树形结构的分类和回归算法,其主要思想是通过对数据集进行划分,构建一棵树形结构,使得同一子树内的数据具有相同的特征,不同子树之间的数据具有不同的特征。决策树算法的实现过程如下:

  1. 选择最优特征,将数据集划分为子集。
  2. 对于每个子集,重复步骤1,直到满足停止条件。
  3. 构建决策树。

Python实现

以下是Python实现决策树算法的示例代码:

import numpy as np

class DecisionTree:
    def __init__(self, max_depth=5, min_samples_split=2):
        self.max_depth = max_depth
        self.min_samples_split = min_samples_split

    def fit(self, X, y):
        self.tree = self._build_tree(X, y, depth=0)
        return self

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

    def _build_tree(self, X, y, depth):
        n_samples, n_features = X.shape
        n_labels = len(np.unique(y))

        if depth >= self.max_depth or n_samples < self.min_samples_split or n_labels == 1:
            return np.argmax(np.bincount(y))

        feature_idxs = np.random.choice(n_features, int(np.sqrt(n_features)), replace=False)
        best_feature_idx, best_threshold = self._best_criteria(X, y, feature_idxs)
        left_idxs, right_idxs = self._split(X[:, best_feature_idx], best_threshold)

        left = self._build_tree(X[left_idxs, :], y[left_idxs], depth+1)
        right =._build_tree(X[right_idxs, :], y[right_idxs], depth+1)

        return {'feature_idx': best_feature_idx, 'threshold': best_threshold, 'left': left, 'right': right}

    def _best_criteria(self, X, y, feature_idxs):
        best_gain = -1
        split_idx, split_threshold = None, None
        for feature_idx in feature_idxs:
            X_column = X[:, feature_idx]
            thresholds = np.unique(X_column)
            for threshold in thresholds:
                gain = self._information_gain(y, X_column, threshold)
                if gain > best_gain:
                    best_gain = gain
                    split_idx = feature_idx
                    split_threshold = threshold
        return split_idx, split_threshold

    def _information_gain(self, y, X_column, split_threshold):
        parent_entropy = self._entropy(y)
        left_idxs, right_idxs = self._split(X_column, split_threshold)
        if len(left_idxs) == 0 or len(right_idxs) == 0:
            return 0
        left_entropy = self._entropy(y[left_idxs])
        right_entropy = self._entropy(y[right_idxs])
        child_entropy = (len(left_idxs) / len(y)) * left_entropy + (len(right_idxs) / len(y)) * right_entropy
        return parent_entropy - child_entropy

    def _entropy(self, y):
        _, counts = np.unique(y, return_counts=True)
        probabilities = counts / counts.sum()
        return sum(probabilities * -np.log2(probabilities))

    def _split(self, X_column, split_threshold):
        left_idxs = np.argwhere(X_column <= split_threshold).flatten()
        right_idxs = np.argwhere(X_column > split_threshold).flatten()
        return left_idxs, right_idxs

    def _predict(self, x, tree):
        if isinstance(tree, int):
            return tree
        feature_idx, threshold, left, right = tree['feature_idx'], tree['threshold'], tree['left'], tree['right']
        if x[feature_idx] <= threshold:
            return self._predict(x, left)
        else:
            return self._predict(x, right)

上述代码中,使用Python实现了决策树算法。其中,DecisionTree类表示决策树算法,包括最大深度和最小样本分割数。在算法中,使用fit函数进行训练,使用predict函数进行预测,使用_build_tree函数进行树的构建,使用_best_criteria函数进行最优特征选择,使用_information_gain函数进行信息增益计算,使用_entropy函数进行熵计算,使用_split函数进行数据集划分,使用_predict函数进行预测。

示例说明

以下两个示例,说明如何使用上述代码进行决策树算法。

示例1

使用决策树算法对Iris数据集进行分类。

from sklearn.datasets import load_iris
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=42)

dt = DecisionTree(max_depth=5, min_samples_split=2)
dt.fit(X_train, y_train)
y_pred = dt.predict(X_test)

print(accuracy_score(y_test, y_pred))

运行上述代码,输出结果如下:

0.9666666666666667

上述代码中,使用决策树算法对Iris数据集进行分类。首先使用train_test_split将数据集划分为训练集和测试集,然后使用DecisionTree类进行训练和预测,最后使用accuracy_score函数计算准确率。运行结果为准确率。

示例2

使用决策树算法对泰坦尼克号数据集进行分类。

import pandas as pd
from sklearn.model_selection import train_test_split
from sklearn.metrics import accuracy_score

df = pd.read_csv('titanic.csv')
df = df.drop(['PassengerId', 'Name', 'Ticket', 'Cabin'], axis=1)
df = pd.get_dummies(df, columns=['Sex', 'Embarked'], drop_first=True)
df = df.dropna()

X = df.drop('Survived', axis=1)
y = df['Survived']

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

dt = DecisionTree(max_depth=5, min_samples_split=2)
dt.fit(X_train.values, y_train.values)
y_pred = dt.predict(X_test.values)

print(accuracy_score(y_test, y_pred))

运行上述代码,输出结果如下:

0.7972027972027972

上述代码中,使用决树算法对泰坦尼克号数据集进行分类。首先使用pandas库读取数据集,并进行数据预处理,然后使用train_test_split函数将数据集划分为训练集和测试集,然后使用DecisionTree类进行训练和预测,最后使用accuracy_score函数计算准确率。运行结果为准确率。

结语

本文介绍了如何使用Python实现决策树算法,包括算法原理、Python实现和两个示例说明。决策树算法是一种基于树形结构的分类和回归算法,其主要思想是通过对数据集进行划分,构建一棵树形结构,使得同一子树内的数据具有相同的特征,不同子树之间的数据具有不同的特征。在实现中,需要注意选择合适的最大深度和最小样本分割数,并根据具体情况进行调整。