แผนผังการตัดสินใจใน R: แผนผังการจำแนกประเภทพร้อมตัวอย่าง

⚡ สรุปอย่างชาญฉลาด

Decision Tree ใน R แบ่งข้อมูลออกเป็นกิ่งก้านโดยใช้กฎง่ายๆ ว่าใช่หรือไม่ใช่ จนกระทั่งแต่ละใบมีคลาสเด่นเพียงคลาสเดียว บทแนะนำนี้จะสร้าง พล็อต ประเมินผล และปรับแต่ง Decision Tree ของ Rpart บนชุดข้อมูลการรอดชีวิตจากเรือไททานิก

  • 🌳 คำจำกัดความหลัก: โครงสร้างแบบต้นไม้จะแบ่งพื้นที่ตัวทำนายออกเป็นส่วนๆ แบบเรียกซ้ำ โดยเลือกการแบ่งที่แต่ละโหนดซึ่งช่วยลดความไม่บริสุทธิ์ของคลาสได้มากที่สุด
  • 🔄 การเตรียมข้อมูล: สลับลำดับไฟล์ Titanic ที่เรียงลำดับแล้วด้วย sample() ลบคอลัมน์ตัวระบุ แปลงแฟกเตอร์ จากนั้นลบแถวที่มีค่า NA ออก
  • 🛠️ ไวยากรณ์ของโมเดล: เรียก rpart(survived~., data = data_train, method = 'class') และแสดงผลลัพธ์ด้วย rpart.plot(fit, extra = 106)
  • ⚙️ จูน: rpart.control() จะแสดงค่า minsplit, minbucket, maxdepth และ cp ซึ่งช่วยเพิ่มความแม่นยำเป็น 79.90 เปอร์เซ็นต์
  • 📊 การประเมินผล: สร้างเมทริกซ์ความสับสนโดยใช้ table() จากนั้นหารค่าในแนวทแยงด้วยค่าทั้งหมด จะได้ความแม่นยำในการทดสอบ 78.47 เปอร์เซ็นต์

ต้นไม้ตัดสินใจใน R

ต้นไม้การตัดสินใจคืออะไร?

ต้นไม้แห่งการตัดสินใจ ต้นไม้ตัดสินใจ (Decision Tree) เป็นอัลกอริธึมการเรียนรู้ของเครื่องที่อเนกประสงค์ สามารถทำงานได้ทั้งการจำแนกประเภทและการถดถอย เป็นอัลกอริธึมที่มีประสิทธิภาพสูงมาก สามารถจัดการกับชุดข้อมูลที่ซับซ้อนได้ นอกจากนี้ ต้นไม้ตัดสินใจยังเป็นส่วนประกอบพื้นฐานของป่าสุ่ม (Random Forest) ซึ่งเป็นหนึ่งในอัลกอริธึมการเรียนรู้ของเครื่องที่มีประสิทธิภาพมากที่สุดในปัจจุบัน

ก่อนที่จะสร้างโครงสร้างต้นไม้ในโค้ด จะเป็นประโยชน์อย่างยิ่งหากเราเข้าใจว่าต้นไม้ตัดสินใจแยกออกที่จุดใด

ต้นไม้การตัดสินใจทำงานอย่างไร?

แผนผังการตัดสินใจจะแปลงชุดข้อมูลให้เป็นผังงานของคำถามใช่หรือไม่ใช่ ซึ่งสร้างขึ้นจากโหนดสามประเภท ได้แก่: ราก รวบรวมการสังเกตการณ์การฝึกอบรมทุกครั้ง โหนดภายใน ตั้งคำถามเกี่ยวกับตัวแปรทำนายหนึ่งตัวและแบ่งข้อมูลออกเป็นสองส่วน และ ใบไม้ หยุดการแบ่งและส่งคืนคลาสส่วนใหญ่

การเติบโตเป็นไปตามกระบวนการที่เห็นแก่ตัว เรียกว่า การแบ่งพาร์ติชันไบนารีแบบเรียกซ้ำ:

  1. ประเมินผลการแบ่งกลุ่มผู้สมัครแต่ละราย สำหรับตัวแปรทำนายแต่ละตัวและจุดตัดแต่ละจุด ให้วัดว่ากลุ่มทั้งสองที่ได้จะมีระดับความไม่บริสุทธิ์มากน้อยเพียงใด
  2. เก็บอันที่ดีที่สุดไว้ คำถามที่ถูกถาม ณ จุดนั้นคือ การแยกส่วนที่ช่วยลดสิ่งเจือปนได้มากที่สุด
  3. ทำซ้ำแบบเดียวกันกับเด็กแต่ละคน จนกว่าจะมีกฎควบคุมมาหยุดมันไว้ เช่น minsplit, minbucket, maxdepth หรือ cp
  4. พรุน. จากนั้น cp จะตัดกิ่งที่ไม่ก่อให้เกิดรายได้ ซึ่งจะช่วยป้องกันไม่ให้ต้นไม้จดจำชุดข้อมูลฝึกฝน

