Python实现CART决策树算法及详细注释

1. CART决策树算法简介

CART(Classification and Regression Tree)决策树是一种流行的机器学习算法,它可以被用来解决分类和回归问题。决策树是一种基于树的模型,其中每个内部节点代表一个测试,在节点的每个分支上,我们考虑测试的不同结果。每个叶子节点代表一个类标签或者一个数值。

1.1 CART决策树算法的原理

CART决策树算法基于Top-Down递归的分治方法。最优决策树是以训练数据集为输入,采用信息熵或基尼系数最小化的方法构建的。构建决策树时,对训练集数据进行递归划分。从数据集最初的根节点开始,每次选择最优特征并对数据集进行拆分,直到满足预定的拆分条件。

1.2 CART决策树算法的分类和回归问题

CART决策树算法可以被用来解决两种类型的问题,分类和回归。分类问题中,目标变量是离散的;回归问题中,目标变量是连续的。

下面是分类和回归问题的处理过程,我们先来看分类问题:

#导入相关库

import pandas as pd

import numpy as np

from sklearn.tree import DecisionTreeRegressor

from sklearn.model_selection import train_test_split

#读取数据并进行预处理

data = pd.read_csv('data.csv')

data.dropna(subset=['target'], inplace=True)

#将数据拆分为训练和测试集

X_train, X_test, y_train, y_test = train_test_split(data.drop(['target'], axis=1), data['target'], test_size=0.33)

#标准化输入参数

normalize = False

#定义决策树模型并拟合

clf = DecisionTreeRegressor(random_state=0)

clf.fit(X_train, y_train)

#预测测试集

y_pred = clf.predict(X_test)

#输出结果

print("Accuracy:",np.mean(y_pred == y_test))

上述代码实现了一个简单的分类模型,在读取和预处理数据后,使用sklearn库的DecisionTreeRegressor类来定义并拟合模型。模型拟合后,预测测试集的目标值并计算准确率。

下面是一个回归问题的处理过程:

#导入相关库

import pandas as pd

import numpy as np

from sklearn.tree import DecisionTreeRegressor

from sklearn.model_selection import train_test_split

#读取数据并进行预处理

data = pd.read_csv('data.csv')

data.dropna(subset=['target'], inplace=True)

#将数据拆分为训练和测试集

X_train, X_test, y_train, y_test = train_test_split(data.drop(['target'], axis=1), data['target'], test_size=0.33)

#标准化输入参数

normalize = False

#定义决策树模型并拟合

clf = DecisionTreeRegressor(random_state=0)

clf.fit(X_train, y_train)

#预测测试集

y_pred = clf.predict(X_test)

#输出结果

print("Accuracy:",np.mean(y_pred == y_test))

这段代码与分类问题处理的代码基本相同。唯一的区别在于使用了DecisionTreeRegressor类中的score()函数,该函数计算预测值和测试集的平均绝对误差。因为回归问题中目标变量是连续的,所以这个误差计算参数也必须是连续的,而不能是离散的分类变量。

2. Python实现CART决策树算法

下面用Python来实现CART算法。思路是定义一个类来生成决策树,节点使用类中的字典来表示,该字典包含该节点使用的特征和特征值,以及指向该节点子树的指针。

2.1 实现步骤

为了实现决策树算法,我们将会使用以下步骤:

从数据集中选择最优特征;

根据该特征划分数据集;

对子树上的数据集递归地重复上述两个步骤,直到所有数据都被正确分类。

2.2 决策树生成代码

class DecisionTree():

def __init__(self):

self.tree = {}

def calc_gini(self, d, a):

gini = 0.0

total = np.sum(d)

if total == 0:

return 0

for c in np.unique(a):

gini += (np.sum(d[a == c]) / total) ** 2

return 1.0 - gini

def fit(self, X, y, min_samples_split=2):

def build_tree(X, y):

n_samples, n_features = X.shape

# 计算根节点的基尼指数

root_gini = self.calc_gini(np.ones(n_samples), y)

best_gain, best_feature_idx, best_feature_threshold = 0, None, None

#对数据集中的每个特征i

for idx_i in range(n_features):

feature_i_values = X[:, idx_i]

#对该特征值vi

for threshold in np.unique(feature_i_values):

#Split the dataset along the current feature using the threshold

a = X[:, idx_i] > threshold

left, right = y[a], y[~a]

if len(left) < min_samples_split or len(right) < min_samples_split:

continue

#Calculate the information gain

gain = root_gini - (self.calc_gini(np.ones(len(left)), left) + self.calc_gini(np.ones(len(right)), right)) / 2

#更新当前最优特征

if gain > best_gain:

best_gain, best_feature_idx, best_feature_threshold = gain, idx_i, threshold

#如果信息增益为0,设置该节点为叶子节点

if best_gain == 0:

return {'leaf': True, 'val': np.mean(y)}

#Split the dataset into two parts using the best feature and threshold

a = X[:, best_feature_idx] > best_feature_threshold

left, right = build_tree(X[a], y[a]), build_tree(X[~a], y[~a])

return {'leaf': False, 'idx': best_feature_idx, 't': best_feature_threshold, 'left': left, 'right': right}

#递归地构建决策树

self.tree = build_tree(X, y)

def predict(self, X):

if self.tree == {}:

return None

y_pred = np.zeros(X.shape[0])

for i in range(X.shape[0]):

node = self.tree

while not node.get('leaf'):

idx, t = node['idx'], node['t']

if X[i, idx] > t:

node = node['left']

else:

node = node['right']

y_pred[i] = node['val']

return y_pred

上述代码实现了一个名为DecisionTree的Python类,它包含fit()和predict()方法。fit()方法用于训练决策树,而predict()方法则用于预测新数据点。

3. 总结

本文详细地介绍了CART决策树算法,并展示了如何用Python来实现该算法。我们首先讲解了CART算法的原理以及用于分类和回归问题。然后,在第二部分中,我们通过定义一个Python类来实现决策树算法。类包含两个主要方法,fit()和predict()方法。fit()方法用于训练决策树,predict()方法用于预测一个新数据点的目标值。

决策树是一种容易理解和解释的机器学习算法。因此,它很受到业界的欢迎。在正确的情况下,决策树可以对新数据点进行高度准确的预测。如果您正在学习机器学习,并且想要深入了解决策树算法,那么这篇文章应该能够帮到您。

后端开发标签