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