เนื่องจากแต่ละคำถามเปรียบเทียบตัวแปรหนึ่งตัวกับค่าเกณฑ์ ดังนั้นอัลกอริทึมจึงไม่จำเป็นต้องปรับขนาดหรือเข้ารหัสตัวแปรจำลอง

ดัชนี Gini เทียบกับเอนโทรปีในต้นไม้ตัดสินใจ

สามารถวัดปริมาณสารปนเปื้อนนั้นได้สองวิธี และ rpart ช่วยให้คุณเลือกได้

หลักเกณฑ์ ดัชนีจินี เอนโทรปี (การเพิ่มขึ้นของข้อมูล)
สูตร 1 – ผลรวมของสัดส่วนชั้นเรียนยกกำลังสอง -ผลรวมของ p คูณ log2(p)
ช่วง (สองระดับ) เพื่อ 0 0.5 เพื่อ 0 1
การคำนวณ เร็วขึ้น ไม่ต้องใช้ลอการิทึม ช้ากว่า ใช้ลอการิทึม
การตั้งค่า rpart ค่าเริ่มต้น พารามิเตอร์ = รายการ (แยก = “ข้อมูล”)
fit_entropy <- rpart(survived~., data = data_train, method = 'class',
    parms = list(split = "information"))

ในทางปฏิบัติ เกณฑ์ทั้งสองให้ผลลัพธ์ที่เหมือนกันในส่วนใหญ่ ดังนั้นดัชนี Gini ที่เป็นค่าเริ่มต้นจึงเป็นตัวเลือกที่ปลอดภัย

ข้อดีและข้อเสียของแผนผังการตัดสินใจ

ข้อดีข้อเสียจะบอกคุณว่าเมื่อใดที่ต้นไม้ต้นเดียวเพียงพอ และเมื่อใดควรเปลี่ยนไปใช้กลุ่มต้นไม้

ข้อดี

  • สามารถแปลความหมายได้อย่างสมบูรณ์: แบบจำลองที่ปรับแต่งแล้วนั้นเป็นแผนภาพที่ผู้มีส่วนได้ส่วนเสียทุกคนสามารถอ่านได้
  • การประมวลผลเบื้องต้นขั้นต่ำ: ไม่ต้องปรับขนาดหรือทำให้เป็นมาตรฐาน และตัวประกอบต่างๆ สามารถทำงานได้โดยตรง
  • จัดการทั้งสองอย่าง: method = 'class' ใช้สำหรับสร้างตัวจำแนกประเภท และ method = 'anova' ใช้สำหรับสร้างต้นไม้การถดถอย
  • ฝึกฝนได้เร็ว: ชุดข้อมูลขนาดใหญ่สามารถประมวลผลได้ในเวลาเพียงไม่กี่วินาที ดังนั้นโครงสร้างข้อมูลแบบต้นไม้จึงเป็นเกณฑ์พื้นฐานเบื้องต้นที่มีประโยชน์

ข้อเสีย

  • ความผันแปรสูง: การเปลี่ยนแปลงเพียงเล็กน้อยในข้อมูลการฝึกฝนก็สามารถสร้างต้นไม้ที่มีโครงสร้างแตกต่างกันอย่างสิ้นเชิงได้
  • มีแนวโน้มที่จะเกิดการโอเวอร์ฟิตติ้ง: ต้นไม้ที่เติบโตอย่างอิสระจะเติบโตจนกว่าใบทุกใบจะเป็นใบบริสุทธิ์ เว้นแต่ว่าค่า cp และ maxdepth จะจำกัดการเติบโตนั้น
  • การแบ่งแบบขนานแกนเท่านั้น: ขอบเขตแนวทแยงจำเป็นต้องมีการตัดเป็นรูปขั้นบันไดจำนวนมาก

วิธีแก้ไขจุดอ่อนสองข้อแรกคือการหาค่าเฉลี่ยของต้นไม้จำนวนมาก ซึ่งเป็นสิ่งที่... ป่าสุ่ม ไม่

วิธีการฝึกฝนและแสดงภาพต้นไม้ตัดสินใจในภาษา R

ในการสร้างแผนผังการตัดสินใจครั้งแรกของคุณใน R คุณจะต้องทำตามเจ็ดขั้นตอนดังต่อไปนี้:

  • ขั้นตอนที่ 1: นำเข้าข้อมูล
  • ขั้นตอนที่ 2: ทำความสะอาดชุดข้อมูล
  • ขั้นตอนที่ 3: สร้างชุดฝึก/ชุดทดสอบ
  • ขั้นตอนที่ 4: สร้างแบบจำลอง
  • ขั้นตอนที่ 5: ทำการทำนาย
  • ขั้นตอนที่ 6: วัดประสิทธิภาพ
  • ขั้นตอนที่ 7: ปรับไฮเปอร์พารามิเตอร์

ขั้นตอนที่ 1) นำเข้าข้อมูล

หากคุณสงสัยเกี่ยวกับชะตากรรมของไททานิค คุณสามารถรับชมวิดีโอนี้ได้ที่ Youtube- วัตถุประสงค์ของชุดข้อมูลนี้คือเพื่อคาดการณ์ว่าผู้คนกลุ่มใดมีแนวโน้มที่จะมีชีวิตรอดหลังจากการชนกับภูเขาน้ำแข็ง ชุดข้อมูลประกอบด้วยตัวแปร 13 ตัวและการสังเกต 1309 รายการ ชุดข้อมูลเรียงลำดับตามตัวแปร X

set.seed(678)
path <- 'https://raw.githubusercontent.com/guru99-edu/R-Programming/master/titanic_data.csv'
titanic <-read.csv(path)
head(titanic)

Output:

##   X pclass survived                                            name    sex
## 1 1      1        1                   Allen, Miss. Elisabeth Walton female
## 2 2      1        1                  Allison, Master. Hudson Trevor   male
## 3 3      1        0                    Allison, Miss. Helen Loraine female
## 4 4      1        0            Allison, Mr. Hudson Joshua Creighton   male
## 5 5      1        0 Allison, Mrs. Hudson J C (Bessie Waldo Daniels) female
## 6 6      1        1                             Anderson, Mr. Harry   male
##       age sibsp parch ticket     fare   cabin embarked
## 1 29.0000     0     0  24160 211.3375      B5        S
## 2  0.9167     1     2 113781 151.5500 C22 C26        S
## 3  2.0000     1     2 113781 151.5500 C22 C26        S
## 4 30.0000     1     2 113781 151.5500 C22 C26        S
## 5 25.0000     1     2 113781 151.5500 C22 C26        S
## 6 48.0000     0     0  19952  26.5500     E12        S
##                         home.dest
## 1                    St Louis, MO
## 2 Montreal, PQ / Chesterville, ON
## 3 Montreal, PQ / Chesterville, ON
## 4 Montreal, PQ / Chesterville, ON
## 5 Montreal, PQ / Chesterville, ON
## 6                    New York, NY
tail(titanic)

Output:

##         X pclass survived                      name    sex  age sibsp
## 1304 1304      3        0     Yousseff, Mr. Gerious   male   NA     0
## 1305 1305      3        0      Zabour, Miss. Hileni female 14.5     1
## 1306 1306      3        0     Zabour, Miss. Thamine female   NA     1
## 1307 1307      3        0 Zakarian, Mr. Mapriededer   male 26.5     0
## 1308 1308      3        0       Zakarian, Mr. Ortin   male 27.0     0
## 1309 1309      3        0        Zimmerman, Mr. Leo   male 29.0     0
##      parch ticket    fare cabin embarked home.dest
## 1304     0   2627 14.4583              C          
## 1305     0   2665 14.4542              C          
## 1306     0   2665 14.4542              C          
## 1307     0   2656  7.2250              C          
## 1308     0   2670  7.2250              C          
## 1309     0 315082  7.8750              S

จากเอาต์พุตส่วนหัวและส่วนท้าย คุณจะสังเกตเห็นว่าข้อมูลไม่ได้ถูกสับเปลี่ยน นี่เป็นปัญหาใหญ่! เมื่อคุณจะแบ่งข้อมูลของคุณระหว่างชุดรถไฟและชุดทดสอบ คุณจะต้องเลือก เพียง ผู้โดยสารชั้น 1 และ 2 (ไม่มีผู้โดยสารจากชั้น 3 อยู่ใน 80 เปอร์เซ็นต์แรกของการสังเกต) ซึ่งหมายความว่าอัลกอริทึมจะไม่เห็นคุณลักษณะของผู้โดยสารชั้น 3 ข้อผิดพลาดนี้จะนำไปสู่การทำนายที่ไม่ดี

เพื่อแก้ไขปัญหานี้ คุณสามารถใช้ฟังก์ชันตัวอย่าง()

shuffle_index <- sample(1:nrow(titanic))
head(shuffle_index)

แผนผังการตัดสินใจ รหัส R คำอธิบาย

  • ตัวอย่าง(1:nrow(ไททานิค)): สร้างรายการดัชนีแบบสุ่มตั้งแต่ 1 ถึง 1309 (เช่น จำนวนแถวสูงสุด)

Output:

## [1]  288  874 1078  633  887  992

คุณจะใช้ดัชนีนี้เพื่อสับเปลี่ยนชุดข้อมูลไททานิค

titanic <- titanic[shuffle_index, ]
head(titanic)

Output:

