【Python机器学习系列】建立梯度提升模型预测心脏疾病
bigegpt 2025-05-27 12:49 4 浏览
这是Python机器学习系列原创文章,我的第204篇原创文章。
一、引言
对于表格数据,一套完整的机器学习建模流程如下:
针对不同的数据集,有些步骤不适用即不需要做,其中橘红色框为必要步骤,由于数据质量较高,本文有些步骤跳过了,跳过的步骤将单独出文章总结!同时欢迎大家关注翻看我之前的一些相关文章。
GradientBoostingClassifier是一种基于梯度提升算法的分类器,它是scikit-learn库中的一个类。梯度提升是一种集成学习方法,通过组合多个弱学习器(通常是决策树,梯度提升决策树GBDT)来构建一个更强大的分类器。梯度提升模型的基本思想是利用梯度下降来最小化损失函数,以逐步优化模型的预测能力。在每一轮迭代中,模型会计算当前模型对样本的预测值与实际值之间的残差,然后使用一个新的弱学习器来拟合这个残差。通过迭代地拟合残差,每个弱学习器都会以一定的学习率加入到模型中,最终得到一个强大的集成模型。本文将实现基于心脏疾病数据集建立梯度提升模型对心脏疾病患者进行分类预测的完整过程。
二、实现过程
导入必要的库
import pandas as pd
import matplotlib.pyplot as plt
from sklearn.utils import shuffle
from sklearn.model_selection import train_test_split
from sklearn.ensemble import GradientBoostingClassifier
from sklearn.metrics import accuracy_score
from sklearn.metrics import roc_curve
from sklearn.metrics import auc
from sklearn.metrics import confusion_matrix
from sklearn.metrics import classification_report
1、准备数据
data = pd.read_csv(r'Dataset.csv')
df = pd.DataFrame(data)
df:
数据基本信息:
print(df.head())
print(df.info())
print(df.shape)
print(df.columns)
print(df.dtypes)
cat_cols = [col for col in df.columns if df[col].dtype == "object"] # 类别型变量名
num_cols = [col for col in df.columns if df[col].dtype != "object"] # 数值型变量名
2、提取特征变量和目标变量
target = 'target'
features = df.columns.drop(target)
print(data["target"].value_counts()) # 顺便查看一下样本是否平衡
3、数据集划分
# df = shuffle(df)
X_train, X_test, y_train, y_test = train_test_split(df[features], df[target], test_size=0.2, random_state=0)
4、模型的构建与训练
# 模型的构建与训练
model = GradientBoostingClassifier()
model.fit(X_train, y_train)
参数详解:
from sklearn.ensemble import GradientBoostingClassifier
# 全部参数
GradientBoostingClassifier(loss='log_loss',
learning_rate=0.1,
n_estimators=100,
subsample=1.0,
criterion='friedman_mse',
min_samples_split=2,
min_samples_leaf=1,
min_weight_fraction_leaf=0.0,
max_depth=3,
min_impurity_decrease=0.0,
init=None,
random_state=None,
max_features=None,
verbose=0,
max_leaf_nodes=None,
warm_start=False,
validation_fraction=0.1,
n_iter_no_change=None,
tol=0.0001,
ccp_alpha=0.0)
- loss:损失函数的类型。默认为deviance,表示使用对数似然损失函数进行分类。可以选择exponential,表示使用指数损失函数进行分类。
- learning_rate:学习率,控制每个弱学习器的贡献。较小的学习率会使模型收敛得更慢,但可能会获得更好的性能。默认为0.1。
- n_estimators:弱学习器(决策树)的数量。默认为100。
- subsample:用于训练每个弱学习器的样本子集的比例。默认为1.0,表示使用全部样本。可以设置小于1.0的值来降低方差,防止过拟合。
- criterion:决策树节点分裂的标准。默认为friedman_mse,表示使用Friedman均方误差作为分裂标准。可以选择mse,表示使用均方误差,或mae,表示使用平均绝对误差。
- max_depth:决策树的最大深度。默认为3。增加深度可以增加模型的复杂度,但也容易导致过拟合。
- min_samples_split:决策树节点分裂所需的最小样本数。默认为2。如果某个节点的样本数少于该值,则不会再进行分裂。
- min_samples_leaf:叶节点所需的最小样本数。默认为1。如果叶节点的样本数少于该值,则不会进行进一步的分裂。
- max_features:每个决策树节点考虑的特征数量。可以是整数、浮点数或字符串。默认为None,表示考虑所有特征。可以选择sqrt,表示考虑特征数量的平方根,或log2,表示考虑特征数量的对数。
- random_state:随机种子。可以用于重现实验结果。
- verbose:控制训练过程中的输出信息的详细程度。默认为0,表示不输出任何信息。较大的值会增加输出信息的数量。
5、模型的推理与评价
y_pred = model.predict(X_test)
y_scores = model.predict_proba(X_test)
acc = accuracy_score(y_test, y_pred) # 准确率acc
cm = confusion_matrix(y_test, y_pred) # 混淆矩阵
cr = classification_report(y_test, y_pred) # 分类报告
fpr, tpr, thresholds = roc_curve(y_test, y_scores[:, 1], pos_label=1) # 计算ROC曲线和AUC值,绘制ROC曲线
roc_auc = auc(fpr, tpr)
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()
cm:
cr:
ROC:
三、小结
本文利用scikit-learn(一个常用的机器学习库)实现了基于心脏疾病数据集建立梯度提升模型对心脏疾病患者进行分类预测的完整过程。
作者简介:
读研期间发表6篇SCI数据算法相关论文,目前在某研究院从事数据算法相关研究工作,结合自身科研实践经历不定期持续分享关于Python、数据分析、特征工程、机器学习、深度学习、人工智能系列基础知识与案例。需要数据源码的朋友关注gzh:数据杂坛,或点击原文链接,联系作者。
原文链接:
相关推荐
- 机器学习分类模型评估(三)-F值(F-Measure)、AUC、P-R曲线
-
概述上二篇文章分别讲述了准确率(accuracy)、精确率(Precision)、查准类、召回率(Recall)、查全率、ROC曲线,本文讲述机器学习分类模型评估中的F值(F-Measure)、AUC...
- SPSS ROC曲线诊断临界值确定
-
ROC曲线是在临床医学和流行病学研究中一种常用的在诊断试验、预测模型中用于决定最佳临界点的方法。ROC曲线用真阳性率和假阳性率作图得出曲线,其横轴表示假阳性率(1-特异度),纵轴表示真阳性率(灵敏度)...
- 分类器模型检测--ROC曲线和AUC值
-
在监督学习建模中有一个重要的模块是模块的检测,就是怎样判断一个模型的好坏?那么常用的的检测的指标有P值、R值、F值、ROC曲线、AUC值等,今天来学习他们都是怎么来的,有什么用处。这里为二分类问题,即...
- 【Python机器学习系列】建立梯度提升模型预测心脏疾病
-
这是Python机器学习系列原创文章,我的第204篇原创文章。一、引言对于表格数据,一套完整的机器学习建模流程如下:针对不同的数据集,有些步骤不适用即不需要做,其中橘红色框为必要步骤,由于数据质量较高...
- 如何Keras自动编码器给极端罕见事件分类
-
全文共7940字,预计学习时长30分钟或更长本文将以一家造纸厂的生产为例,介绍如何使用自动编码器构建罕见事件分类器。现实生活中罕见事件的数据集:背景1.什么是极端罕见事件?在罕见事件问题中,数据集是...
- 机器学习分类问题:9个常用的评估指标总结
-
对机器学习的评估度量是机器学习核心部分,本文总结分类问题常用的metrics分类问题评估指标在这里,将讨论可用于评估分类问题预测的各种性能指标1ConfusionMatrix这是衡量分类问题性能的...
- 基于R语言的ROC曲线绘制及最佳阈值点(Cutoff)选择
-
ROC曲线在介绍ROC曲线之前,我们首先需要介绍混淆矩阵(ConfusionMatrix)。在统计分类模型的评估过程中分别统计分类模型归错类,归对类的观测值个数,然后把结果放在一个表里展示出来的表格...
- R数据分析:多分类问题预测模型的ROC做法及解释
-
有同学做了个多分类的预测模型,结局有三个类别,做的模型包括多分类逻辑回归、随机森林和决策树,多分类逻辑回归是用ROC曲线并报告AUC作为模型评估的,后面两种模型报告了混淆矩阵,审稿人就提出要统一模型评...
- SPSS实战:多个指标ROC曲线方向不一致的解决办法汇总(收藏)
-
在诊断实验和预测模型的临床效能评价中,我们常常用到ROC曲线分析。在SPSS中绘制ROC曲线操作比较简单,但如果将多个指标的ROC曲线绘制在同一个图中,有时候会碰到有些指标的ROC曲线在对角线上面,一...
- 小果教你快速分析ROC生存曲线图
-
尔云间一个专门做科研的团队原创小果生信果小伙伴们,大家好呀,很高兴和大家见面,前段时间应小伙伴出的解读ROC曲线图,小伙伴反应很是积极,这不最近小伙伴对于不同年份的ROC曲线图的分析呼声很高,...
- 生信文章中高频出现、模型评估必备分析——ROC曲线图,怎么看?
-
尔云间一个专门做科研的团队关注我们做了生信分析,拿到一堆数据,看不懂图怎么办?火山图、热图、散点图、箱线图、瀑布图···这么多类型的图都咋看?风险模型预后评估图、GO-KEGG富集分析图、GSEA...
- 如何看懂文献里那些图——ROC曲线图
-
ROC曲线的基本思想是把敏感度和特异性看作一个连续变化的过程,用一条曲线描述诊断系统的性能,其制作原理是在连续变量中不同界值点处计算相对应的灵敏度和特异度,然后以敏感度为纵坐标、1-特异性为横坐标绘制...
- 超强,必会的机器学习评估指标
-
大侠幸会,在下全网同名[算法金]0基础转AI上岸,多个算法赛Top[日更万日,让更多人享受智能乐趣]构建机器学习模型的关键步骤是检查其性能,这是通过使用验证指标来完成的。选择正确的验证指...
- 准确性检验 (ROC曲线)的SPSS操作教程及结果解读
-
作者/风仕在上一期,我们已经讲完了诊断试验的基础知识,这期开始讲准确性检验(ROC曲线),我们主要从准确性检验(ROC曲线)的介绍、基本概念、绘制原理、统计量、使用条件及案例的SPSS操作演示这几...
- SPSS:ROC 曲线为什么反了?
-
【作者介绍】李志辉,长期从事各类统计软件应用研究,主编或参编SPSS、MINITAB、STATISTICA多个统计软件教材共8本。代表作:电子工业出版社《SPSS常用统计分析教程(SPSS22.0中...
- 一周热门
- 最近发表
- 标签列表
-
- mybatiscollection (79)
- mqtt服务器 (88)
- keyerror (78)
- c#map (65)
- resize函数 (64)
- xftp6 (83)
- bt搜索 (75)
- c#var (76)
- mybatis大于等于 (64)
- xcode-select (66)
- mysql授权 (74)
- 下载测试 (70)
- skip-name-resolve (63)
- linuxlink (65)
- httperror403.14-forbidden (63)
- logstashinput (65)
- hadoop端口 (65)
- vue阻止冒泡 (67)
- oracle时间戳转换日期 (64)
- jquery跨域 (68)
- php写入文件 (73)
- kafkatools (66)
- mysql导出数据库 (66)
- jquery鼠标移入移出 (71)
- 取小数点后两位的函数 (73)