决策树是一种常用的机器学习算法,它可以用于分类和回归任务。决策树的核心思想是通过对数据集的特征进行划分,构建一个树形结构,从而实现对样本的分类或预测。本文将详细介绍决策树的代码实现过程,帮助读者深入理解和掌握这一重要算法。
决策树由节点和边组成。节点分为内部节点和叶节点,内部节点表示一个特征上的测试,边表示测试输出,叶节点表示类别或值。决策树的构建过程就是不断选择最优特征进行划分,直到满足停止条件。常用的划分准则有信息增益、信息增益比、基尼指数等。
信息增益是基于信息熵的概念。信息熵是衡量数据不确定性的指标,信息增益表示划分前后信息熵的减少量。信息增益越大,说明该特征对分类的贡献越大。信息熵的计算公式为:
[H(D) = -\sum{k = 1}^{K}p{k}\log{2}p{k}]
其中,$D$ 是数据集,$K$ 是类别数,$p_{k}$ 是第 $k$ 类样本在数据集中所占的比例。
信息增益的计算公式为:
[g(D, A) = H(D) - H(D|A)]
其中,$A$ 是特征,$H(D|A)$ 是在特征 $A$ 给定的条件下数据集 $D$ 的条件熵。
import numpy as np
import pandas as pd
def entropy(y):
classes, counts = np.unique(y, return_counts=True)
probabilities = counts / len(y)
entropy_value = -np.sum(probabilities * np.log2(probabilities))
return entropy_value
def split_dataset(X, y, feature_index, value):
left_X = X[X[:, feature_index] == value]
left_y = y[X[:, feature_index] == value]
right_X = X[X[:, feature_index]!= value]
right_y = y[X[:, feature_index]!= value]
return left_X, left_y, right_X, right_y
def information_gain(X, y, feature_index):
parent_entropy = entropy(y)
total_samples = len(y)
unique_values = np.unique(X[:, feature_index])
weighted_entropy = 0
for value in unique_values:
left_X, left_y, right_X, right_y = split_dataset(X, y, feature_index, value)
prob = len(left_y) / total_samples
weighted_entropy += prob * entropy(left_y) + (1 - prob) * entropy(right_y)
return parent_entropy - weighted_entropy
def best_feature(X, y):
num_features = X.shape[1]
best_info_gain = 0
best_feature_index = -1
for i in range(num_features):
info_gain = information_gain(X, y, i)
if info_gain > best_info_gain:
best_info_gain = info_gain
best_feature_index = i
return best_feature_index
def create_tree(X, y, feature_names):
if len(np.unique(y)) == 1:
return np.unique(y)[0]
if X.shape[1] == 0:
return np.bincount(y).argmax()
best_feature_index = best_feature(X, y)
best_feature_name = feature_names[best_feature_index]
tree = {best_feature_name: {}}
unique_values = np.unique(X[:, best_feature_index])
new_feature_names = feature_names.copy()
new_feature_names.remove(best_feature_name)
for value in unique_values:
left_X, left_y, right_X, right_y = split_dataset(X, y, best_feature_index, value)
subtree = create_tree(left_X, left_y, new_feature_names)
tree[best_feature_name][value] = subtree
return tree
# 示例数据集
data = {
'Outlook': ['Sunny', 'Sunny', 'Overcast', 'Rain', 'Rain', 'Rain', 'Overcast', 'Sunny', 'Sunny', 'Rain', 'Sunny', 'Overcast', 'Overcast', 'Rain'],
'Temperature': ['Hot', 'Hot', 'Hot', 'Mild', 'Cool', 'Cool', 'Cool', 'Mild', 'Cool', 'Mild', 'Mild', 'Mild', 'Hot', 'Mild'],
'Humidity': ['High', 'High', 'High', 'High', 'Normal', 'Normal', 'Normal', 'High', 'Normal', 'Normal', 'Normal', 'High', 'Normal', 'High'],
'Wind': ['Weak', 'Strong', 'Weak', 'Weak', 'Weak', 'Strong', 'Strong', 'Weak', 'Weak', 'Weak', 'Strong', 'Strong', 'Weak', 'Strong'],
'Play': [0, 0, 1, 1, 1, 0, 1, 0, 1, 1, 1, 1, 1, 0]
}
df = pd.DataFrame(data)
X = df.iloc[:, :-1].values
y = df.iloc[:, -1].values
feature_names = df.columns[:-1].tolist()
# 创建决策树
tree = create_tree(X, y, feature_names)
print(tree)
本文通过详细的代码实现,介绍了决策树的构建过程。决策树是一种直观、易于理解的机器学习算法,适用于多种类型的数据。通过信息增益等划分准则,可以有效地选择最优特征,构建出高效的决策树模型。
函数名 | 功能 |
---|---|
entropy | 计算信息熵 |
split_dataset | 划分数据集 |
information_gain | 计算信息增益 |
best_feature | 选择最优特征 |
create_tree | 创建决策树 |
通过上述代码和解释,读者可以更好地理解决策树的工作原理,并能够根据实际需求进行修改和扩展。