##         X pclass survived
## 288   288      1        0
## 874   874      3        0
## 1078 1078      3        1
## 633   633      3        0
## 887   887      3        1
## 992   992      3        1
##                                                           name    sex age
## 288                                      Sutton, Mr. Frederick   male  61
## 874                   Humblen, Mr. Adolf Mathias Nicolai Olsen   male  42
## 1078                                 O'Driscoll, Miss. Bridget female  NA
## 633  Andersson, Mrs. Anders Johan (Alfrida Konstantia Brogren) female  39
## 887                                        Jermyn, Miss. Annie female  NA
## 992                                           Mamee, Mr. Hanna   male  NA
##      sibsp parch ticket    fare cabin embarked           home.dest## 288      0     0  36963 32.3208   D50        S     Haddenfield, NJ
## 874      0     0 348121  7.6500 F G63        S                    
## 1078     0     0  14311  7.7500              Q                    
## 633      1     5 347082 31.2750              S Sweden Winnipeg, MN
## 887      0     0  14313  7.7500              Q                    
## 992      0     0   2677  7.2292              C	

ขั้นตอนที่ 2) ทำความสะอาดชุดข้อมูล

ตัวแปรหลายตัวมีค่าเป็น NA กระบวนการล้างข้อมูลแบ่งออกเป็นสามส่วน:

  • ลบตัวแปร home.dest, cabin, name, X และ ticket ออก
  • สร้างตัวแปรปัจจัยสำหรับ pclass และรอดมาได้
  • ปล่อย NA ออกไป
library(dplyr)
# Drop variables
clean_titanic <- titanic %>%
select(-c(home.dest, cabin, name, X, ticket)) %>% 
#Convert to factor level
	mutate(pclass = factor(pclass, levels = c(1, 2, 3), labels = c('Upper', 'Middle', 'Lower')),
	survived = factor(survived, levels = c(0, 1), labels = c('No', 'Yes'))) %>%
na.omit()
glimpse(clean_titanic)

Code คำอธิบาย

  • เลือก (-c (home.dest, ห้องโดยสาร, ชื่อ, X, ตั๋ว)): ปล่อยตัวแปรที่ไม่จำเป็น
  • pclass = factor(pclass, levels = c(1,2,3), labels= c('Upper', 'Middle', 'Lower')): เพิ่มป้ายกำกับให้กับตัวแปร pclass โดย 1 จะเป็น Upper, 2 จะเป็น Middle และ 3 จะเป็น Lower
  • factor(survived, levels = c(0,1), labels = c('No', 'Yes')): เพิ่มป้ายกำกับให้กับตัวแปร survived โดย 0 แทน No และ 1 แทน Yes
  • na.omit(): ลบการสังเกต NA

Output:

## Observations: 1,045
## Variables: 8
## $ pclass   <fctr> Upper, Lower, Lower, Upper, Middle, Upper, Middle, U...
## $ survived <fctr> No, No, No, Yes, No, Yes, Yes, No, No, No, No, No, Y...
## $ sex      <fctr> male, male, female, female, male, male, female, male...
## $ age      <dbl> 61.0, 42.0, 39.0, 49.0, 29.0, 37.0, 20.0, 54.0, 2.0, ...
## $ sibsp    <int> 0, 0, 1, 0, 0, 1, 0, 0, 4, 0, 0, 1, 1, 0, 0, 0, 1, 1,...
## $ parch    <int> 0, 0, 5, 0, 0, 1, 0, 1, 1, 0, 0, 1, 1, 0, 2, 0, 4, 0,...
## $ fare     <dbl> 32.3208, 7.6500, 31.2750, 25.9292, 10.5000, 52.5542, ...
## $ embarked <fctr> S, S, S, S, S, S, S, S, S, C, S, S, S, Q, C, S, S, C...		

ขั้นตอนที่ 3) สร้างชุดฝึก/ชุดทดสอบ

ก่อนที่คุณจะฝึกโมเดลของคุณ คุณต้องดำเนินการสองขั้นตอน:

  • สร้างชุดฝึกและชุดทดสอบ: คุณฝึกโมเดลในชุดชุดฝึกและทดสอบการทำนายในชุดทดสอบ (เช่น ข้อมูลที่มองไม่เห็น)
  • ติดตั้ง rpart.plot จากคอนโซล

แนวทางปฏิบัติทั่วไปคือการแบ่งข้อมูล 80/20 โดย 80 เปอร์เซ็นต์ของข้อมูลใช้เพื่อฝึกโมเดล และ 20 เปอร์เซ็นต์เพื่อคาดการณ์ คุณต้องสร้างเฟรมข้อมูลสองเฟรมแยกกัน คุณคงไม่อยากแตะชุดทดสอบจนกว่าคุณจะสร้างโมเดลเสร็จ คุณสามารถสร้างชื่อฟังก์ชัน create_train_test() ที่รับสามอาร์กิวเมนต์

