數(shù)據(jù)分享|R語言邏輯回歸、Naive Bayes貝葉斯、決策樹、隨機(jī)森林算法預(yù)測心臟病|附代碼
全文鏈接:http://tecdat.cn/?p=23061
最近我們被客戶要求撰寫關(guān)于預(yù)測心臟病的研究報告,包括一些圖形和統(tǒng)計輸出。
這個數(shù)據(jù)集可以追溯到1988年,由四個數(shù)據(jù)庫組成。克利夫蘭、匈牙利、瑞士和長灘。"目標(biāo) "字段是指病人是否有心臟病。它的數(shù)值為整數(shù),0=無病,1=有病
數(shù)據(jù)集信息:
目標(biāo):
主要目的是預(yù)測給定的人是否有心臟病,借助于幾個因素,如年齡、膽固醇水平、胸痛類型等。
我們在這個問題上使用的算法是:
二元邏輯回歸
Naive Bayes算法
決策樹
隨機(jī)森林
數(shù)據(jù)集的描述:
該數(shù)據(jù)有303個觀察值和14個變量。每個觀察值都包含關(guān)于個人的以下信息。
年齡:- 個人的年齡,以年為單位
sex:- 性別(1=男性;0=女性)
cp - 胸痛類型(1=典型心絞痛;2=非典型心絞痛;3=非心絞痛;4=無癥狀)。
trestbps--靜息血壓
chol - 血清膽固醇,單位:mg/dl
fbs - 空腹血糖水平>120 mg/dl(1=真;0=假)
restecg - 靜息心電圖結(jié)果(0=正常;1=有ST-T;2=肥大)
thalach - 達(dá)到的最大心率
exang - 運(yùn)動誘發(fā)的心絞痛(1=是;0=否)
oldpeak - 相對于靜止?fàn)顟B(tài),運(yùn)動誘發(fā)的ST壓低
slope - 運(yùn)動時ST段峰值的斜率(1=上斜;2=平坦;3=下斜)
ca - 主要血管的數(shù)量(0-4),由Flourosopy著色
地中海貧血癥--地中海貧血癥是一種遺傳性血液疾病,會影響身體產(chǎn)生血紅蛋白和紅細(xì)胞的能力。1=正常;2=固定缺陷;3=可逆轉(zhuǎn)缺陷
目標(biāo)--預(yù)測屬性--心臟疾病的診斷(血管造影疾病狀態(tài))(值0=<50%直徑狹窄;值1=>50%直徑狹窄)
在Rstudio中加載數(shù)據(jù)
heart<-read.csv("heart.csv",header?=?T)
header = T意味著給定的數(shù)據(jù)有自己的標(biāo)題,或者換句話說,第一個觀測值也被考慮用于預(yù)測。
head(heart)

當(dāng)我們想查看和檢查數(shù)據(jù)的前六個觀察點時,我們使用head函數(shù)。
tail(heart)

顯示的是我們數(shù)據(jù)中最后面的六個觀察點
colSums(is.na(heart))

這個函數(shù)是用來檢查我們的數(shù)據(jù)是否包含任何NA值。
如果沒有發(fā)現(xiàn)NA,我們就可以繼續(xù)前進(jìn),否則我們就必須在之前刪除NA。
檢查我們的數(shù)據(jù)結(jié)構(gòu)
str(heart)

查看我們的數(shù)據(jù)摘要
summary(heart)

通過觀察以上的總結(jié),我們可以說以下幾點
性別不是連續(xù)變量,因為根據(jù)我們的描述,它可以是男性或女性。因此,我們必須將性別這個變量名稱從整數(shù)轉(zhuǎn)換為因子。
cp不能成為連續(xù)變量,因為它是胸痛的類型。由于它是胸痛的類型,我們必須將變量cp轉(zhuǎn)換為因子。
fbs不能是連續(xù)變量或整數(shù),因為它顯示血糖水平是否低于120mg/dl。
restecg是因子,因為它是心電圖結(jié)果的類型。它不能是整數(shù)。所以,我們要把它轉(zhuǎn)換為因子和標(biāo)簽。
根據(jù)數(shù)據(jù)集的描述,exang應(yīng)該是因子。心絞痛發(fā)生或不發(fā)生。因此,將該變量轉(zhuǎn)換為因子。
斜率不能是整數(shù),因為它是在心電圖中觀察到的斜率類型。因此,我們將變量轉(zhuǎn)換為因子。
根據(jù)數(shù)據(jù)集的描述,ca不是整數(shù)。因此,我們要將該變量轉(zhuǎn)換為因子。
thal不是整數(shù),因為它是地中海貧血的類型。因此,我們將變量轉(zhuǎn)換為因子。
目標(biāo)是預(yù)測變量,告訴我們這個人是否有心臟病。因此,我們將該變量轉(zhuǎn)換為因子,并為其貼上標(biāo)簽。
根據(jù)上述考慮,我們對變量做了一些變化
#例如sex<-as.factor(sex)levels(sex)<-c("Female","Male")
檢查上述變化是否執(zhí)行成功
str(heart)

summary(heart)

EDA
EDA是探索性數(shù)據(jù)分析(Exploratory Data Analysis)的縮寫,它是一種數(shù)據(jù)分析的方法/哲學(xué),采用各種技術(shù)(主要是圖形技術(shù))來深入了解數(shù)據(jù)集。
對于圖形表示,我們需要庫 "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")

我們可以得出結(jié)論,與60歲以上的人相比,40至60歲的人患心臟病的概率最高。
table?<-?table(cp)pie(table)

我們可以得出結(jié)論,在所有類型的胸痛中,在個人身上觀察到的大多數(shù)是典型的胸痛類型,然后是非心絞痛。
點擊標(biāo)題查閱往期內(nèi)容

R語言用邏輯回歸、決策樹和隨機(jī)森林對信貸數(shù)據(jù)集進(jìn)行分類預(yù)測

左右滑動查看更多

01

02

03

04

執(zhí)行機(jī)器學(xué)習(xí)算法
Logistic回歸
首先,我們將數(shù)據(jù)集分為訓(xùn)練數(shù)據(jù)(75%)和測試數(shù)據(jù)(25%)。
set.seed(100)?#100用于控制抽樣的permutation為100.?index<-sample(nrow(heart),0.75*nrow(heart))
在訓(xùn)練數(shù)據(jù)上生成模型,然后用測試數(shù)據(jù)驗證模型。
glm(family?=?"binomial")#?family?=?"?二項式?"意味著只包含兩個結(jié)果。
為了檢查我們的模型是如何生成的,我們需要計算預(yù)測分?jǐn)?shù)和建立混淆矩陣來了解模型的準(zhǔn)確性。
pred<-fitted(blr)#?擬合只能用于獲得生成模型的數(shù)據(jù)的預(yù)測分?jǐn)?shù)。

我們可以看到,預(yù)測的分?jǐn)?shù)是患心臟病的概率。但我們必須找到一個適當(dāng)?shù)姆纸琰c,從這個分界點可以很容易地區(qū)分是否患有心臟病。
為此,我們需要ROC曲線,這是一個顯示分類模型在所有分類閾值下的性能的圖形。它將使我們能夠采取適當(dāng)?shù)呐R界值。
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作為區(qū)分的分界點。
pred1<-ifelse(pred<0.6,"No","Yes")

#?訓(xùn)練數(shù)據(jù)的準(zhǔn)確性acc_tr

從訓(xùn)練數(shù)據(jù)的混淆矩陣中,我們知道模型有88.55%的準(zhǔn)確性。
現(xiàn)在在測試數(shù)據(jù)上驗證該模型
predict(type?=?"response")##?type?=?"response?"是用來獲得患有心臟病的概率的結(jié)果。head(test)
我們知道,對于訓(xùn)練數(shù)據(jù)來說,臨界點是0.6。同樣地,測試數(shù)據(jù)也會有相同的臨界點。
confusionMatrix((pred1),target)
#測試數(shù)據(jù)的準(zhǔn)確性.
檢查我們的預(yù)測值有多少位于曲線內(nèi)
auc@y.values
我們可以得出結(jié)論,我們的準(zhǔn)確率為81.58%,90.26%的預(yù)測值位于曲線之下。同時,我們的錯誤分類率為18.42%。
Naive Bayes算法
在執(zhí)行Naive Bayes算法之前,需要刪除我們在執(zhí)行BLR時添加的額外預(yù)測列。
#naivebayes模型nB(target~.)
用訓(xùn)練數(shù)據(jù)檢查模型,并創(chuàng)建其混淆矩陣,來了解模型的準(zhǔn)確程度。
predict(train)confMat(pred,target)
我們可以說,貝葉斯算法對訓(xùn)練數(shù)據(jù)的準(zhǔn)確率為85.46%。
現(xiàn)在,通過預(yù)測和創(chuàng)建混淆矩陣來驗證測試數(shù)據(jù)的模型。
Matrix(pred,target)
我們可以得出結(jié)論,在Naive Bayes算法的幫助下生成的模型準(zhǔn)確率為78.95%,或者我們也可以說Naive Bayes算法的錯誤分類率為21.05%。
決策樹
在實施決策樹之前,我們需要刪除我們在執(zhí)行Naive Bayes算法時添加的額外列。
train$pred<-NULL
rpart代表遞歸分區(qū)和回歸樹
當(dāng)自變量和因變量都是連續(xù)的或分類的時候,就會用到rpart。
rpart會自動檢測是否要根據(jù)因變量進(jìn)行回歸或分類。
實施決策樹
plot(tree)
在決策樹的幫助下,我們可以說所有變量中最重要的是CP、CA、THAL、Oldpeak。
讓我們用測試數(shù)據(jù)來驗證這個模型,并找出模型的準(zhǔn)確性。
conMat(pred,targ)
我們可以說,決策樹的準(zhǔn)確率為76.32%,或者說它的錯誤分類率為23.68%。
隨機(jī)森林
在執(zhí)行隨機(jī)森林之前,我們需要刪除我們在執(zhí)行決策樹時添加的額外預(yù)測列。
test$pred<-NULL
在隨機(jī)森林中,我們不需要將數(shù)據(jù)分成訓(xùn)練數(shù)據(jù)和測試數(shù)據(jù),我們直接在整個數(shù)據(jù)上生成模型。為了生成模型,我們需要使用隨機(jī)森林庫
#?Set.seed通過限制permutation來控制隨機(jī)性。set.seed(100)model_rf<-randomForest(target~.,data?=?heart)model_rf
在圖上繪制出隨機(jī)森林與誤差的關(guān)系。
plot(model_rf)
紅線代表沒有心臟病的MCR,綠線代表有心臟病的MCR,黑線代表總體MCR或OOB誤差。總體誤差率是我們感興趣的,結(jié)果不錯。
結(jié)論
在進(jìn)行了各種分類技術(shù)并考慮到它們的準(zhǔn)確性后,我們可以得出結(jié)論,所有模型的準(zhǔn)確性都在76%到84%之間。其中,隨機(jī)森林的準(zhǔn)確率略高,為83.5%。
數(shù)據(jù)獲取
在下面公眾號后臺回復(fù)“心臟病數(shù)****據(jù)”,可免費(fèi)獲取完整數(shù)據(jù)。
本文摘選?《?R語言邏輯回歸、Naive Bayes貝葉斯、決策樹、隨機(jī)森林算法預(yù)測心臟病?》?,點擊“閱讀原文”獲取全文完整資料。

點擊標(biāo)題查閱往期內(nèi)容
R語言邏輯回歸logistic模型分析泰坦尼克titanic數(shù)據(jù)集預(yù)測生還情況R語言是否對二分連續(xù)變量執(zhí)行邏輯回歸
R語言用lme4多層次(混合效應(yīng))廣義線性模型(GLM),邏輯回歸分析教育留級調(diào)查數(shù)據(jù)
R語言隨機(jī)森林RandomForest、邏輯回歸Logisitc預(yù)測心臟病數(shù)據(jù)和可視化分析
R語言基于Bagging分類的邏輯回歸(Logistic Regression)、決策樹、森林分析心臟病患者
R語言邏輯回歸(Logistic回歸)模型分類預(yù)測病人冠心病風(fēng)險
R語言用局部加權(quán)回歸(Lowess)對logistic邏輯回歸診斷和殘差分析R語言用主成分PCA、?邏輯回歸、決策樹、隨機(jī)森林分析心臟病數(shù)據(jù)并高維可視化
R語言用線性模型進(jìn)行臭氧預(yù)測:加權(quán)泊松回歸,普通最小二乘,加權(quán)負(fù)二項式模型,多重插補(bǔ)缺失值R語言Bootstrap的嶺回歸和自適應(yīng)LASSO回歸可視化
R語言中回歸和分類模型選擇的性能指標(biāo)
R語言多元時間序列滾動預(yù)測:ARIMA、回歸、ARIMAX模型分析
R語言用lme4多層次(混合效應(yīng))廣義線性模型(GLM),邏輯回歸分析教育留級調(diào)查數(shù)據(jù)
R語言計量經(jīng)濟(jì)學(xué):虛擬變量(啞變量)在線性回歸模型中的應(yīng)用
R語言 線性混合效應(yīng)模型實戰(zhàn)案例
R語言混合效應(yīng)邏輯回歸(mixed effects logistic)模型分析肺癌數(shù)據(jù)
R語言如何用潛類別混合效應(yīng)模型(LCMM)分析抑郁癥狀
R語言基于copula的貝葉斯分層混合模型的診斷準(zhǔn)確性研究
R語言建立和可視化混合效應(yīng)模型mixed effect model
R語言LME4混合效應(yīng)模型研究教師的受歡迎程度
R語言 線性混合效應(yīng)模型實戰(zhàn)案例
R語言用Rshiny探索lme4廣義線性混合模型(GLMM)和線性混合模型(LMM)
R語言基于copula的貝葉斯分層混合模型的診斷準(zhǔn)確性研究
R語言如何解決線性混合模型中畸形擬合(Singular fit)的問題
基于R語言的lmer混合線性回歸模型
R語言用WinBUGS 軟件對學(xué)術(shù)能力測驗建立層次(分層)貝葉斯模型
R語言分層線性模型案例
R語言用WinBUGS 軟件對學(xué)術(shù)能力測驗(SAT)建立分層模型
使用SAS,Stata,HLM,R,SPSS和Mplus的分層線性模型HLM
R語言用WinBUGS 軟件對學(xué)術(shù)能力測驗建立層次(分層)貝葉斯模型
SPSS中的多層(等級)線性模型Multilevel linear models研究整容手術(shù)數(shù)據(jù)
用SPSS估計HLM多層(層次)線性模型模型