首页 > 编程语言 >决策树模型构建+调参Python代码——用决策树模型实现机器学习

决策树模型构建+调参Python代码——用决策树模型实现机器学习

时间:2024-07-18 20:28:47浏览次数:15  
标签:plt Python pred 模型 roc score test 决策树

一、决策树模型简介

1.1适用范围

决策树模型(Decision Tree)可以用于分类和回归任务,广泛应用于以下领域:

  • 客户细分
  • 信用风险评估
  • 医疗诊断
  • 营销策略优化

1.2原理

决策树是一种树形结构的预测模型,通过一系列的特征测试(即节点的分裂)将数据集逐步划分,从而形成一个树状的决策路径。每个节点表示一个特征,每个分支代表一个特征值的结果,每个叶节点表示一个类别或回归值。其基本构建过程包括:

  1. 从根节点开始,选择最优的特征进行数据集划分。
  2. 递归地对每个子节点重复上述过程,直到满足停止条件(如节点纯度足够高或没有更多特征可供选择)。

常用的分裂准则包括信息增益、信息增益率和基尼指数。

1.3优点

  1. 简单易解释:决策树结构直观,易于理解和解释。
  2. 无需特征标准化:对数据的尺度和分布没有严格要求。
  3. 处理缺失值:决策树可以处理缺失值,不需要进行缺失值填补。
  4. 处理多种数据类型:适用于数值型和类别型特征。

1.4缺点

  1. 容易过拟合:决策树容易对训练数据过拟合,特别是当树的深度很大时。
  2. 对噪声敏感:对噪声和数据中的小变化较为敏感,可能导致模型不稳定。
  3. 计算复杂度高:在构建决策树时,计算最优分裂点的过程可能非常耗时。

二、决策树模型的Python实现

2.1Python代码

以下是一个完整的决策树模型的Python代码示例,包含数据加载、预处理、模型训练和评估的详细注释。

import numpy as np
import pandas as pd
from sklearn.model_selection import train_test_split
from sklearn.preprocessing import StandardScaler
from sklearn.tree import DecisionTreeClassifier
from sklearn.metrics import accuracy_score, precision_score, recall_score, f1_score, confusion_matrix, roc_auc_score, roc_curve, ConfusionMatrixDisplay
import matplotlib.pyplot as plt

# 生成示例数据
from sklearn.datasets import make_classification

# 生成二分类数据集
X, y = make_classification(n_samples=1000, n_features=20, n_classes=2, random_state=42)

# 将数据集划分为训练集和测试集
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.3, random_state=42)

# 创建决策树模型并训练
model = DecisionTreeClassifier(random_state=42)
model.fit(X_train, y_train)

# 进行预测
y_pred = model.predict(X_test)
y_pred_proba = model.predict_proba(X_test)[:, 1]

# 评估模型
accuracy = accuracy_score(y_test, y_pred)
precision = precision_score(y_test, y_pred)
recall = recall_score(y_test, y_pred)
f1 = f1_score(y_test, y_pred)
roc_auc = roc_auc_score(y_test, y_pred_proba)
conf_matrix = confusion_matrix(y_test, y_pred)

print(f"Accuracy: {accuracy}")
print(f"Precision: {precision}")
print(f"Recall: {recall}")
print(f"F1 Score: {f1}")
print(f"ROC AUC Score: {roc_auc}")
print("Confusion Matrix:")
print(conf_matrix)

# 绘制混淆矩阵图
disp = ConfusionMatrixDisplay(confusion_matrix=conf_matrix, display_labels=model.classes_)
disp.plot(cmap=plt.cm.Blues)
plt.title('Confusion Matrix')
plt.show()

# 绘制ROC曲线
fpr, tpr, _ = roc_curve(y_test, y_pred_proba)
plt.figure()
plt.plot(fpr, tpr, color='darkorange', lw=2, label='ROC curve (area = %0.2f)' % roc_auc)
plt.plot([0, 1], [0, 1], color='navy', lw=2, linestyle='--')
plt.xlim([0.0, 1.0])
plt.ylim([0.0, 1.05])
plt.xlabel('False Positive Rate')
plt.ylabel('True Positive Rate')
plt.title('Receiver Operating Characteristic')
plt.legend(loc="lower right")
plt.show()

2.2代码说明

  1. 数据生成
    • 使用 make_classification 生成一个二分类数据集,包含1000个样本和20个特征。
  2. 数据集划分
    • 使用 train_test_split 将数据集划分为训练集和测试集,测试集比例为30%。
  3. 模型训练
    • 创建一个决策树分类模型 DecisionTreeClassifier,并使用训练集数据对模型进行训练。
  4. 预测和评估
    • 使用测试集数据进行预测,计算预测值和预测概率。
    • 评估模型的准确率、精确率、召回率、F1得分和ROC AUC得分。
    • 输出混淆矩阵和绘制ROC曲线。

三、用决策树模型实现机器学习案例

下面是一个完整的可运行决策树案例,包括数据生成、模型训练、预测及评估的过程。我们将使用scikit-learn的模拟数据,并展示运行结果。

3.1案例主要代码

import numpy as np
import pandas as pd
from sklearn.model_selection import train_test_split
from sklearn.tree import DecisionTreeClassifier
from sklearn.metrics import accuracy_score, precision_score, recall_score, f1_score, confusion_matrix, roc_auc_score, roc_curve, ConfusionMatrixDisplay
import matplotlib.pyplot as plt

# 生成示例数据
from sklearn.datasets import make_classification

# 生成二分类数据集
X, y = make_classification(n_samples=1000, n_features=20, n_classes=2, random_state=42)

# 将数据集划分为训练集和测试集
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.3, random_state=42)

# 创建决策树模型并训练
model = DecisionTreeClassifier(random_state=42)
model.fit(X_train, y_train)

# 进行预测
y_pred = model.predict(X_test)
y_pred_proba = model.predict_proba(X_test)[:, 1]

# 评估模型
accuracy = accuracy_score(y_test, y_pred)
precision = precision_score(y_test, y_pred)
recall = recall_score(y_test, y_pred)
f1 = f1_score(y_test, y_pred)
roc_auc = roc_auc_score(y_test, y_pred_proba)
conf_matrix = confusion_matrix(y_test, y_pred)

# 打印评估结果
evaluation_results = {
    "Accuracy": accuracy,
    "Precision": precision,
    "Recall": recall,
    "F1 Score": f1,
    "ROC AUC Score": roc_auc,
    "Confusion Matrix": conf_matrix
}

# 绘制混淆矩阵图
fig_cm, ax_cm = plt.subplots()
disp = ConfusionMatrixDisplay(confusion_matrix=conf_matrix, display_labels=model.classes_)
disp.plot(cmap=plt.cm.Blues, ax=ax_cm)
plt.title('Confusion Matrix')

# 绘制ROC曲线
fpr, tpr, _ = roc_curve(y_test, y_pred_proba)
fig_roc, ax_roc = plt.subplots()
ax_roc.plot(fpr, tpr, color='darkorange', lw=2, label='ROC curve (area = %0.2f)' % roc_auc)
ax_roc.plot([0, 1], [0, 1], color='navy', lw=2, linestyle='--')
ax_roc.set_xlim([0.0, 1.0])
ax_roc.set_ylim([0.0, 1.05])
ax_roc.set_xlabel('False Positive Rate')
ax_roc.set_ylabel('True Positive Rate')
ax_roc.set_title('Receiver Operating Characteristic')
ax_roc.legend(loc="lower right")

# 显示图像
plt.close(fig_cm)
plt.close(fig_roc)
fig_cm.savefig('/mnt/data/confusion_matrix_dt.png')
fig_roc.savefig('/mnt/data/roc_curve_dt.png')

evaluation_results

3.2模型评价

1.模型准确性评价

Result
{'Accuracy': 0.8566666666666667,
 'Precision': 0.8636363636363636,
 'Recall': 0.8580645161290322,
 'F1 Score': 0.8608414239482202,
 'ROC AUC Score': 0.8566184649610677,
 'Confusion Matrix': array([[124,  21],
        [ 22, 133]])}

     以下是决策树模型的评估结果:

  • Accuracy(准确率): 0.857
  • Precision(精确率): 0.864
  • Recall(召回率): 0.858
  • F1 Score: 0.861
  • ROC AUC Score: 0.857
  • Confusion Matrix(混淆矩阵):
[[124  21]
 [ 22 133]]

2.混淆矩阵图绘制详细代码

import matplotlib.pyplot as plt
import seaborn as sns

# Display the confusion matrix
plt.figure(figsize=(8, 6))
sns.heatmap(conf_matrix, annot=True, fmt='d', cmap='Blues', xticklabels=['Predicted 0', 'Predicted 1'], yticklabels=['Actual 0', 'Actual 1'])
plt.title('Confusion Matrix')
plt.xlabel('Predicted')
plt.ylabel('Actual')
plt.show()

该图显示了模型的预测分类情况,包括真正类(TP)、假正类(FP)、假负类(FN)和真负类(TN)的数量。蓝色的阴影表示正确分类的样本数。 

3.ROC曲线图详细代码

 

import matplotlib.pyplot as plt
import seaborn as sns

# Display the ROC curve
fpr, tpr, _ = roc_curve(y_test, y_pred_proba)
plt.figure(figsize=(8, 6))
plt.plot(fpr, tpr, color='darkorange', lw=2, label='ROC curve (area = %0.2f)' % roc_auc)
plt.plot([0, 1], [0, 1], color='navy', lw=2, linestyle='--')
plt.xlim([0.0, 1.0])
plt.ylim([0.0, 1.05])
plt.xlabel('False Positive Rate')
plt.ylabel('True Positive Rate')
plt.title('Receiver Operating Characteristic')
plt.legend(loc="lower right")
plt.show()

 该图显示了模型的真阳性率(True Positive Rate)和假阳性率(False Positive Rate)之间的关系。ROC曲线下面积(AUC)为0.857,表明模型具有较高的分类能力。

四、决策树模型调参方法

对决策树进行调参和剪枝是为了提高模型的泛化能力,减少过拟合。以下是对决策树进行调参和剪枝的常见方法及其Python实现:

4.1 调参

调参主要是调整决策树的超参数,常见的超参数包括:

  • max_depth:树的最大深度,防止树过深导致过拟合。
  • min_samples_split:内部节点再划分所需最小样本数。
  • min_samples_leaf:叶子节点最少样本数。
  • max_features:划分时考虑的最大特征数。
  • criterion:划分标准,常用的有“gini”和“entropy”。

4.2 剪枝

剪枝主要是通过设置条件来限制决策树的增长,常见的方法有:

  • 预剪枝:通过设置上述超参数,在树构建过程中进行剪枝。
  • 后剪枝:先生成完全的决策树,再通过剪枝算法对其进行修剪。

4.3使用网格搜索进行调参

网格搜索是调参的常用方法,它通过遍历所有可能的参数组合来寻找最佳参数。Python代码实现方法如下:

import numpy as np
import pandas as pd
from sklearn.model_selection import train_test_split, GridSearchCV
from sklearn.tree import DecisionTreeClassifier
from sklearn.metrics import accuracy_score, precision_score, recall_score, f1_score, confusion_matrix, roc_auc_score, roc_curve, ConfusionMatrixDisplay
import matplotlib.pyplot as plt

# 生成示例数据
from sklearn.datasets import make_classification

# 生成二分类数据集
X, y = make_classification(n_samples=1000, n_features=20, n_classes=2, random_state=42)

# 将数据集划分为训练集和测试集
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.3, random_state=42)

# 定义决策树模型
model = DecisionTreeClassifier(random_state=42)

# 定义参数网格
param_grid = {
    'max_depth': [None, 10, 20, 30, 40],
    'min_samples_split': [2, 5, 10],
    'min_samples_leaf': [1, 2, 4],
    'max_features': [None, 'sqrt', 'log2'],
    'criterion': ['gini', 'entropy']
}

# 使用GridSearchCV进行调参
grid_search = GridSearchCV(estimator=model, param_grid=param_grid, cv=5, n_jobs=-1, scoring='accuracy')
grid_search.fit(X_train, y_train)

# 输出最佳参数
best_params = grid_search.best_params_
print("Best parameters found: ", best_params)

# 使用最佳参数训练模型
best_model = grid_search.best_estimator_
best_model.fit(X_train, y_train)

# 进行预测
y_pred = best_model.predict(X_test)
y_pred_proba = best_model.predict_proba(X_test)[:, 1]

# 评估模型
accuracy = accuracy_score(y_test, y_pred)
precision = precision_score(y_test, y_pred)
recall = recall_score(y_test, y_pred)
f1 = f1_score(y_test, y_pred)
roc_auc = roc_auc_score(y_test, y_pred_proba)
conf_matrix = confusion_matrix(y_test, y_pred)

print(f"Accuracy: {accuracy}")
print(f"Precision: {precision}")
print(f"Recall: {recall}")
print(f"F1 Score: {f1}")
print(f"ROC AUC Score: {roc_auc}")
print("Confusion Matrix:")
print(conf_matrix)

# 绘制混淆矩阵图
plt.figure(figsize=(8, 6))
sns.heatmap(conf_matrix, annot=True, fmt='d', cmap='Blues', xticklabels=['Predicted 0', 'Predicted 1'], yticklabels=['Actual 0', 'Actual 1'])
plt.title('Confusion Matrix')
plt.xlabel('Predicted')
plt.ylabel('Actual')
plt.show()

# 绘制ROC曲线
fpr, tpr, _ = roc_curve(y_test, y_pred_proba)
plt.figure(figsize=(8, 6))
plt.plot(fpr, tpr, color='darkorange', lw=2, label='ROC curve (area = %0.2f)' % roc_auc)
plt.plot([0, 1], [0, 1], color='navy', lw=2, linestyle='--')
plt.xlim([0.0, 1.0])
plt.ylim([0.0, 1.05])
plt.xlabel('False Positive Rate')
plt.ylabel('True Positive Rate')
plt.title('Receiver Operating Characteristic')
plt.legend(loc="lower right")
plt.show()

4.4代码说明

  1. 数据生成和分割

    • 使用 make_classification 生成一个二分类数据集,包含1000个样本和20个特征。
    • 使用 train_test_split 将数据集划分为训练集和测试集,测试集比例为30%。
  2. 模型定义和参数网格

    • 创建一个决策树分类模型 DecisionTreeClassifier
    • 定义一个参数网格,包括max_depth, min_samples_split, min_samples_leaf, max_featurescriterion
  3. 网格搜索

    • 使用 GridSearchCV 对决策树模型进行调参,寻找最佳参数组合。
  4. 模型训练和评估

    • 使用最佳参数训练决策树模型,并对测试集进行预测。
    • 评估模型的准确率、精确率、召回率、F1得分和ROC AUC得分,输出混淆矩阵。
    • 绘制混淆矩阵图和ROC曲线图。

          运行上述代码后,将得到最佳参数组合、模型评估结果、混淆矩阵图和ROC曲线图。

标签:plt,Python,pred,模型,roc,score,test,决策树
From: https://blog.csdn.net/qq_41698317/article/details/140459311