create_train_test(df, size = 0.8, train = TRUE)
arguments:
-df: Dataset used to train the model.
-size: Size of the split. By default, 0.8. Numerical value
-train: If set to `TRUE`, the function creates the train set, otherwise the test set. Default value sets to `TRUE`. Boolean value.You need to add a Boolean parameter because R does not allow to return two data frames simultaneously.
create_train_test <- function(data, size = 0.8, train = TRUE) {
    n_row = nrow(data)
    total_row = size * n_row
    train_sample <- 1: total_row
    if (train == TRUE) {
        return (data[train_sample, ])
    } else {
        return (data[-train_sample, ])
    }
}

Code คำอธิบาย

  • function(data, size=0.8, train = TRUE): เพิ่มอาร์กิวเมนต์ในฟังก์ชัน
  • n_row = nrow(data): นับจำนวนแถวในชุดข้อมูล
  • Total_row = size*n_row: กลับแถวที่ n เพื่อสร้างชุดรถไฟ
  • train_sample <- 1:total_row: เลือกแถวแรกไปยังแถวที่ n
  • if (train ==TRUE){ } else { }: หากเงื่อนไขเป็นจริง ให้ส่งคืนชุดรถไฟ มิฉะนั้นจะเป็นชุดทดสอบ

คุณสามารถทดสอบฟังก์ชันของคุณและตรวจสอบมิติได้

data_train <- create_train_test(clean_titanic, 0.8, train = TRUE)
data_test <- create_train_test(clean_titanic, 0.8, train = FALSE)
dim(data_train)

Output:

## [1] 836   8
dim(data_test)

Output:

## [1] 209   8

ชุดข้อมูลฝึกฝนมี 836 แถวและ 8 คอลัมน์ ในขณะที่ชุดข้อมูลทดสอบมี 209 แถวและ 8 คอลัมน์เช่นเดียวกัน

คุณใช้ฟังก์ชัน prop.table() ร่วมกับ table() เพื่อตรวจสอบว่ากระบวนการสุ่มถูกต้องหรือไม่

prop.table(table(data_train$survived))

Output:

##
##        No       Yes 
## 0.5944976 0.4055024
prop.table(table(data_test$survived))

Output:

## 
##        No       Yes 
## 0.5789474 0.4210526

ในชุดข้อมูลทั้งสองชุด จำนวนผู้รอดชีวิตเท่ากัน คือประมาณ 40 เปอร์เซ็นต์

ติดตั้ง rpart.plot

rpart.plot ไม่พร้อมใช้งานจากไลบรารี conda คุณสามารถติดตั้งได้จากคอนโซล:

install.packages("rpart.plot")

ขั้นตอนที่ 4) สร้างแบบจำลอง

คุณพร้อมที่จะสร้างแบบจำลองแล้ว ไวยากรณ์สำหรับฟังก์ชัน rpart() ของต้นไม้ตัดสินใจมีดังนี้:

rpart(formula, data=, method='')
arguments:			
- formula: The function to predict
- data: Specifies the data frame
- method:			
- "class" for a classification tree 			
- "anova" for a regression tree	

คุณใช้วิธีการเรียนเพราะคุณทำนายชั้นเรียน

library(rpart)
library(rpart.plot)
fit <- rpart(survived~., data = data_train, method = 'class')
rpart.plot(fit, extra = 106)

Code คำอธิบาย

  • rpart(): ฟังก์ชั่นให้พอดีกับโมเดล ข้อโต้แย้งคือ:
    • รอดชีวิตมาได้ ~.: สูตรของแผนผังการตัดสินใจ
    • data = data_train: ชุดข้อมูล
    • method = 'class': ติดตั้งโมเดลไบนารี่
  • rpart.plot(fit, extra= 106): พล็อตแผนภูมิต้นไม้ โดยกำหนดค่าอาร์กิวเมนต์ extra เป็น 106 ซึ่งจะแสดงความน่าจะเป็นของคลาสที่สองบวกกับเปอร์เซ็นต์ของข้อมูลในแต่ละโหนด คุณสามารถอ้างอิงถึง... บทความสั้น สำหรับข้อมูลเพิ่มเติมเกี่ยวกับตัวเลือกอื่นๆ

Output:

 สร้างแบบจำลองแผนผังการตัดสินใจใน R

