【視頻】決策樹模型原理和R語言預測心臟病實例
全文鏈接:https://tecdat.cn/?p=33128
原文出處:拓端數(shù)據(jù)部落公眾號
分析師:Yudong Wan
決策樹模型簡介
決策樹模型是一種非參數(shù)的有監(jiān)督學習方法,它能夠從一系列有特征和標簽的數(shù)據(jù)中總結(jié)出決策規(guī)則,并用樹狀圖的結(jié)構來呈現(xiàn)這些規(guī)則,以解決分類和回歸問題。與傳統(tǒng)的線性回歸模型不同,決策樹回歸模型能夠捕捉到非線性關系,并生成易于解釋的規(guī)則。

決策樹模型的實現(xiàn)過程
決策樹模型的實現(xiàn)過程主要包括三個步驟:特征選擇、樹的構建和剪枝。
首先,特征選擇是為了確定在每個節(jié)點上進行分割的最佳特征。常用的特征選擇指標有信息增益、基尼指數(shù)等。

其次,樹的構建是通過遞歸地分割數(shù)據(jù)集來生成決策樹。根據(jù)某個標準,我們選擇一個特征作為劃分依據(jù),并將數(shù)據(jù)集劃分為更小的子集。


最后,剪枝是為了避免過擬合,提高模型的泛化能力。我們可以通過剪掉一些葉節(jié)點來減少決策樹的復雜度。
max_features:在劃分節(jié)點時所考慮的特征值數(shù)量的最大值,默認取None,可以傳入int型或float型數(shù)據(jù)。如果是float型數(shù)據(jù),表示百分數(shù)。max_leaf_nodes:最大葉子節(jié)點數(shù),默認取None,可以傳入int型數(shù)據(jù)。
min samples leaf:葉子節(jié)點的最少樣本數(shù),默認取1,如果小于該數(shù)值,該葉子節(jié)點會和兄弟節(jié)點一起被剪枝(即剔除該葉子節(jié)點和其兌弟節(jié)點,并停止分裂)。
min_weight_fraction_leaf:葉子節(jié)點最小的樣本權重和,默認取0,即不考慮權重問題,如果小于該數(shù)值,該葉子節(jié)點會和兄弟節(jié)點一起被剪枝(即剔除該葉子節(jié)點和其兄弟節(jié)點,并停止分裂)。如果較多樣本有缺失值或者樣本的分布類別偏差很大,則需考慮樣本權重問題。 max_features:在劃分節(jié)點時所考慮的特征值數(shù)量的最大值,默認取None,可以傳入int型或float型數(shù)據(jù)。如果是float型數(shù)據(jù),表示百分數(shù)。max_leaf_nodes:最大葉子節(jié)點數(shù),默認取None,可以傳入int型數(shù)據(jù)。


決策樹模型的應用場景
應用場景:決策樹模型適用于非線性關系較為明顯的問題,例如:
1.房屋價格預測:基于一些特征(如地理位置、面積等),預測房屋的價格。

2.銷售量預測:根據(jù)產(chǎn)品的特征(如價格、廣告費用等),預測銷售量。

決策樹模型的優(yōu)缺點
優(yōu)點
決策樹模型具有以下優(yōu)點: 首先,它易于理解和解釋,生成的決策樹可以直觀地呈現(xiàn)規(guī) 則,讓我們能夠了解特征對結(jié)果的影響。
其次,決策樹模型能夠處理離散型和連續(xù)型的特征,適用于 多種數(shù)據(jù)類型。
最后,它對異常值和缺失值相對不敏感,能夠在存在噪聲的 數(shù)據(jù)集中表現(xiàn)較好。
缺點
然而,決策樹模型也有一些缺點需要注意:
首先,在處理復雜問題時,決策樹可能過度擬合訓練數(shù)據(jù),導致泛化能力較差,需要采取剪枝等措施來解決這個問題。
其次,對于特征空間劃分較多的數(shù)據(jù),決策樹可能會產(chǎn)生過于復雜的模型,難以解釋和理解。
最后,決策樹的訓練過程容易受到數(shù)據(jù)的微小變化影響,可能會產(chǎn)生不穩(wěn)定的結(jié)果。
R語言邏輯回歸、Naive Bayes貝葉斯、決策樹、隨機森林算法預測心臟病
數(shù)據(jù)集信息:
這個數(shù)據(jù)集可以追溯到1988年,由四個數(shù)據(jù)庫組成??死蛱m、匈牙利、瑞士和長灘。"目標 "字段是指病人是否有心臟病。它的數(shù)值為整數(shù),0=無病,1=有病。
目標:
主要目的是預測給定的人是否有心臟病,借助于幾個因素,如年齡、膽固醇水平、胸痛類型等。
我們在這個問題上使用的算法是:
二元邏輯回歸
Naive Bayes算法
決策樹
隨機森林
數(shù)據(jù)集的描述:
該數(shù)據(jù)有303個觀察值和14個變量。每個觀察值都包含關于個人的以下信息。
年齡:- 個人的年齡,以年為單位
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 - 達到的最大心率
exang - 運動誘發(fā)的心絞痛(1=是;0=否)
oldpeak - 相對于靜止狀態(tài),運動誘發(fā)的ST壓低
slope - 運動時ST段峰值的斜率(1=上斜;2=平坦;3=下斜)
ca - 主要血管的數(shù)量(0-4),由Flourosopy著色
地中海貧血癥--地中海貧血癥是一種遺傳性血液疾病,會影響身體產(chǎn)生血紅蛋白和紅細胞的能力。1=正常;2=固定缺陷;3=可逆轉(zhuǎn)缺陷
目標--預測屬性--心臟疾病的診斷(血管造影疾病狀態(tài))(值0=<50%直徑狹窄;值1=>50%直徑狹窄)
在Rstudio中加載數(shù)據(jù)
heart<-read.csv("heart.csv",header = T)
header = T意味著給定的數(shù)據(jù)有自己的標題,或者換句話說,第一個觀測值也被考慮用于預測。?
head(heart)

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

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

這個函數(shù)是用來檢查我們的數(shù)據(jù)是否包含任何NA值。
如果沒有發(fā)現(xiàn)NA,我們就可以繼續(xù)前進,否則我們就必須在之前刪除NA。
檢查我們的數(shù)據(jù)結(jié)構
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)換為因子和標簽。
根據(jù)數(shù)據(jù)集的描述,exang應該是因子。心絞痛發(fā)生或不發(fā)生。因此,將該變量轉(zhuǎn)換為因子。
斜率不能是整數(shù),因為它是在心電圖中觀察到的斜率類型。因此,我們將變量轉(zhuǎn)換為因子。
根據(jù)數(shù)據(jù)集的描述,ca不是整數(shù)。因此,我們要將該變量轉(zhuǎn)換為因子。
thal不是整數(shù),因為它是地中海貧血的類型。因此,我們將變量轉(zhuǎn)換為因子。
目標是預測變量,告訴我們這個人是否有心臟病。因此,我們將該變量轉(zhuǎn)換為因子,并為其貼上標簽。
根據(jù)上述考慮,我們對變量做了一些變化
#例如sex<-as.factor(sex)levels(sex)<-c("Female","Male")
檢查上述變化是否執(zhí)行成功
str(heart)

summary(heart)

??
EDA
EDA是探索性數(shù)據(jù)分析(Exploratory Data Analysis)的縮寫,它是一種數(shù)據(jù)分析的方法/哲學,采用各種技術(主要是圖形技術)來深入了解數(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ù)是典型的胸痛類型,然后是非心絞痛。
執(zhí)行機器學習算法
Logistic回歸
首先,我們將數(shù)據(jù)集分為訓練數(shù)據(jù)(75%)和測試數(shù)據(jù)(25%)。
set.seed(100) #100用于控制抽樣的permutation為100. index<-sample(nrow(heart),0.75*nrow(heart))
在訓練數(shù)據(jù)上生成模型,然后用測試數(shù)據(jù)驗證模型。?
glm(family = "binomial")# family = " 二項式 "意味著只包含兩個結(jié)果。
為了檢查我們的模型是如何生成的,我們需要計算預測分數(shù)和建立混淆矩陣來了解模型的準確性。?
pred<-fitted(blr)# 擬合只能用于獲得生成模型的數(shù)據(jù)的預測分數(shù)。

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

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

在此對Yudong Wan對本文所作的貢獻表示誠摯感謝,他完成了數(shù)據(jù)科學與大數(shù)據(jù)技術學位,專注數(shù)據(jù)分析,機器學習。擅長Python、R。

最受歡迎的見解
1.R語言多元Logistic邏輯回歸 應用案例
2.面板平滑轉(zhuǎn)移回歸(PSTR)分析案例實現(xiàn)
3.matlab中的偏最小二乘回歸(PLSR)和主成分回歸(PCR)
4.R語言泊松Poisson回歸模型分析案例
5.R語言回歸中的Hosmer-Lemeshow擬合優(yōu)度檢驗
6.r語言中對LASSO回歸,Ridge嶺回歸和Elastic Net模型實現(xiàn)
7.在R語言中實現(xiàn)Logistic邏輯回歸
8.python用線性回歸預測股票價格
9.R語言如何在生存分析與Cox回歸中計算IDI,NRI指標