相关文章

  • Python学习之推导式
    目录一、列表推导式二、集合推导式三、字典推导式四、元组推导式一、列表推导式[expressionforiteminiterableifcondition]介绍:(1)expression:生成元素的表达式。(2)item:可迭代对象中的每个元素。(3)iterable:可迭代对象,如列表、元组、字符串等。(4)condition(可选):筛选......
  • python gradio 的输出展示组件
    HTML:展示HTML内容,适用于富文本或网页布局。JSON:以JSON格式展示数据,便于查看结构化数据。KeyValues:以键值对形式展示数据。Label:展示文本标签,适用于简单的文本输出。Markdown:支持Markdown格式的文本展示。Plot:展示图表,如matplotlib生成的图表。Text:用于显示文本,适合较长的输出。......
  • 大型语言模型的 MOE 和 MOA
    AI生成   欢迎来到雲闪世界。大型语言模型(LLM)无疑席卷了科技行业。它们的迅速崛起得益于来自维基百科、网页、书籍、大量研究论文以及我们喜爱的社交媒体平台的用户内容的大量数据。数据和计算密集型模型一直在狂热地整合来自音频和视频......
  • 基于Python语言的入门算法和数据结构(持续更新中,求关注一波)[链表 栈 队列 复杂度 操作]
    这篇文章主要是讲的Python语言的算法,本人还在不断记笔记中,文章也会持续更新,内容比较浅薄,请大家指教另外推荐一个比较好用的记笔记的软件Typora,自己已经使用很久了,感觉不错。。。虽然但是还是有欠缺。目录第一章算法概述1.1什么是数据结构?01数据结构都有哪些组成方式02......
  • Datawhale AI 夏令营——CPU部署大模型(LLM天池挑战赛)——Task2与3学习笔记
        Task2的任务是组队+寻找灵感,这里不作阐述;Task3的任务是实现RAG应用,阅读文档并观看卢哥的直播后,结合个人经验做个分享。    运行大语言模型,对LLM使用的加深,我们发现,在使用过程中,大模型会有很多幻觉出现。为了解决幻觉,科研人员提出了各种各样的方案......
  • 【大模型私有化部署:手把手教你部署并使用清华智谱GLM大模型】
    部署一个自己的大模型,没事的时候玩两下,这可能是很多技术同学想做但又迟迟没下手的事情,没下手的原因很可能是成本太高,近万元的RTX3090显卡,想想都肉疼,又或者官方的部署说明过于简单,安装的时候总是遇到各种奇奇怪怪的问题,难以解决。本文就来分享下我的安装部署经验,包括本地和租......
  • 【6!使用本地大模型调用代码,根本就是一场骗局!】
    通过大模型调用其他工具到底可不可行?ChatGPT或许能轻松搞定一切,但同样的需求落在本地大模型上,恐怕就要打个问号了。法国开发工程师EmilienLancelot尝试了多款号称具备工具调用功能的agent框架,来看看本地大模型到底能不能完成任务,但结果就像他总结的“一无所获”。是......
  • 模型训练中出现loss为NaN怎么办?
    文章目录一、模型训练中出现loss为NaN原因1.学习率过高2.梯度消失或爆炸3.数据不平衡或异常4.模型不稳定5.过拟合二、针对梯度消失或爆炸的解决方案1.使用`torch.autograd.detect_anomaly()`2.使用torchviz可视化计算图3.检查梯度的数值范围4.调整梯度剪裁......
  • 无法在 Rasp pi 4B 上安装 python 库
    :~$sudopipinstall序列号错误:外部管理环境×该环境是外部管理的╰─>要在系统范围内安装Python软件包,请尝试aptinstallpython3-xyz,其中xyz是您要尝试的包安装。Ifyouwishtoinstallanon-Debian-packagedPythonpackage,createavirtualenvironme......
  • AI Earth——基于决策树模型淮河流域冬小麦提取应用app
    应用介绍:本应用依据利用Landsat-8数据,基于潘力、夏浩铭、王瑞萌等研究论文(基于GoogleEarthEngine的淮河流域越冬作物种植面积制图)中提出的利用作物在不同物候期内卫星影像的光谱存在差异的特征,通过计算作物时间序列的皈依化植被指数(NDVI),选取越冬作物生长旺盛期NDVI最大......