คุณเริ่มต้นที่โหนดราก ซึ่งอยู่ด้านบนสุดของกราฟ และที่ระดับความลึก 0 จาก 3:

  1. ที่ด้านบนคือความน่าจะเป็นโดยรวมของการเอาชีวิตรอด แสดงสัดส่วนผู้โดยสารที่รอดชีวิตจากอุบัติเหตุครั้งนี้ ผู้โดยสารร้อยละ 41 รอดชีวิต
  2. โหนดนี้ถามว่าผู้โดยสารเป็นเพศชายหรือไม่ ถ้าใช่ ก็จะไปยังโหนดลูกทางซ้ายของโหนดราก (ระดับความลึก 1) 63 เปอร์เซ็นต์เป็นเพศชาย โดยมีโอกาสรอดชีวิต 21 เปอร์เซ็นต์
  3. ในโหนดที่สอง คุณถามว่าผู้โดยสารชายมีอายุมากกว่า 3.5 ปีหรือไม่ ถ้าใช่ โอกาสรอดคือ 19 เปอร์เซ็นต์
  4. คุณทำแบบนั้นต่อไปเพื่อทำความเข้าใจว่าฟีเจอร์ใดที่ส่งผลต่อความน่าจะเป็นของการเอาชีวิตรอด

โปรดทราบว่า หนึ่งในคุณสมบัติหลายประการของแผนผังการตัดสินใจก็คือ จำเป็นต้องมีการเตรียมข้อมูลเพียงเล็กน้อย โดยเฉพาะอย่างยิ่งพวกเขาไม่จำเป็นต้องปรับขนาดคุณลักษณะหรือจัดกึ่งกลาง

โดยค่าเริ่มต้น ฟังก์ชัน rpart() จะใช้ Gini ตัวชี้วัดความไม่บริสุทธิ์ใช้ในการเลือกการแบ่งแต่ละครั้ง ยิ่งค่า Gini สูงเท่าไร คลาสภายในโหนดนั้นก็จะยิ่งผสมปนเปกันมากขึ้นเท่านั้น ดังนั้นอัลกอริทึมจึงเลือกการแบ่งที่ทำให้ค่า Gini ต่ำที่สุดเสมอ

ขั้นตอนที่ 5) ทำการทำนาย

คุณสามารถทำนายชุดข้อมูลทดสอบของคุณได้ ในการทำนาย คุณสามารถใช้ฟังก์ชันทำนาย () ไวยากรณ์พื้นฐานของการทำนายสำหรับแผนผังการตัดสินใจ R คือ:

predict(fitted_model, df, type = 'class')
arguments:
- fitted_model: This is the object stored after model estimation. 
- df: Data frame used to make the prediction
- type: Type of prediction			
    - 'class': for classification			
    - 'prob': to compute the probability of each class			
    - 'vector': Predict the mean response at the node level	

ตอนนี้ คุณจะต้องทำนายสำหรับผู้โดยสารทั้ง 209 คนในชุดทดสอบ ว่าแบบจำลองคาดการณ์ว่าพวกเขาจะรอดชีวิตจากอุบัติเหตุหรือไม่

predict_unseen <-predict(fit, data_test, type = 'class')

Code คำอธิบาย

  • ทำนาย (พอดี data_test ประเภท = 'คลาส'): ทำนายคลาส (0/1) ของชุดทดสอบ

ทีนี้ลองเปรียบเทียบกลุ่มที่คาดการณ์ไว้กับผลลัพธ์ที่แท้จริงดู

table_mat <- table(data_test$survived, predict_unseen)
table_mat

Code คำอธิบาย

  • table(data_test$survived, predict_unseen): สร้างตารางความสัมพันธ์ของคลาสที่คาดการณ์ไว้กับผลลัพธ์ที่แท้จริง

Output:

##      predict_unseen
##        No Yes
##   No  106  15
##   Yes  30  58

แถวแสดงค่าจริง คอลัมน์แสดงค่าที่ทำนายได้ แบบจำลองระบุผู้เสียชีวิตได้อย่างถูกต้อง 106 ราย และผู้รอดชีวิต 58 ราย แต่ระบุผู้เสียชีวิต 15 รายว่าเป็นผู้รอดชีวิต และผู้รอดชีวิต 30 รายว่าเสียชีวิต

ขั้นตอนที่ 6) วัดประสิทธิภาพ

คุณสามารถคำนวณการวัดความแม่นยำสำหรับงานจำแนกประเภทได้ด้วย เมทริกซ์ความสับสน:

การขอ เมทริกซ์ความสับสน เป็นทางเลือกที่ดีกว่าในการประเมินประสิทธิภาพการจำแนกประเภท แนวคิดทั่วไปคือการนับจำนวนครั้งที่อินสแตนซ์ True ถูกจัดว่าเป็นเท็จ

วัดประสิทธิภาพของแผนผังการตัดสินใจใน R

