Python实战开发及案例分析(9)—— 决策树

        决策树是一种用于分类和回归的机器学习模型。它通过学习一系列的决策规则将数据分成不同的类别或预测数值。决策树在构建时依赖于属性选择度量,如信息增益、基尼系数等。

        在Python中,我们可以使用scikit-learn库来快速构建和使用决策树模型。下面是一个基于决策树的分类和回归的案例分析。

案例分析:决策树分类

        我们将使用scikit-learn的决策树分类器对鸢尾花数据集进行分类。鸢尾花数据集包含了三种鸢尾花的四个特征(花萼和花瓣的长度和宽度),并需要根据这些特征对鸢尾花的种类进行分类。

Python 实现:

from sklearn import datasets
from sklearn.model_selection import train_test_split
from sklearn.tree import DecisionTreeClassifier
from sklearn.metrics import classification_report, confusion_matrix
import matplotlib.pyplot as plt
from sklearn import tree# 加载鸢尾花数据集
iris = datasets.load_iris()
X, y = iris.data, iris.target# 划分训练集和测试集
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.3, random_state=42)# 创建决策树分类器并训练
clf = DecisionTreeClassifier(random_state=42)
clf.fit(X_train, y_train)# 预测测试集结果
y_pred = clf.predict(X_test)# 输出混淆矩阵和分类报告
print(confusion_matrix(y_test, y_pred))
print(classification_report(y_test, y_pred))# 绘制决策树
plt.figure(figsize=(12, 8))
tree.plot_tree(clf, feature_names=iris.feature_names, class_names=iris.target_names, filled=True)
plt.show()

解释:

  • DecisionTreeClassifier:用于创建决策树分类模型。
  • plot_tree:绘制决策树,展示决策路径。

案例分析:决策树回归

        决策树也可以用于回归问题。在这个案例中,我们将使用波士顿房价数据集来预测房屋的价格。

Python 实现:

from sklearn import datasets
from sklearn.model_selection import train_test_split
from sklearn.tree import DecisionTreeRegressor
from sklearn.metrics import mean_squared_error
import matplotlib.pyplot as plt# 加载波士顿房价数据集
boston = datasets.load_boston()
X, y = boston.data, boston.target# 划分训练集和测试集
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.3, random_state=42)# 创建决策树回归模型并训练
regressor = DecisionTreeRegressor(random_state=42)
regressor.fit(X_train, y_train)# 预测测试集结果
y_pred = regressor.predict(X_test)# 计算均方误差
mse = mean_squared_error(y_test, y_pred)
print(f"Mean Squared Error: {mse:.2f}")# 绘制特征重要性
plt.figure(figsize=(8, 6))
plt.barh(boston.feature_names, regressor.feature_importances_)
plt.xlabel("Feature Importance")
plt.ylabel("Feature Name")
plt.title("Feature Importance in Decision Tree Regression")
plt.show()

解释:

  • DecisionTreeRegressor:用于创建决策树回归模型。
  • mean_squared_error:计算模型预测的均方误差,用于评估回归模型的性能。

结论

        决策树模型通过构建一系列决策规则为分类和回归问题提供了强大的模型能力。它的优势包括可解释性强和适用于处理类别或数值型数据。

  • 分类问题:通过分割不同特征空间,可以有效地分类鸢尾花数据集。
  • 回归问题:通过预测连续数值,为房价预测提供了简单有效的方法。

        然而,决策树模型容易过拟合,需要通过剪枝、设置深度和样本数量等参数进行调节。在实际应用中,结合交叉验证和其他技术可以提高模型的泛化能力。

        继续深入探讨决策树模型,我们可以讨论更多的决策树相关技术,如剪枝、特征重要性以及基于集成学习的随机森林和梯度提升树。

决策树剪枝

        决策树容易过拟合,为了解决这一问题,可以进行预剪枝或后剪枝。

  • 预剪枝:在构建过程中通过设置参数(如max_depth, min_samples_split等)限制树的生长。
  • 后剪枝:先生成完整的树,然后在验证集上进行剪枝。
预剪枝示例

        通过设置max_depth限制树的最大深度,避免过拟合。

from sklearn import datasets
from sklearn.model_selection import train_test_split
from sklearn.tree import DecisionTreeClassifier
from sklearn.metrics import classification_report, confusion_matrix
import matplotlib.pyplot as plt
from sklearn import tree# 加载鸢尾花数据集
iris = datasets.load_iris()
X, y = iris.data, iris.target# 划分训练集和测试集
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.3, random_state=42)# 设置预剪枝参数
clf = DecisionTreeClassifier(random_state=42, max_depth=3, min_samples_split=4, min_samples_leaf=2)
clf.fit(X_train, y_train)# 预测测试集结果
y_pred = clf.predict(X_test)# 输出混淆矩阵和分类报告
print(confusion_matrix(y_test, y_pred))
print(classification_report(y_test, y_pred))# 绘制决策树
plt.figure(figsize=(12, 8))
tree.plot_tree(clf, feature_names=iris.feature_names, class_names=iris.target_names, filled=True)
plt.show()

决策树特征重要性

        通过查看特征的重要性,可以了解哪些特征对分类结果影响最大。

# 使用鸢尾花数据集和决策树分类器
clf = DecisionTreeClassifier(random_state=42, max_depth=3, min_samples_split=4, min_samples_leaf=2)
clf.fit(X_train, y_train)# 打印特征重要性
print("Feature importances:", clf.feature_importances_)# 可视化特征重要性
plt.figure(figsize=(8, 6))
plt.barh(iris.feature_names, clf.feature_importances_)
plt.xlabel("Feature Importance")
plt.ylabel("Feature Name")
plt.title("Feature Importance in Decision Tree Classification")
plt.show()

案例分析:使用随机森林进行分类

        随机森林是由多个决策树构成的集成模型,可以通过组合多个决策树的预测结果来提高模型性能和稳定性。它还可以帮助减小单个决策树的过拟合风险。

Python 实现:

from sklearn.ensemble import RandomForestClassifier
from sklearn.metrics import classification_report, confusion_matrix
import matplotlib.pyplot as plt
import seaborn as sns# 加载鸢尾花数据集
iris = datasets.load_iris()
X, y = iris.data, iris.target# 划分训练集和测试集
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.3, random_state=42)# 创建随机森林分类器并训练
rf_clf = RandomForestClassifier(n_estimators=100, random_state=42)
rf_clf.fit(X_train, y_train)# 预测测试集结果
y_pred = rf_clf.predict(X_test)# 输出混淆矩阵和分类报告
print(confusion_matrix(y_test, y_pred))
print(classification_report(y_test, y_pred))# 可视化特征重要性
plt.figure(figsize=(8, 6))
sns.barplot(x=rf_clf.feature_importances_, y=iris.feature_names)
plt.xlabel("Feature Importance")
plt.ylabel("Feature Name")
plt.title("Feature Importance in Random Forest Classification")
plt.show()

案例分析:使用梯度提升树(Gradient Boosting Trees)进行分类

        梯度提升树是一种集成学习方法,通过逐步构建多个弱模型(决策树)来提高预测精度。

Python 实现:

from sklearn.ensemble import GradientBoostingClassifier
from sklearn.metrics import classification_report, confusion_matrix
import matplotlib.pyplot as plt
import seaborn as sns# 加载鸢尾花数据集
iris = datasets.load_iris()
X, y = iris.data, iris.target# 划分训练集和测试集
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.3, random_state=42)# 创建梯度提升分类器并训练
gb_clf = GradientBoostingClassifier(n_estimators=100, random_state=42)
gb_clf.fit(X_train, y_train)# 预测测试集结果
y_pred = gb_clf.predict(X_test)# 输出混淆矩阵和分类报告
print(confusion_matrix(y_test, y_pred))
print(classification_report(y_test, y_pred))# 可视化特征重要性
plt.figure(figsize=(8, 6))
sns.barplot(x=gb_clf.feature_importances_, y=iris.feature_names)
plt.xlabel("Feature Importance")
plt.ylabel("Feature Name")
plt.title("Feature Importance in Gradient Boosting Classification")
plt.show()

结论

  • 剪枝:通过预剪枝或后剪枝技术可以减小决策树的过拟合风险,得到更稳健的模型。
  • 特征重要性:决策树模型可以用于评估不同特征对分类结果的重要性。
  • 集成模型
    • 随机森林:通过组合多个决策树,减少了单一决策树的过拟合风险,通常能获得更好的预测效果。
    • 梯度提升树:通过逐步构建多个弱模型来提高预测精度,适用于复杂的分类和回归问题。

        这些技术使得决策树及其变种模型在实际机器学习问题中具有广泛的应用。

        继续深入探讨更多与决策树相关的技术和案例,我们可以学习基于决策树的其他集成方法,如极端随机树(ExtraTrees),并探讨决策树的具体应用案例。

案例分析:使用极端随机树(ExtraTrees)进行分类

        极端随机树是一种随机森林的变种,与随机森林不同,极端随机树在构建树时不是选择最佳分割点,而是随机选择分割点,从而增加多样性并加速计算。

Python 实现:

from sklearn.ensemble import ExtraTreesClassifier
from sklearn.metrics import classification_report, confusion_matrix
import matplotlib.pyplot as plt
import seaborn as sns# 加载鸢尾花数据集
iris = datasets.load_iris()
X, y = iris.data, iris.target# 划分训练集和测试集
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.3, random_state=42)# 创建极端随机树分类器并训练
et_clf = ExtraTreesClassifier(n_estimators=100, random_state=42)
et_clf.fit(X_train, y_train)# 预测测试集结果
y_pred = et_clf.predict(X_test)# 输出混淆矩阵和分类报告
print(confusion_matrix(y_test, y_pred))
print(classification_report(y_test, y_pred))# 可视化特征重要性
plt.figure(figsize=(8, 6))
sns.barplot(x=et_clf.feature_importances_, y=iris.feature_names)
plt.xlabel("Feature Importance")
plt.ylabel("Feature Name")
plt.title("Feature Importance in Extra Trees Classification")
plt.show()

案例分析:决策树在客户流失预测中的应用

项目背景:客户流失是指客户停止使用某种产品或服务。为了保留更多的客户,可以通过决策树模型对客户进行分类,预测哪些客户更可能流失。

数据集:使用著名的 Telco Customer Churn 数据集。

Python 实现:

import pandas as pd
from sklearn.model_selection import train_test_split
from sklearn.preprocessing import LabelEncoder, StandardScaler
from sklearn.ensemble import RandomForestClassifier
from sklearn.metrics import classification_report, confusion_matrix
import seaborn as sns
import matplotlib.pyplot as plt# 加载数据集
url = 'https://raw.githubusercontent.com/IBM/telco-customer-churn-on-icp4d/master/data/Telco-Customer-Churn.csv'
df = pd.read_csv(url)# 删除不必要的列
df.drop(['customerID'], axis=1, inplace=True)# 处理分类数据
label_encoders = {}
for column in df.select_dtypes(include='object').columns:le = LabelEncoder()df[column] = le.fit_transform(df[column])label_encoders[column] = le# 定义特征和标签
X = df.drop(['Churn'], axis=1)
y = df['Churn']# 标准化数据
scaler = StandardScaler()
X = scaler.fit_transform(X)# 划分训练集和测试集
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.3, random_state=42)# 创建随机森林模型并训练
rf_clf = RandomForestClassifier(n_estimators=100, random_state=42)
rf_clf.fit(X_train, y_train)# 预测测试集结果
y_pred = rf_clf.predict(X_test)# 输出混淆矩阵和分类报告
print(confusion_matrix(y_test, y_pred))
print(classification_report(y_test, y_pred))# 可视化特征重要性
plt.figure(figsize=(8, 6))
feature_names = df.drop(['Churn'], axis=1).columns
sns.barplot(x=rf_clf.feature_importances_, y=feature_names)
plt.xlabel("Feature Importance")
plt.ylabel("Feature Name")
plt.title("Feature Importance in Customer Churn Prediction")
plt.show()

案例分析:使用LightGBM进行分类

项目背景:LightGBM(Light Gradient Boosting Machine)是由微软开发的梯度提升框架,具有更快的训练速度和更好的准确性。

Python 实现:

安装 lightgbm

pip install lightgbm

代码实现:

import lightgbm as lgb
from sklearn.model_selection import train_test_split
from sklearn.metrics import classification_report, confusion_matrix
import seaborn as sns
import matplotlib.pyplot as plt# 加载数据集
url = 'https://raw.githubusercontent.com/IBM/telco-customer-churn-on-icp4d/master/data/Telco-Customer-Churn.csv'
df = pd.read_csv(url)# 删除不必要的列
df.drop(['customerID'], axis=1, inplace=True)# 处理分类数据
label_encoders = {}
for column in df.select_dtypes(include='object').columns:le = LabelEncoder()df[column] = le.fit_transform(df[column])label_encoders[column] = le# 定义特征和标签
X = df.drop(['Churn'], axis=1)
y = df['Churn']# 标准化数据
scaler = StandardScaler()
X = scaler.fit_transform(X)# 划分训练集和测试集
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.3, random_state=42)# 创建LightGBM模型并训练
lgb_train = lgb.Dataset(X_train, y_train)
params = {'objective': 'binary','boosting_type': 'gbdt','metric': 'binary_logloss','num_leaves': 31,'learning_rate': 0.05,'verbose': 0
}
gbm = lgb.train(params, lgb_train, num_boost_round=100)# 预测测试集结果
y_pred_prob = gbm.predict(X_test)
y_pred = (y_pred_prob > 0.5).astype(int)# 输出混淆矩阵和分类报告
print(confusion_matrix(y_test, y_pred))
print(classification_report(y_test, y_pred))# 可视化特征重要性
plt.figure(figsize=(8, 6))
feature_importance = gbm.feature_importance()
sns.barplot(x=feature_importance, y=feature_names)
plt.xlabel("Feature Importance")
plt.ylabel("Feature Name")
plt.title("Feature Importance in Customer Churn Prediction using LightGBM")
plt.show()

结论

        在这几种案例分析中,我们展示了不同的集成学习方法在决策树上的扩展和应用:

  • 极端随机树:通过随机分割点和数据采样构建,增加模型多样性并提高效率。
  • 客户流失预测:决策树模型在预测分类问题中具有较好的表现,适用于客户流失预测等场景。
  • LightGBM:一种高效的梯度提升方法,能显著提高训练速度和预测性能。

        通过这些不同的集成方法和决策树扩展模型,可以更有效地解决分类和回归问题,特别是对大型数据集和复杂特征的预测。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/832758.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Cordova ios-deploy was not found

实在是忍不住想记录下这个问题。今天在调试 iOS 平台的时候又遇到了这个问题,让我很恼火。这是第三次遇到了,这次一定要彻底解决他。 ios-deploy was not found找到两个方法,都可以解决问题,先直接给出结论: sudo np…

连锁收银系统批量调整商品价格教程

1、进入系统后台,系统后台登录网址: 2、点击商品>商品调价 3、将按模板整理好的商品价格数据导入即可。 Tips:每次导入的商品数量不要超过6000 条。

python 12实验

1.导入数据。 2.清洗数据,将缺失值或“NAN”替换为“无”,并将文本数据转换为数值型数据。 3.使用聚类算法(如KMeans)对数据进行聚类,并计算样本到簇中心的平均距离以确定最佳的簇数量。 4.对数据进行PCA降维&#xff…

Python进阶之-jinja2详解

✨前言: 🌟什么是jinja2? Jinja2 是一个强大的 Python 模版引擎,主要用于生成HTML或其他文本文件。这个库非常适合开发动态网站和Web应用的视图层,因为它支持逻辑操作如循环和条件判断,还可以继承和重用模…

linux——主从同步

1. 保证主节点开始二进制日志,从节点配置中继日志 2. 从节点的开启一个 I/O 线程读取主节点二进制日志的内容 3. 从节点读取主节点的二进制日志之后,会将去读的内容写入从节点的中继日志 4. 从节点开启 SQL 线程,读取中继日志的内容&a…

图搜索算法 - 广度优先搜索法(BFS)

相关文章: 图搜索算法 - 深度优先搜索法(DFS) 广度优先搜索法(BFS) 2.从一个顶点出发,把它所有关联的顶点依次访问,然后到下一个顶点(刚才访问的关联顶点)。然后以这个顶…

C#中接口设计相关原则

在C#中,接口(Interface)是一种引用类型,它定义了一个契约,指定了一个类必须实现的成员(属性、方法、事件、索引器)。接口不提供这些成员的实现,只指定成员必须按照特定的方式被实现。…

Advanced RAG 06:生成结果的相关性低? 快用 Query Rewriting 优化技术

编者按:在现实生活中,普通用户很难编写合适的提示词(prompt)来指示 LLM 完成期望任务。用户提出的 queries 往往存在词汇不准确、缺乏语义信息等问题,导致 LLM 难以理解并生成相关的模型响应。因此,如何优化…

前端 | iframe框架标签应用(二)| 外部页面导入

文章目录 📚实现效果📚模块实现解析🐇html🐇css🐇javascript 📚实现效果 点击右上角喇叭,弹出iframe页面框,链接bilibili白噪音视频页面;点击关闭按钮,关闭弹…

常用浏览器快捷键

常用浏览器快捷键,大部分浏览器应该都支持,主要常用 Safari、chrome、edge 功能Mac快捷键非Mac快捷键新建标签页Cmd TCtrl T关闭当前标签Cmd WCtrl W重新打开关闭的标签Cmd Shift TCtrl Shift T切换到下一个标签Ctrl TabCtrl Tab切换到上一个…

go中泛型约束 comparable不能使用 大于> 小于<比较符号 invalid operation UndefinedOp 异常的解决方法

在go语言中我们在使用 类型约束接口 comparable对约束的数据进行 大于>或者小于 <比较时会提示编译异常: invalid operation: args[0] > args[1] (type parameter E is not comparable with >)compiler UndefinedOp 原因&#xff1a; comparable 是一个所有可比较…

sqlmodel实现唯一性校验3,检查多列同时重复

之前的方案虽然能够解决重复性问题&#xff0c;但是没有覆盖到多列同时重复的情况。 比如&#xff0c;我们可以认为用户名是可以重复的。但是用户名和年龄不能同时重复&#xff0c;那么这种情况该怎么解决呢&#xff1f; 之前的代码如下&#xff1a; from sqlalchemy import…

数据集标签数量不均衡如何设计loss均衡数量

数据集标签数量不均衡如何设计loss均衡数量 1. 思路出发点&#xff1a; 对于哪些数量分布比值较少的标签提供更多的loss注意力比重&#xff0c;如何提高训练注意力比重&#xff0c;也就是说&#xff0c;让模型的梯度更多的倾向于有利于数据标签分布较少的数据训练&#xff0c…

【快捷部署】023_HBase(2.3.6)

&#x1f4e3;【快捷部署系列】023期信息 编号选型版本操作系统部署形式部署模式复检时间023HBase2.3.6Ubuntu 20.04tar包单机2024-05-07 注意&#xff1a;本脚本非全自动化脚本&#xff0c;有2次人工干预&#xff0c;第一次是确认内网IP&#xff0c;如正确直接回车即可&#…

Linux和Windows修改动态库的名字

一、概述 有时候我们创建windows的Dll或者Linux下的So库时候&#xff0c;在已经生成的产物里面我们又不想重新修改工程来修改我们动态库的名字&#xff0c;这个应该怎么做呢&#xff0c;windows跟linux两个平台使用的工具不一样。比如我们有一个TestA.Dll和TestA.lib或者 TestA…

git: 远程分支同步到本地

git pull origin <远程分支名> git pull可以将远程某一个分支下拉到本地并和本地的分支进行合并。如果不加origin <远程分支名>&#xff0c;那么这个同步就是将当前本地分支对应的远程分支给下拉合并进当前本地分支 git fetch --all 下载所有远程分支代码到本地…

了解TMS运输管理系统,实现物流高效运转

TMS运输管理系统&#xff08;Transportation Management System&#xff09;是一种集成物流和信息技术的解决方案&#xff0c;通过优化运输流程、实时跟踪货物信息和自动化管理操作&#xff0c;提高物流效率&#xff0c;降低运营成本&#xff0c;实现高效运输。 TMS运输管理系…

吴恩达2022机器学习专项课程C2(高级学习算法)W1(神经网络):2.4 神经网络层

目录 神经网络第一层&#xff08;隐藏层&#xff09;计算过程1.输入向量2.神经元的计算2.标识不同神经元3.层输出&#xff08;激活&#xff09;向量4.神经网络分层5.标识不同层 神经网络第二层&#xff08;输出层&#xff09;计算过程1.输入向量2.层输出&#xff08;激活&#…

Vue CLI配置代理、2.0、3.0

一、vue cli2.0 代理配置 proxy: {/api:{target: "http://localhost:8067",pathRewrite: {/api: }}, } 一、vue cli3.0 代理配置 proxy: {/api: {target: http://localhost:8067,pathRewrite: {/api: }} }

为什么有了MTU,还需要MSS?

为什么有了MTU&#xff0c;还需要MSS? MTU Maximum Transmit Unit&#xff0c;最大传输单元。由数据链路层提供给网络最大的一次传输数据的大小&#xff0c;一般MTU1500Byte. “车同轨”&#xff0c;保证底层数据包能在物理网络中顺利传输&#xff01;&#xff01;&#xff…