【学习笔记】 陈强-机器学习-Python-Ch11 决策树(Decision Tree)

系列文章目录

监督学习:参数方法

【学习笔记】 陈强-机器学习-Python-Ch4 线性回归
【学习笔记】 陈强-机器学习-Python-Ch5 逻辑回归
【课后题练习】 陈强-机器学习-Python-Ch5 逻辑回归(SAheart.csv)
【学习笔记】 陈强-机器学习-Python-Ch6 多项逻辑回归
【学习笔记 及 课后题练习】 陈强-机器学习-Python-Ch7 判别分析
【学习笔记】 陈强-机器学习-Python-Ch8 朴素贝叶斯
【学习笔记】 陈强-机器学习-Python-Ch9 惩罚回归
【课后题练习】 陈强-机器学习-Python-Ch9 惩罚回归(student-mat.csv)

监督学习:非参数方法

【学习笔记 及 课后题练习】 陈强-机器学习-Python-Ch10 KNN法
【学习笔记】 陈强-机器学习-Python-Ch11 决策树(Decision Tree)

集成学习


文章目录

  • 系列文章目录
    • 监督学习:参数方法
    • 监督学习:非参数方法
    • 集成学习
  • 前言
  • 一、非参数法:决策树
  • 二、回归树 案例
    • 1. 载入数据
    • 2. 进行回归树估计
        • `笔记:DecisionTreeRegressor ()`
      • 1)文本格式的决策树
      • 2)plot_tree()画 决策树
        • `笔记:plot_tree()`
    • 3. 决策树的最优规模:最佳的泛化预测能力
        • `笔记:ccp_alpha`
      • 1)成本复杂度修剪:cost_complexity_pruning_path()方法
        • `笔记:cost_complexity_pruning_path()`
      • 2)展示不同的 α 值(成本复杂度参数)与总叶节点均方误差(MSE)之间的关系
      • 3)选择最佳ccp_alpha:交叉验证
      • 4)最佳模型
      • 5)画出最佳模型的决策树
      • 5)最优模型的决策树 的深度 与叶节点数
    • 4. 变量重要性
      • 1)查看 变量重要性
      • 2)画出 变量重要性的柱状图
    • 5. 预测
  • 三、分类树 案例
    • 1. 载入数据
      • 1) 读取CSV文件
      • 2) 处理原始数据
      • 3) 样本分组
    • 2. 分类树
      • 1) 进行分类树估计
        • `笔记:DecisionTreeClassifier()`
      • 2) 画 分类树
    • 3. 最优决策树的规模
      • 1) 计算成本复杂度剪枝路径的参数
      • 2) 展示不同的 α 值(成本复杂度参数)与叶节点总不纯度的关系
      • 3)选择最佳ccp_alpha:交叉验证
      • 4)最佳模型
      • 5)画出最佳模型的决策树
    • 4. 变量重要性
      • 1)查看 变量重要性
      • 2)画出 变量重要性的柱状图
    • 5. 预测
      • 1)在测试集中预测并计算混淆矩阵
      • 2)计算灵敏度和kappa
      • 3)计算测试集中每个个体有购买意向的概率
      • 4)以0.1作为临界值进行预测
      • 5)计算 预测(临界值0.1)的准确率与灵敏度
    • 6. 用 信息熵(entropy)进行 分类树估计
      • 1)选出最优模型
      • 2)预测
    • 7.分类树:决策边界图 (数据:iris)


前言

本学习笔记 仅为以防自己忘记了,顺便分享给一起学习的网友们参考。如有不同意见/建议,可以友好讨论。

本学习笔记 所有的代码和数据都可以从 陈强老师的个人主页 上下载

参考书目:陈强.机器学习及Python应用. 北京:高等教育出版社, 2021.

数学原理等 详见陈强老师的 PPT


参考了:
网友阡之尘埃的Python机器学习08——决策树算法


一、非参数法:决策树

KNN未考虑响应变量 y 的信息,所以对于噪音变量并不稳健。→ 决策树 (decision tree)

决策树可视为“自适应近邻法”(adaptive nearest neighbor),在进行节点分裂时考虑了y的信息,不受噪音变量的影响,适用于高维数据。

 如果将决策树用于分类问题,则称为分类树 (classification tree)
如果将决策树用于回归问题,则称为回归树(regression tree)

 本质上,二叉树将“特征空间” 进行 递归分割 ,每次总是沿着与某个特征变量 x j x_j xj轴平行 的方向进行切割 ,切成“ 矩形 ”或“超矩形” 区域 。
 分类树是一种通过分割特征空间进行分类的分类器(classifier as partition)。

 分类树的分裂准则:定义一个节点不纯度函数 (node impurity function) φ ( p j ) ≥ 0 φ(p_j)≥0 φ(pj)0
 实践中常用的两个不纯度函数:“基尼指数”与“信息熵”。

二、回归树 案例

使用波士顿房价数据boston (参考【学习笔记】 陈强-机器学习-Python-Ch4 线性回归 )

1. 载入数据

import pandas as pd
import numpy as np

# 从原始来源加载数据
data_url = "http://lib.stat.cmu.edu/datasets/boston"
raw_df = pd.read_csv(data_url, sep=r"\s+", skiprows=22, header=None)

# 处理数据
data = np.hstack([raw_df.values[::2, :], raw_df.values[1::2, :2]])
target = raw_df.values[1::2, 2]

# 创建DataFrame
columns = [
    "CRIM", "ZN", "INDUS", "CHAS", "NOX", "RM", "AGE", "DIS", "RAD", "TAX", 
    "PTRATIO", "B", "LSTAT"
]
df = pd.DataFrame(data, columns=columns)
df['MEDV'] = target

# 确定特征
X = df.drop(columns=['MEDV'])
y = df['MEDV']


# 将数据分割为训练集(70%)和测试集(30%)
from sklearn.model_selection import train_test_split 
X_train, X_test, y_train, y_test = train_test_split(
    X, y, test_size=0.3, random_state=0) 

X_train.shape, X_test.shape, y_train.shape, y_test.shape #显示了特征矩阵和目标向量的形状。

结果输出: ((354, 13), (152, 13), (354,), (152,))

2. 进行回归树估计

#进行回归树估计
from sklearn.tree import DecisionTreeRegressor,export_text

model = DecisionTreeRegressor(
			max_depth=2,  #最大深度为2:最多会有 3 层(根节点 + 2 层的分裂),每个内部节点最多有 2 个分支。
			random_state=123)
model.fit(X_train, y_train)
model.score(X_test, y_test) #拟合优度

结果输出: 0.622596538377147

笔记:DecisionTreeRegressor ()

DecisionTreeRegressor 是由 Scikit-learn 提供的一个决策树模型,用于解决回归问题。它的工作原理是通过学习数据中的规律,将数据集分割成越来越小的区块,直至每个区块(或叶节点)尽可能地包含具有相同或相似目标值的观测。

#基本语法和参数
from sklearn.tree import DecisionTreeRegressor

# 创建回归模型实例
model = DecisionTreeRegressor(
    criterion='squared_error', 
    splitter='best',
    max_depth=None,
    min_samples_split=2,
    min_samples_leaf=1,
    min_weight_fraction_leaf=0.0,
    max_features=None,
    random_state=None,
    max_leaf_nodes=None,
    min_impurity_decrease=0.0,
    ccp_alpha=0.0)
criterion: 衡量分裂质量的标准,通常有以下两种:
    'squared_error': 最小化平方误差 (均方误差),这是默认值。
    'friedman_mse': Friedman’s mean squared error,改进了均方误差的计算,可能会更适用于某些数据集。
    'poisson': 适用于泊松回归,用于处理计数数据。

splitter: 决定分裂策略的算法,通常有:
    'best': 选择最佳分裂。
    'random': 选择随机分裂,适用于增加模型的多样性。

max_depth: 树的最大深度。如果 None&#x

你可能感兴趣的:(陈强-机器学习-Python,机器学习,学习,笔记,python)