天天看點

R語言邏輯回歸、Naive Bayes貝葉斯、決策樹、随機森林算法預測心髒病資料集資訊:

原文連結:http://tecdat.cn/?p=23061

資料集資訊:

這個資料集可以追溯到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)           

複制

R語言邏輯回歸、Naive Bayes貝葉斯、決策樹、随機森林算法預測心髒病資料集資訊:

當我們想檢視和檢查資料的前六個觀察點時,我們使用head函數。

tail(heart)           

複制

R語言邏輯回歸、Naive Bayes貝葉斯、決策樹、随機森林算法預測心髒病資料集資訊:

顯示的是我們資料中最後面的六個觀察點

colSums(is.na(heart))           

複制

R語言邏輯回歸、Naive Bayes貝葉斯、決策樹、随機森林算法預測心髒病資料集資訊:

這個函數是用來檢查我們的資料是否包含任何NA值。

如果沒有發現NA,我們就可以繼續前進,否則我們就必須在之前删除NA。

檢查我們的資料結構

str(heart)           

複制

R語言邏輯回歸、Naive Bayes貝葉斯、決策樹、随機森林算法預測心髒病資料集資訊:

檢視我們的資料摘要

summary(heart)           

複制

R語言邏輯回歸、Naive Bayes貝葉斯、決策樹、随機森林算法預測心髒病資料集資訊:

通過觀察以上的總結,我們可以說以下幾點

  • 性别不是連續變量,因為根據我們的描述,它可以是男性或女性。是以,我們必須将性别這個變量名稱從整數轉換為因子。
  • cp不能成為連續變量,因為它是胸痛的類型。由于它是胸痛的類型,我們必須将變量cp轉換為因子。
  • fbs不能是連續變量或整數,因為它顯示血糖水準是否低于120mg/dl。
  • restecg是因子,因為它是心電圖結果的類型。它不能是整數。是以,我們要把它轉換為因子和标簽。
  • 根據資料集的描述,exang應該是因子。心絞痛發生或不發生。是以,将該變量轉換為因子。
  • 斜率不能是整數,因為它是在心電圖中觀察到的斜率類型。是以,我們将變量轉換為因子。
  • 根據資料集的描述,ca不是整數。是以,我們要将該變量轉換為因子。
  • thal不是整數,因為它是地中海貧血的類型。是以,我們将變量轉換為因子。
  • 目标是預測變量,告訴我們這個人是否有心髒病。是以,我們将該變量轉換為因子,并為其貼上标簽。

根據上述考慮,我們對變量做了一些變化

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

複制

檢查上述變化是否執行成功

str(heart)           

複制

R語言邏輯回歸、Naive Bayes貝葉斯、決策樹、随機森林算法預測心髒病資料集資訊:
summary(heart)           

複制

R語言邏輯回歸、Naive Bayes貝葉斯、決策樹、随機森林算法預測心髒病資料集資訊:

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")           

複制

R語言邏輯回歸、Naive Bayes貝葉斯、決策樹、随機森林算法預測心髒病資料集資訊:

我們可以得出結論,與60歲以上的人相比,40至60歲的人患心髒病的機率最高。

table <- table(cp)

pie(table)           

複制

R語言邏輯回歸、Naive Bayes貝葉斯、決策樹、随機森林算法預測心髒病資料集資訊:

我們可以得出結論,在所有類型的胸痛中,在個人身上觀察到的大多數是典型的胸痛類型,然後是非心絞痛。

執行機器學習算法

Logistic回歸

首先,我們将資料集分為訓練資料(75%)和測試資料(25%)。

set.seed(100) 
#100用于控制抽樣的permutation為100. 
index<-sample(nrow(heart),0.75*nrow(heart))           

複制

在訓練資料上生成模型,然後用測試資料驗證模型。

glm(family = "binomial")
# family = " 二項式 "意味着隻包含兩個結果。           

複制

為了檢查我們的模型是如何生成的,我們需要計算預測分數和建立混淆矩陣來了解模型的準确性。

pred<-fitted(blr)
# 拟合隻能用于獲得生成模型的資料的預測分數。           

複制

R語言邏輯回歸、Naive Bayes貝葉斯、決策樹、随機森林算法預測心髒病資料集資訊:

我們可以看到,預測的分數是患心髒病的機率。但我們必須找到一個适當的分界點,從這個分界點可以很容易地區分是否患有心髒病。

為此,我們需要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))           

複制

R語言邏輯回歸、Naive Bayes貝葉斯、決策樹、随機森林算法預測心髒病資料集資訊:

通過使用ROC曲線,我們可以觀察到0.6具有更好的敏感性和特異性,是以我們選擇0.6作為區分的分界點。

pred1<-ifelse(pred<0.6,"No","Yes")           

複制

R語言邏輯回歸、Naive Bayes貝葉斯、決策樹、随機森林算法預測心髒病資料集資訊:
# 訓練資料的準确性
acc_tr           

複制

R語言邏輯回歸、Naive Bayes貝葉斯、決策樹、随機森林算法預測心髒病資料集資訊:

從訓練資料的混淆矩陣中,我們知道模型有88.55%的準确性。

現在在測試資料上驗證該模型

predict(type = "response")
## type = "response "是用來獲得患有心髒病的機率的結果。
head(test)           

複制

R語言邏輯回歸、Naive Bayes貝葉斯、決策樹、随機森林算法預測心髒病資料集資訊:

我們知道,對于訓練資料來說,臨界點是0.6。同樣地,測試資料也會有相同的臨界點。

confusionMatrix((pred1),target)           

複制

R語言邏輯回歸、Naive Bayes貝葉斯、決策樹、随機森林算法預測心髒病資料集資訊:
#測試資料的準确性.           

複制

R語言邏輯回歸、Naive Bayes貝葉斯、決策樹、随機森林算法預測心髒病資料集資訊:

檢查我們的預測值有多少位于曲線内

[email protected]           

複制

R語言邏輯回歸、Naive Bayes貝葉斯、決策樹、随機森林算法預測心髒病資料集資訊:

我們可以得出結論,我們的準确率為81.58%,90.26%的預測值位于曲線之下。同時,我們的錯誤分類率為18.42%。

Naive Bayes算法

在執行Naive Bayes算法之前,需要删除我們在執行BLR時添加的額外預測列。

#naivebayes模型
nB(target~.)           

複制

用訓練資料檢查模型,并建立其混淆矩陣,來了解模型的準确程度。

predict(train)
confMat(pred,target)           

複制

R語言邏輯回歸、Naive Bayes貝葉斯、決策樹、随機森林算法預測心髒病資料集資訊:
R語言邏輯回歸、Naive Bayes貝葉斯、決策樹、随機森林算法預測心髒病資料集資訊:

我們可以說,貝葉斯算法對訓練資料的準确率為85.46%。

現在,通過預測和建立混淆矩陣來驗證測試資料的模型。

Matrix(pred,target)           

複制

R語言邏輯回歸、Naive Bayes貝葉斯、決策樹、随機森林算法預測心髒病資料集資訊:
R語言邏輯回歸、Naive Bayes貝葉斯、決策樹、随機森林算法預測心髒病資料集資訊:

我們可以得出結論,在Naive Bayes算法的幫助下生成的模型準确率為78.95%,或者我們也可以說Naive Bayes算法的錯誤分類率為21.05%。

決策樹

在實施決策樹之前,我們需要删除我們在執行Naive Bayes算法時添加的額外列。

train$pred<-NULL           

複制

rpart代表遞歸分區和回歸樹

當自變量和因變量都是連續的或分類的時候,就會用到rpart。

rpart會自動檢測是否要根據因變量進行回歸或分類。

實施決策樹

plot(tree)           

複制

R語言邏輯回歸、Naive Bayes貝葉斯、決策樹、随機森林算法預測心髒病資料集資訊:

在決策樹的幫助下,我們可以說所有變量中最重要的是CP、CA、THAL、Oldpeak。

讓我們用測試資料來驗證這個模型,并找出模型的準确性。

conMat(pred,targ)           

複制

R語言邏輯回歸、Naive Bayes貝葉斯、決策樹、随機森林算法預測心髒病資料集資訊:
R語言邏輯回歸、Naive Bayes貝葉斯、決策樹、随機森林算法預測心髒病資料集資訊:

我們可以說,決策樹的準确率為76.32%,或者說它的錯誤分類率為23.68%。

随機森林

在執行随機森林之前,我們需要删除我們在執行決策樹時添加的額外預測列。

test$pred<-NULL           

複制

在随機森林中,我們不需要将資料分成訓練資料和測試資料,我們直接在整個資料上生成模型。為了生成模型,我們需要使用随機森林庫

# Set.seed通過限制permutation來控制随機性。

set.seed(100)
model_rf<-randomForest(target~.,data = heart)
model_rf           

複制

R語言邏輯回歸、Naive Bayes貝葉斯、決策樹、随機森林算法預測心髒病資料集資訊:

在圖上繪制出随機森林與誤差的關系。

plot(model_rf)           

複制

R語言邏輯回歸、Naive Bayes貝葉斯、決策樹、随機森林算法預測心髒病資料集資訊:

紅線代表沒有心髒病的MCR,綠線代表有心髒病的MCR,黑線代表總體MCR或OOB誤差。總體誤差率是我們感興趣的,結果不錯。

結論

在進行了各種分類技術并考慮到它們的準确性後,我們可以得出結論,所有模型的準确性都在76%到84%之間。其中,随機森林的準确率略高,為83.5%。

R語言邏輯回歸、Naive Bayes貝葉斯、決策樹、随機森林算法預測心髒病資料集資訊: