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()函数来计算准确。