文章目录
决策树
机器学习中的决策树算法是一种基本的分类与回归方法,它通过树状结构建立决策模型,以解决分类和回归问题。以下是对决策树算法的详细解析:
一、基本定义
决策树是一种直观的预测模型,它表示对象属性和对象值之间的一种映射关系。树中的每个节点表示某个对象,而每个分叉路径则代表某个可能的属性值,每个叶节点则对应从根节点到该叶节点所经历的路径所表示的对象的值。对于分类问题,决策树模型表示基于特征对实例进行分类的过程,可以认为是if-then规则的集合,也可以认为是定义在特征空间与类空间上的条件概率分布。
二、学习过程
决策树学习的算法通常是一个递归地选择最优特征,并根据该特征对训练数据进行分割,使得对各个子数据集有一个最好的分类的过程。这一过程对应着特征空间的划分,也对应着决策树的构建。常见的决策树学习算法包括ID3、C4.5和CART算法。
- ID3算法:
- 核心思想:以信息增益来度量特征选择,选择信息增益最大的特征进行分裂。
- 优点:理论清晰,方法简单,学习能力较强。
- 缺点:对可取值数目较多的属性有所偏好,只能处理分类问题,不能处理连续值属性,且没有剪枝策略,容易过拟合。
- C4.5算法:
- 核心思想:克服了ID3对特征数目的偏重这一缺点,引入信息增益率来作为分类标准。
- 优点:能够处理连续属性,且能够处理缺失值。
- 缺点:生成的决策树规模一般比ID3大。
- CART算法:
- 核心思想:使用基尼指数来选择特征进行分裂,且生成的决策树必须是二叉树。
- 优点:既可以用于分类也可以用于回归,生成的决策树规模相对较小。
- 缺点:在样本不平衡时,生成的决策树会偏向于那些样本数量多的类别。
我们在构建模型时,常用基尼指数判断类别即CART算法。
三、剪枝处理
决策树算法很容易过拟合,剪枝算法就是用来防止决策树过拟合,提高泛化性能的方法。剪枝分为预剪枝与后剪枝。
- 预剪枝:在决策树的生成过程中,对每个节点在划分前先进行评估,若当前的划分不能带来泛化性能的提升,则停止划分,并将当前节点标记为叶节点。预剪枝的不足在于可能过早地停止决策树的生长,导致模型欠拟合。
- 后剪枝:先从训练集生成一颗完整的决策树,然后自底向上对非叶节点进行考察,若将该节点对应的子树替换为叶节点,能带来泛化性能的提升,则将该子树替换为叶节点。后剪枝决策树通常比预剪枝决策树保留了更多的分枝,一般情形下,后剪枝决策树的欠拟合风险很小,泛化能力往往优于预剪枝决策树。但后剪枝决策树的训练时间开销较大。
我们在学习时,主要使用预剪枝,可以通过调整最大深度来调整数的生长。
四、决策树的特点
- 优点:
- 决策树模型容易理解,可解释性较好。
- 可以用于小数据集,时间复杂度较小。
- 可以处理多输入问题,对缺失值不敏感。
- 缺点:
- 在处理特征关联性比较强的数据时,表现得不太好。
- 当样本中各类别不均匀时,信息增益会偏向于那些具有更多数值的特征。
- 对连续性的字段比较难预测,容易出现过拟合。
- 当类别太多时,错误可能会增加得比较快。
综上所述,决策树算法是机器学习领域中的一种重要算法,它通过树状结构建立决策模型,以直观的方式展现分类或回归的过程和结果。在实际应用中,需要根据具体问题和数据集的特点选择合适的决策树算法及其剪枝策略。
五、构建模型
对于构建一个完整的模型,主要从以下两个方面进行:
- 训练模型
- 测试模型
训练模型
- 收集数据
链接:训练数据
提取码:7f7y
- 数据预处理
数据预处理主要有以下几个方面:读取数据、划分测试集与训练集:
import pandas as pd
import numpy as np
data = pd.read_excel("电信客户流失数据.xlsx")
data_x = data.drop("流失状态",axis = 1)
data_y = data.流失状态
from sklearn.model_selection import train_test_split
data_train,data_test,target_train,target_test = \
train_test_split(data_x,data_y,test_size=0.2,random_state=0) #从原始数据中,划分测试集与训练集
- 调参,交叉验证
交叉验证(Cross-Validation)是一种评估统计分析模型性能的方法,特别是在预测模型中非常有用。它通过重复使用数据子集来训练模型并测试模型,以评估模型对新数据的泛化能力。
同时,在此处可以调参数,找到能使模型效果更好的参数:
from sklearn import tree
from sklearn.model_selection import cross_val_score
dep_parma = []
scores = []
for i in range(5,20):
lr = tree.DecisionTreeClassifier(criterion='gini',max_depth=i,random_state=0)
score = cross_val_score(lr,data_train,target_train,cv=8,scoring='recall')
sco_mean = sum(score)/len(score)
scores.append(sco_mean)
dep_parma.append(i)
# print(scores)
dep_choose = dep_parma[np.argmax(scores)]
print("最优深度为:",dep_choose)
----------------------------------
最优深度为: 14
除此之外,决策树模型中还可以调整的参数有:
min_samples_split :(表示分裂一个内部节点需要的最小样本数,默认为2)
max_leaf_nodes :(最大叶子节点数),通过限制最大叶子节点数,可以防止过拟合,默认是"None”,即不限制最大的叶子节点数。
- 训练模型
dtr = tree.DecisionTreeClassifier(criterion='gini',max_depth=dep_choose,min_samples_split=8,random_state=0)
dtr.fit(data_train,target_train)
测试模型
- 用训练集本身数据测试
from sklearn import metrics
train_predict = dtr.predict(data_train)
print(metrics.classification_report(target_train,train_predict))
----------------------------------
precision recall f1-score support
0 0.94 0.98 0.96 357
1 0.94 0.80 0.87 123
accuracy 0.94 480
macro avg 0.94 0.89 0.91 480
weighted avg 0.94 0.94 0.94 480
- 划分的测试集数据
test_predict = dtr.predict(data_test)
print(metrics.classification_report(target_test,test_predict))
--------------------------
precision recall f1-score support
0 0.88 0.76 0.82 89
1 0.51 0.71 0.59 31
accuracy 0.75 120
macro avg 0.70 0.74 0.71 120
weighted avg 0.79 0.75 0.76 120
这样,我们就成功构建了一个决策树模型啦!!
总结
本篇介绍了:
- 常见的决策树学习算法:ID3算法、C4.5算法、CART算法
- 常用预剪枝方法防止过拟合
- 决策树主要的模型参数调整有:
- 树的最大深度:max_depth
- 最大叶子节点数:max_leaf_nodes
- 分裂一个内部节点需要的最小样本数:min_samples_split