初识机器学习(决策树) 一、机器学习十大常见算法本篇主要讲述决策树算法。二、决策树Decision Tree2.1 什么是决策树决策树是一种基于树结构的监督学习算法既可以用于分类任务也可以用于回归任务。它通过模拟人类决策过程对数据进行逐步划分最终得出预测结果。决策树的结构由以下部分组成根节点树的起始节点包含所有样本对应第一个划分条件。内部节点对应一个特征和该特征上的划分条件每个内部节点将一个节点中的样本划分到不同的子节点中。叶节点树的末端节点对应最终的决策结果分类任务中为类别标签回归任务中为连续值。决策树的核心思想通过对特征空间的递归划分使得每个子区域中的样本尽可能属于同一类别分类或具有相近的目标值回归。2.2 决策树的构建原理决策树的构建过程本质上是一个递归分裂的过程其核心在于每次分裂时如何选择最优的特征和划分点。常用的特征选择标准有以下几种标准适用场景原理信息增益分类任务基于信息熵选择使划分后信息熵下降最多的特征信息增益率分类任务对信息增益进行归一化避免偏向取值较多的特征基尼系数Gini分类任务衡量节点的纯度选择使基尼系数下降最多的特征均方误差MSE回归任务选择使划分后方差下降最多的特征以分类任务中最常用的基尼系数为例其计算公式为其中​ 表示节点 D 中第 k 类样本所占的比例。基尼系数越小节点的纯度越高。决策树在每次分裂时会选择使基尼系数下降幅度最大的特征进行划分。2.3 决策树的关键参数在sklearn的DecisionTreeClassifier和DecisionTreeRegressor中常用的调优参数包括参数含义作用max_depth树的最大深度限制树的生长深度防止过拟合min_samples_split节点分裂所需的最小样本数若节点样本数小于该值则不再分裂min_samples_leaf叶节点最少样本数限制叶节点的最小样本量防止过拟合max_features每次分裂考虑的最大特征数限制特征数量常用于随机森林criterion特征选择标准分类任务可选gini或entropy回归任务可选squared_error等这些参数的主要作用是防止过拟合——即模型在训练集上表现很好但在测试集上泛化能力较差的问题。2.4 决策树分类实战电信客户流失预测下面通过一个完整的案例来展示决策树分类器的使用流程import pandas as pd import matplotlib.pyplot as plt import numpy as np from sklearn.metrics import confusion_matrix from sklearn.model_selection import train_test_split from sklearn import tree, metrics from sklearn.model_selection import cross_val_score from sklearn.tree import plot_tree # 自定义混淆矩阵可视化函数 def cm_plot(y, yp): cm confusion_matrix(y, yp) plt.matshow(cm, cmapplt.cm.Blues) plt.colorbar() for x in range(len(cm)): for y in range(len(cm)): plt.annotate(cm[x, y], xy(y, x), horizontalalignmentcenter, verticalalignmentcenter) plt.ylabel(True label) plt.xlabel(Predicted label) return plt # 读取数据 datas pd.read_excel(电信客户流失数据2.xlsx) data datas.iloc[:, :-1] # 特征 target datas.iloc[:, -1] # 目标是否流失 # 划分训练集和测试集 data_train, data_test, target_train, target_test train_test_split( data, target, test_size0.2, random_state0 )2.4.1 网格搜索与交叉验证为了找到最优的模型参数我们需要进行网格搜索并结合交叉验证来评估不同参数组合的性能depth_score [] depth [5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16] # 遍历不同的 max_depth 参数 for i in depth: model tree.DecisionTreeClassifier(max_depthi, random_state0) # 5折交叉验证以召回率recall为评估指标 scores cross_val_score(model, data_train, target_train, cv5, scoringrecall) score_mean sum(scores) / len(scores) depth_score.append(score_mean) # 选择召回率最高的 depth best_depth depth[np.argmax(depth_score)]交叉验证的作用是将训练集进一步划分为 K 份此处 K5每次用 K−1 份训练、1份验证轮流进行 K 次后取平均得分。这样可以更全面地评估模型的泛化能力避免因单次划分的偶然性导致的评估偏差。召回率Recall是分类任务中的重要指标尤其适用于不平衡数据集如客户流失数据中流失客户通常占比较小。召回率的计算公式为​其中 TP 为真正例实际流失且预测流失FN 为假负例实际流失但预测未流失。召回率越高说明模型对少数类的识别能力越强。2.4.2 模型训练与评估# 使用最优参数训练模型 dtr tree.DecisionTreeClassifier(max_depthbest_depth, random_state0) dtr.fit(data_train, target_train) # 训练集预测与评估 train_pred dtr.predict(data_train) print(metrics.classification_report(target_train, train_pred)) cm_plot(target_train, train_pred).show() # 测试集预测与评估 test_pred dtr.predict(data_test) print(metrics.classification_report(target_test, test_pred)) cm_plot(target_test, test_pred).show()classification_report会输出精确率Precision、召回率Recall、F1-score 等详细的分类评估指标。2.4.3 决策树可视化fig, ax plt.subplots(figsize(32, 32)) plot_tree(dtr, filledTrue, axax) plt.show()通过plot_tree可以将训练好的决策树可视化展示每个节点显示划分条件、样本数、类别分布等信息便于理解模型的决策逻辑。2.5 决策树回归实战多元回归决策树同样可以用于回归任务import pandas as pd import numpy as np from sklearn.tree import DecisionTreeRegressor from sklearn.model_selection import cross_val_score, train_test_split datas pd.read_csv(多元回归.csv, encodinggbk) data datas.iloc[:, :-1] target datas.iloc[:, -1] data_train, data_test, target_train, target_test train_test_split( data, target, test_size0.2, random_state0 ) # 交叉验证选择最佳深度 scores [] depth [1, 2, 3, 4, 5] for i in depth: model DecisionTreeRegressor(max_depthi, random_state0) score cross_val_score(model, data, target) # 默认使用 R² 分数 scores.append(sum(score) / len(score)) best_depth depth[np.argmax(scores)] print(f最佳深度: {best_depth}) # 训练模型 model DecisionTreeRegressor(max_depthbest_depth) model.fit(data_train, target_train) # 评估 train_score model.score(data_train, target_train) test_score model.score(data_test, target_test) print(f训练集 R²: {train_score}) print(f测试集 R²: {test_score})回归任务中score()方法返回的是决定系数取值范围为 [0,1]越接近 1 说明模型拟合效果越好。