《机器学习》从入门到实战——决策树
目录
一、简介
二、基本结构
三、构建过程
四、API接口解析
1、决策树--分类
(1)、接口调用方法
(2)、参数解析
2、决策树--回归
(1)、接口调用方法
(2)、参数解析
五、代码实践
1、决策树--分类
结果展示:
2、决策树--回归
结果展示:
一、简介
决策树是一种常用的机器学习算法,广泛应用于分类和回归任务。它通过递归地将数据集划分为更纯的子集,构建树状结构来进行决策。每个内部节点表示一个特征或属性的测试,每个分支代表一个可能的测试结果,而每个叶节点则代表一个类别(分类任务)或一个值(回归任务)。
决策树通过对训练样本的学习,并建立分类规则,然后依据分类规则,对新样本数据进行分类预测,属于有监督学习。
二、基本结构
-
节点:
-
根节点:树的起始点,包含整个数据集。
-
内部节点:表示一个特征或属性的测试,根据测试结果将数据划分到不同的子节点。
-
叶节点:表示最终的决策结果(类别或值)。
-
-
分支:从一个节点到另一个节点的路径,表示一个特征测试的结果。
-
划分准则:用于选择最佳特征进行划分的准则,常见的准则有信息增益、信息增益比、基尼指数等。
三、构建过程
决策树的构建过程通常包括以下步骤:
-
特征选择:从所有特征中选择一个最佳特征作为当前节点的划分标准。常用的特征选择方法有:
-
信息增益(ID3算法):选择信息增益最大的特征。
-
信息增益比(C4.5算法):对信息增益进行归一化处理,避免偏向取值较多的特征。
-
基尼指数(CART算法):选择基尼指数最小的特征。
-
-
节点划分:根据选择的特征将数据集划分为若干子集,每个子集对应一个分支。
-
递归构建:对每个子集递归地重复上述过程,直到满足停止条件(如节点中的样本属于同一类别、样本数小于阈值、树的深度达到预设值等)。
-
剪枝:为了防止过拟合,可以对生成的决策树进行剪枝,去掉一些不必要的分支。
四、API接口解析
1、决策树--分类
(1)、接口调用方法
from sklearn.tree import DecisionTreeClassifier
# 创建决策树分类器
clf = DecisionTreeClassifier()
# 训练模型
clf.fit(X_train, y_train)
# 预测
y_pred = clf.predict(X_test)
(2)、参数解析
参数名 | 说明 |
---|---|
criterion | 衡量分割质量的函数。 可选值: - "gini" :基尼系数(默认)。- "entropy" :信息增益。 |
splitter | 选择分割策略。 可选值: - "best" :选择最佳分割(默认)。- "random" :随机选择分割。 |
max_depth | 树的最大深度。 如果不设置,树会一直生长直到所有叶子节点纯净或达到其他停止条件。 |
min_samples_split | 分割内部节点所需的最小样本数。 默认是 2。 |
min_samples_leaf | 叶子节点所需的最小样本数。 默认是 1。 |
min_weight_fraction_leaf | 叶子节点所需的最小权重比例(基于样本权重)。 默认是 0。 |
max_features | 寻找最佳分割时考虑的最大特征数。 可以是整数、浮点数或 "auto" 、"sqrt" 、"log2" 等。默认是 "auto" (即所有特征)。 |
random_state | 随机种子,用于控制随机性(如 splitter="random" 时)。 |
max_leaf_nodes | 最大叶子节点数。 如果不设置,则不限制叶子节点数。 |
min_impurity_decrease | 如果分割导致不纯度的减少大于该值,则进行分割。 默认是 0。 |
class_weight | 类别权重,用于处理不平衡数据集。 可以是 "balanced" 或字典形式。默认是 None 。 |
ccp_alpha | 用于最小代价复杂度剪枝的正则化参数。 默认是 0(不剪枝)。 |
2、决策树--回归
(1)、接口调用方法
from sklearn.tree import DecisionTreeRegressor
# 创建决策树回归器
clf = DecisionTreeRegressor()
# 训练模型
clf.fit(X_train, y_train)
# 预测
y_pred = clf.predict(X_test)
(2)、参数解析
参数名 | 说明 |
---|---|
criterion | 衡量分割质量的函数。 可选值: - "squared_error" :均方误差(默认)。- "friedman_mse" :改进的均方误差。- "absolute_error" :绝对误差。- "poisson" :泊松偏差。 |
splitter | 选择分割策略。 可选值: - "best" :选择最佳分割(默认)。- "random" :随机选择分割。 |
max_depth | 树的最大深度。 如果不设置,树会一直生长直到所有叶子节点纯净或达到其他停止条件。 |
min_samples_split | 分割内部节点所需的最小样本数。 默认是 2。 |
min_samples_leaf | 叶子节点所需的最小样本数。 默认是 1。 |
min_weight_fraction_leaf | 叶子节点所需的最小权重比例(基于样本权重)。 默认是 0。 |
max_features | 寻找最佳分割时考虑的最大特征数。 可以是整数、浮点数或 "auto" 、"sqrt" 、"log2" 等。默认是 "auto" (即所有特征)。 |
random_state | 随机种子,用于控制随机性(如 splitter="random" 时)。 |
max_leaf_nodes | 最大叶子节点数。 如果不设置,则不限制叶子节点数。 |
min_impurity_decrease | 如果分割导致不纯度的减少大于该值,则进行分割。 默认是 0。 |
ccp_alpha | 用于最小代价复杂度剪枝的正则化参数。 默认是 0(不剪枝)。 |
五、代码实践
1、决策树--分类
import pandas as pd
import matplotlib.pyplot as plt
from sklearn.metrics import confusion_matrix
from sklearn.model_selection import train_test_split
from sklearn import tree
from sklearn import metrics
from sklearn.tree import plot_tree
# 绘制混淆矩阵函数
def cm_plot(y, yp):
cm = confusion_matrix(y, yp) # 计算混淆矩阵
plt.matshow(cm, cmap=plt.cm.Blues) # 使用蓝色调绘制混淆矩阵
plt.colorbar() # 添加颜色条
for x in range(len(cm)):
for y in range(len(cm)):
# 在每个单元格中标注数值
plt.annotate(cm[x, y], xy=(x, y), horizontalalignment='center', verticalalignment='center')
plt.ylabel('True label') # 设置y轴标签
plt.xlabel('Predicted label') # 设置x轴标签
return plt
datas = pd.read_excel('./data/电信客户流失数据.xlsx')
data = datas.iloc[:,:-1]
target = datas.iloc[:,-1]
"""划分数据集"""
data_train,data_test,target_train,target_test = \
train_test_split(data,target,test_size=0.2,random_state=42)
dtr = tree.DecisionTreeClassifier(criterion='gini',max_depth=10,min_samples_leaf=5,random_state=42)
dtr.fit(data_train,target_train)
'''训练集混淆矩阵'''
# 训练集预测
train_predict = dtr.predict(data_train)
metr = metrics.classification_report(target_train,train_predict)
'''测试集混淆矩阵'''
test_predicted = dtr.predict(data_test)
metr1 = metrics.classification_report(target_test,test_predicted)
print(metr1)
cm_plot(target_test,test_predicted).show()
dtr.score(data_test,target_test)
# 绘制决策树
fig,ax = plt.subplots(figsize=(32,32))
plot_tree(dtr,filled=True,ax=ax)
plt.show()
结果展示:
2、决策树--回归
from sklearn.tree import DecisionTreeRegressor
import numpy as np
from sklearn import metrics
from sklearn.model_selection import train_test_split
data = np.loadtxt('../data/fangjia.txt')
x = data[:,:-1]
y = data[:,-1]
# 划分数据集
train_x,test_x,train_y,test_y = train_test_split(x,y,test_size=0.3,random_state=1)
reg = DecisionTreeRegressor(max_depth=10,
min_samples_leaf=1,
min_samples_split=3,
ccp_alpha=0.03,
max_features="auto",
random_state=42)
reg = reg.fit(train_x,train_y)
y_pr = reg.predict(test_x)
# print(y_pr)
print("R² Score:", metrics.r2_score(test_y, y_pr))
结果展示: