乐趣区

关于数据挖掘:视频决策树模型原理和R语言预测心脏病实例

全文链接:https://tecdat.cn/?p=33128

原文出处:拓端数据部落公众号

分析师:Yudong Wan

决策树模型简介

决策树模型是一种非参数的有监督学习办法,它可能从一系列有特色和标签的数据中总结出决策规定,并用树状图的构造来出现这些规定,以解决分类和回归问题。与传统的线性回归模型不同,决策树回归模型可能捕捉到非线性关系,并生成易于解释的规定。

决策树模型的实现过程

决策树模型的实现过程次要包含三个步骤: 特征选择、树的构建和剪枝。

首先,特征选择是为了确定在每个节点上进行宰割的最佳特色。罕用的特征选择指标有信息增益、基尼指数等。

其次,树的构建是通过递归地宰割数据集来生成决策树。依据某个规范,咱们抉择一个特色作为划分根据,并将数据集划分为更小的子集。

最初,剪枝是为了防止过拟合,进步模型的泛化能力。咱们能够通过剪掉一些叶节点来缩小决策树的复杂度。

max_features: 在划分节点时所思考的特征值数量的最大值,默认取 None,能够传入 int 型或 float 型数据。如果是 float 型数据,示意百分数。max_leaf_nodes: 最大叶子节点数,默认取 None,能够传入 int 型数据。

min samples leaf: 叶子节点的起码样本数,默认取 1,如果小于该数值,该叶子节点会和兄弟节点一起被剪枝(即剔除该叶子节点和其兑弟节点,并进行决裂)。

min_weight_fraction_leaf: 叶子节点最小的样本权重和,默认取 0,即不思考权重问题,如果小于该数值,该叶子节点会和兄弟节点一起被剪枝(即剔除该叶子节点和其兄弟节点,并进行决裂)。如果较多样本有缺失值或者样本的散布类别偏差很大,则需思考样本权重问题。
max_features: 在划分节点时所思考的特征值数量的最大值,默认取 None,能够传入 int 型或 float 型数据。如果是 float 型数据,示意百分数。max_leaf_nodes: 最大叶子节点数,默认取 None,能够传入 int 型数据。

决策树模型的利用场景

利用场景: 决策树模型实用于非线性关系较为显著的问题,例如:

1. 屋宇价格预测: 基于一些特色(如地理位置、面积等),预测屋宇的价格。

2. 销售量预测: 依据产品的特色(如价格、广告费用等),预测销售量。

决策树模型的优缺点

长处

决策树模型具备以下长处:
首先,它易于了解和解释,生成的决策树能够直观地出现规
则,让咱们可能理解特色对后果的影响。

其次,决策树模型可能解决离散型和连续型的特色,实用于
多种数据类型。

最初,它对异样值和缺失值绝对不敏感,可能在存在噪声的
数据集中体现较好。

毛病

然而,决策树模型也有一些毛病须要留神:

首先,在解决简单问题时,决策树可能适度拟合训练数据,导致泛化能力较差,须要采取剪枝等措施来解决这个问题。

其次,对于特色空间划分较多的数据,决策树可能会产生过于简单的模型,难以解释和了解。

最初,决策树的训练过程容易受到数据的渺小变动影响,可能会产生不稳固的后果。

R 语言逻辑回归、Naive Bayes 贝叶斯、决策树、随机森林算法预测心脏病

数据集信息:

这个数据集能够追溯到 1988 年,由四个数据库组成。克利夫兰、匈牙利、瑞士和长滩。” 指标 “ 字段是指病人是否有心脏病。它的数值为整数,0= 无病,1= 有病。

指标:

次要目标是预测给定的人是否有心脏病,借助于几个因素,如年龄、胆固醇程度、胸痛类型等。

咱们在这个问题上应用的算法是:

  • 二元逻辑回归
  • Naive Bayes 算法
  • 决策树
  • 随机森林

数据集的形容:

该数据有 303 个察看值和 14 个变量。每个察看值都蕴含对于集体的以下信息。

  • 年龄:- 集体的年龄,以年为单位
  • sex:- 性别(1= 男性;0= 女性)
  • cp – 胸痛类型(1= 典型心绞痛;2= 非典型心绞痛;3= 非心绞痛;4= 无症状)。
  • trestbps– 静息血压
  • chol – 血清胆固醇,单位:mg/dl
  • fbs – 空腹血糖程度 >120 mg/dl(1= 真;0= 假)
  • restecg – 静息心电图后果(0= 失常;1= 有 ST-T;2= 瘦小)
  • thalach – 达到的最大心率
  • exang – 静止诱发的心绞痛(1= 是;0= 否)
  • oldpeak – 绝对于静止状态,静止诱发的 ST 压低
  • slope – 静止时 ST 段峰值的斜率(1= 上斜;2= 平坦;3= 下斜)
  • ca – 次要血管的数量(0-4),由 Flourosopy 着色
  • 地中海贫血症 – 地中海贫血症是一种遗传性血液疾病,会影响身材产生血红蛋白和红细胞的能力。1= 失常;2= 固定缺点;3= 可逆转缺点
  • 指标 – 预测属性 – 心脏疾病的诊断(血管造影疾病状态)(值 0 =<50% 直径狭隘;值 1 =>50% 直径狭隘)

在 Rstudio 中加载数据

heart<-read.csv("heart.csv",header = T)

header = T 意味着给定的数据有本人的题目,或者换句话说,第一个观测值也被思考用于预测。

head(heart)

当咱们想查看和检查数据的前六个观察点时,咱们应用 head 函数。

tail(heart)

 显示的是咱们数据中最初面的六个观察点

colSums(is.na(heart))

这个函数是用来查看咱们的数据是否蕴含任何 NA 值。\
如果没有发现 NA,咱们就能够继续前进,否则咱们就必须在之前删除 NA。

查看咱们的数据结构

str(heart)

查看咱们的数据摘要

summary(heart)

通过观察以上的总结,咱们能够说以下几点

  • 性别不是连续变量,因为依据咱们的形容,它能够是男性或女性。因而,咱们必须将性别这个变量名称从整数转换为因子。
  • cp 不能成为连续变量,因为它是胸痛的类型。因为它是胸痛的类型,咱们必须将变量 cp 转换为因子。
  • fbs 不能是连续变量或整数,因为它显示血糖程度是否低于 120mg/dl。
  • restecg 是因子,因为它是心电图后果的类型。它不能是整数。所以,咱们要把它转换为因子和标签。
  • 依据数据集的形容,exang 应该是因子。心绞痛产生或不产生。因而,将该变量转换为因子。
  • 斜率不能是整数,因为它是在心电图中察看到的斜率类型。因而,咱们将变量转换为因子。
  • 依据数据集的形容,ca 不是整数。因而,咱们要将该变量转换为因子。
  • thal 不是整数,因为它是地中海贫血的类型。因而,咱们将变量转换为因子。
  • 指标是预测变量,通知咱们这个人是否有心脏病。因而,咱们将该变量转换为因子,并为其贴上标签。

根据上述思考,咱们对变量做了一些变动

# 例如
sex<-as.factor(sex)
levels(sex)<-c("Female","Male")

查看上述变动是否执行胜利

str(heart)
summary(heart)

  

EDA

EDA 是探索性数据分析(Exploratory Data Analysis)的缩写,它是一种数据分析的办法 / 哲学,采纳各种技术(次要是图形技术)来深刻理解数据集。

对于图形示意,咱们须要库 “ggplot2”

library(ggplot2)
ggplot(heart,aes(x=age,fill=target,color=target)) + geom_histogram(binwidth = 1,color="black") + labs(x = "Age",y = "Frequency", title = "Heart Disease w.r.t. Age")

咱们能够得出结论,与 60 岁以上的人相比,40 至 60 岁的人患心脏病的概率最高。

table <- table(cp)

pie(table)

咱们能够得出结论,在所有类型的胸痛中,在集体身上察看到的大多数是典型的胸痛类型,而后是非心绞痛。

执行机器学习算法

Logistic 回归

首先,咱们将数据集分为训练数据(75%)和测试数据(25%)。

set.seed(100) 
#100 用于管制抽样的 permutation 为 100. 
index<-sample(nrow(heart),0.75*nrow(heart))

在训练数据上生成模型,而后用测试数据验证模型。

glm(family = "binomial")
# family = "二项式" 意味着只蕴含两个后果。

为了查看咱们的模型是如何生成的,咱们须要计算预测分数和建设混同矩阵来理解模型的准确性。

pred<-fitted(blr)
# 拟合只能用于取得生成模型的数据的预测分数。

咱们能够看到,预测的分数是患心脏病的概率。但咱们必须找到一个适当的分界点,从这个分界点能够很容易地区分是否患有心脏病。

为此,咱们须要 ROC 曲线,这是一个显示分类模型在所有分类阈值下的性能的图形。它将使咱们可能采取适当的临界值。

pred<-prediction(train$pred,train$target)
perf<-performance(pred,"tpr","fpr")
plot(perf,colorize = T,print.cutoffs.at = seq(0.1,by = 0.1))

通过应用 ROC 曲线,咱们能够察看到 0.6 具备更好的敏感性和特异性,因而咱们抉择 0.6 作为辨别的分界点。

pred1<-ifelse(pred<0.6,"No","Yes")
# 训练数据的准确性
acc_tr 

从训练数据的混同矩阵中,咱们晓得模型有 88.55% 的准确性。

当初在测试数据上验证该模型

predict(type = "response")
## type = "response" 是用来取得患有心脏病的概率的后果。head(test)

咱们晓得,对于训练数据来说,临界点是 0.6。同样地,测试数据也会有雷同的临界点。

confusionMatrix((pred1),target)
# 测试数据的准确性.

查看咱们的预测值有多少位于曲线内

auc@y.values

咱们能够得出结论,咱们的准确率为 81.58%,90.26% 的预测值位于曲线之下。同时,咱们的谬误分类率为 18.42%。

Naive Bayes 算法

在执行 Naive Bayes 算法之前,须要删除咱们在执行 BLR 时增加的额定预测列。

#naivebayes 模型
nB(target~.)

用训练数据查看模型,并创立其混同矩阵,来理解模型的精确水平。

predict(train)
confMat(pred,target)

咱们能够说,贝叶斯算法对训练数据的准确率为 85.46%。

当初,通过预测和创立混同矩阵来验证测试数据的模型。

Matrix(pred,target)

 

咱们能够得出结论,在 Naive Bayes 算法的帮忙下生成的模型准确率为 78.95%,或者咱们也能够说 Naive Bayes 算法的谬误分类率为 21.05%。

决策树

在施行决策树之前,咱们须要删除咱们在执行 Naive Bayes 算法时增加的额定列。

train$pred<-NULL

rpart 代表递归分区和回归树

当自变量和因变量都是间断的或分类的时候,就会用到 rpart。

rpart 会自动检测是否要依据因变量进行回归或分类。

施行决策树

plot(tree)

在决策树的帮忙下,咱们能够说所有变量中最重要的是 CP、CA、THAL、Oldpeak。

让咱们用测试数据来验证这个模型,并找出模型的准确性。

conMat(pred,targ)

咱们能够说,决策树的准确率为 76.32%,或者说它的谬误分类率为 23.68%。

随机森林

在执行随机森林之前,咱们须要删除咱们在执行决策树时增加的额定预测列。

test$pred<-NULL

在随机森林中,咱们不须要将数据分成训练数据和测试数据,咱们间接在整个数据上生成模型。为了生成模型,咱们须要应用随机森林库

# Set.seed 通过限度 permutation 来管制随机性。set.seed(100)
model_rf<-randomForest(target~.,data = heart)
model_rf

在图上绘制出随机森林与误差的关系。

plot(model_rf)

红线代表没有心脏病的 MCR,绿线代表有心脏病的 MCR,黑线代表总体 MCR 或 OOB 误差。总体误差率是咱们感兴趣的,后果不错。

论断

在进行了各种分类技术并思考到它们的准确性后,咱们能够得出结论,所有模型的准确性都在 76% 到 84% 之间。其中,随机森林的准确率略高,为 83.5%。

对于分析师

在此对 Yudong Wan 对本文所作的奉献示意诚挚感激,他实现了数据迷信与大数据技术学位,专一数据分析,机器学习。善于 Python、R。


最受欢迎的见解

1.R 语言多元 Logistic 逻辑回归 利用案例

2. 面板平滑转移回归 (PSTR) 剖析案例实现

3.matlab 中的偏最小二乘回归(PLSR)和主成分回归(PCR)

4.R 语言泊松 Poisson 回归模型剖析案例

5.R 语言回归中的 Hosmer-Lemeshow 拟合优度测验

6.r 语言中对 LASSO 回归,Ridge 岭回归和 Elastic Net 模型实现

7. 在 R 语言中实现 Logistic 逻辑回归

8.python 用线性回归预测股票价格

9.R 语言如何在生存剖析与 Cox 回归中计算 IDI,NRI 指标

退出移动版