แต่ละแถวในเมทริกซ์ความสับสนแสดงถึงเป้าหมายจริง ในขณะที่แต่ละคอลัมน์แสดงถึงเป้าหมายที่คาดการณ์ไว้ แถวแรกของเมทริกซ์นี้พิจารณาผู้โดยสารที่เสียชีวิต (กลุ่มลบ): 106 คนถูกจัดประเภทว่าเสียชีวิตอย่างถูกต้อง (ลบจริง) ในขณะที่ 15 รายถูกจัดประเภทผิดว่าเป็นผู้รอดชีวิต (บวกเท็จแถวที่สองพิจารณาผู้รอดชีวิต: 58 คนได้รับการระบุอย่างถูกต้อง (บวกจริง) ขณะที่พลาดไป 30 ราย (ลบเชิงลบ).

คุณสามารถคำนวณ การทดสอบความแม่นยำ จากเมทริกซ์ความสับสน:

วัดประสิทธิภาพของแผนผังการตัดสินใจใน R

มันคือสัดส่วนของค่าบวกจริงและค่าลบจริงส่วนผลรวมของเมทริกซ์ ด้วย R คุณสามารถเขียนโค้ดได้ดังต่อไปนี้:

accuracy_Test <- sum(diag(table_mat)) / sum(table_mat)

Code คำอธิบาย

  • sum(diag(table_mat)): ผลรวมของเส้นทแยงมุม
  • sum(table_mat): ผลรวมของเมทริกซ์

คุณสามารถพิมพ์ความแม่นยำของชุดทดสอบได้:

print(paste('Accuracy for test', accuracy_Test))

Output:

## [1] "Accuracy for test 0.784688995215311"

ความแม่นยำบนชุดทดสอบคือ 0.7847 ซึ่งคิดเป็น 78.47 เปอร์เซ็นต์ ทำซ้ำขั้นตอนเดียวกันนี้กับชุดฝึกฝนเพื่อดูว่าโมเดลเกิดการโอเวอร์ฟิตมากน้อยเพียงใด

ขั้นตอนที่ 7) ปรับไฮเปอร์พารามิเตอร์

ต้นไม้การตัดสินใจใน R มีพารามิเตอร์ต่างๆ ที่ควบคุมด้านต่างๆ ของความพอดี ในไลบรารีต้นไม้การตัดสินใจ rpart คุณสามารถควบคุมพารามิเตอร์ได้โดยใช้ฟังก์ชัน rpart.control() ในโค้ดต่อไปนี้ คุณจะแนะนำพารามิเตอร์ที่คุณจะปรับแต่ง คุณสามารถดูได้ที่ บทความสั้น สำหรับพารามิเตอร์อื่นๆ

rpart.control(minsplit = 20, minbucket = round(minsplit/3), maxdepth = 30)
Arguments:
-minsplit: Set the minimum number of observations in the node before the algorithm perform a split
-minbucket: Set the minimum number of observations in a terminal node, i.e. the leaf
-maxdepth: Set the maximum depth of any node of the final tree. The root node is treated as depth 0

เราจะดำเนินการดังนี้:

  • สร้างฟังก์ชันเพื่อคืนความแม่นยำ
  • ปรับความลึกสูงสุด
  • ปรับจำนวนตัวอย่างขั้นต่ำที่โหนดต้องมีก่อนจึงจะสามารถแยกได้
  • ปรับจำนวนตัวอย่างขั้นต่ำที่โหนดปลายสุดต้องมี

คุณสามารถเขียนฟังก์ชันเพื่อแสดงความแม่นยำได้ คุณเพียงแค่ล้อมโค้ดที่คุณใช้ก่อนหน้านี้:

  1. ทำนาย: Predict_unseen <- ทำนาย (พอดี, data_test, ประเภท = 'คลาส')
  2. สร้างตาราง: table_mat <- table(data_test$survived, Predict_unseen)
  3. ความแม่นยำในการคำนวณ: precision_Test <- sum(diag(table_mat))/sum(table_mat)
accuracy_tune <- function(fit) {
    predict_unseen <- predict(fit, data_test, type = 'class')
    table_mat <- table(data_test$survived, predict_unseen)
    accuracy_Test <- sum(diag(table_mat)) / sum(table_mat)
    accuracy_Test
}

ทีนี้ลองปรับพารามิเตอร์และดูว่าคุณสามารถปรับปรุงผลลัพธ์จากโมเดลเริ่มต้นได้หรือไม่ โปรดจำไว้ว่า คุณต้องได้ค่าความแม่นยำสูงกว่า 0.7847

control <- rpart.control(minsplit = 4,
    minbucket = round(5 / 3),
    maxdepth = 3,
    cp = 0)
tune_fit <- rpart(survived~., data = data_train, method = 'class', control = control)
accuracy_tune(tune_fit)

Output:

## [1] 0.7990431

โดยมีพารามิเตอร์ดังต่อไปนี้:

minsplit = 4
minbucket = round(5/3)
maxdepth = 3
cp = 0

ความแม่นยำเพิ่มขึ้นจาก 0.7847 เป็น 0.7990 ดังนั้นโครงสร้างต้นไม้ที่ปรับแต่งแล้วจึงดีกว่าการกำหนดค่าเริ่มต้นประมาณ 1.4 เปอร์เซ็นต์

ต้นไม้ตัดสินใจใน R: คู่มืออ้างอิงฟังก์ชันฉบับย่อ

ตารางด้านล่างแสดงรายการฟังก์ชันทั้งหมดที่ใช้ในเจ็ดขั้นตอนข้างต้น พร้อมด้วยแพ็กเกจที่จัดหาฟังก์ชันนั้น และพารามิเตอร์ที่ฟังก์ชันนั้นคาดหวัง R.

ห้องสมุด วัตถุประสงค์ ฟังก์ชัน ชั้น พารามิเตอร์ รายละเอียด
ส่วนหนึ่ง ต้นไม้การจำแนกประเภทรถไฟใน R ส่วน() ชั้น สูตร df ​​วิธีการ
ส่วนหนึ่ง ฝึกแผนผังการถดถอย ส่วน() อโนวา สูตร df ​​วิธีการ
ส่วนหนึ่ง วางแผนต้นไม้ rpart.พล็อต() รุ่นที่ติดตั้ง
ฐาน คาดการณ์ ทำนาย() ชั้น รุ่นที่ติดตั้งประเภท
ฐาน คาดการณ์ ทำนาย() พร็อบ รุ่นที่ติดตั้งประเภท
ฐาน คาดการณ์ ทำนาย() เวกเตอร์ รุ่นที่ติดตั้งประเภท
ส่วนหนึ่ง พารามิเตอร์ควบคุม rpart.ควบคุม() แบ่งขั้นต่ำ กำหนดจำนวนการสังเกตขั้นต่ำในโหนดก่อนที่อัลกอริทึมจะทำการแยก
มินบัคเก็ต กำหนดจำนวนข้อมูลขั้นต่ำในโหนดปลายทาง หรือก็คือโหนดใบ
ความลึกสูงสุด กำหนดความลึกสูงสุดของโหนดใดๆ ในโครงสร้างต้นไม้สุดท้าย โดยโหนดรากจะมีระดับความลึกเป็น 0
ส่วนหนึ่ง ฝึกโมเดลพร้อมพารามิเตอร์ควบคุม ส่วน() สูตร, df, วิธีการ, การควบคุม

หมายเหตุ : ฝึกโมเดลกับข้อมูลการฝึกและทดสอบประสิทธิภาพกับชุดข้อมูลที่มองไม่เห็น เช่น ชุดทดสอบ

คำถามที่พบบ่อย

ทั้งสองแบบเหมาะสำหรับการสร้างต้นไม้จำแนกและต้นไม้ถดถอย rpart() ใช้ CART พร้อมการตัดแต่งแบบ cross-validated ในตัวผ่าน cp และจับคู่กับ rpart.plot สำหรับแผนภาพที่ชัดเจน ทำให้เป็นตัวเลือกที่นิยมใช้มากกว่า

ฟังก์ชัน `cp` กำหนดค่าการปรับปรุงขั้นต่ำที่การแบ่งแยกต้องให้เพื่อให้คงอยู่ ค่าที่มากขึ้นจะตัดแต่งอย่างรุนแรงและสร้างต้นไม้ที่มีขนาดเล็กกว่า ใช้ฟังก์ชัน `printcp()` และ `plotcp()` เพื่อค้นหาค่าที่มีข้อผิดพลาดจากการตรวจสอบแบบไขว้ต่ำที่สุด

ใช่แล้ว rpart() ใช้การแบ่งแบบตัวแทนเพื่อจัดเส้นทางข้อมูลที่มีตัวแปรทำนายที่ขาดหายไปไปยังสาขาที่คล้ายคลึงกันมากที่สุด บทช่วยสอนนี้เรียกใช้ na.omit() แทน เพื่อให้ชุดข้อมูลตัวอย่างง่ายขึ้นเท่านั้น

ต้นไม้ตัดสินใจเป็นหัวใจสำคัญของ AI ที่อธิบายได้ในด้านสินเชื่อ ประกันภัย และการดูแลสุขภาพ ซึ่งหน่วยงานกำกับดูแลอาจต้องการทราบเหตุผลที่แท้จริงเบื้องหลังการตัดสินใจ นอกจากนี้ยังเป็นพื้นฐานของตัวเรียนรู้ภายในโมเดล Gradient Boosting และ Random Forest อีกด้วย

ใช่แล้ว ผู้ช่วย AI สามารถแปลกฎการแบ่งกลุ่มให้เป็นภาษาที่เข้าใจง่าย แนะนำค่า cp ที่ควรทดสอบ และแจ้งเตือนการเกิด overfitting ในผลลัพธ์ของ printcp() ตรวจสอบคำแนะนำแต่ละข้อกับผลลัพธ์ cross-validation ของคุณเองก่อนที่จะนำไปใช้

สรุปโพสต์นี้ด้วย: