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

ต้นไม้การตัดสินใจคืออะไร?
ต้นไม้แห่งการตัดสินใจ ต้นไม้ตัดสินใจ (Decision Tree) เป็นอัลกอริธึมการเรียนรู้ของเครื่องที่อเนกประสงค์ สามารถทำงานได้ทั้งการจำแนกประเภทและการถดถอย เป็นอัลกอริธึมที่มีประสิทธิภาพสูงมาก สามารถจัดการกับชุดข้อมูลที่ซับซ้อนได้ นอกจากนี้ ต้นไม้ตัดสินใจยังเป็นส่วนประกอบพื้นฐานของป่าสุ่ม (Random Forest) ซึ่งเป็นหนึ่งในอัลกอริธึมการเรียนรู้ของเครื่องที่มีประสิทธิภาพมากที่สุดในปัจจุบัน
ก่อนที่จะสร้างโครงสร้างต้นไม้ในโค้ด จะเป็นประโยชน์อย่างยิ่งหากเราเข้าใจว่าต้นไม้ตัดสินใจแยกออกที่จุดใด
ต้นไม้การตัดสินใจทำงานอย่างไร?
แผนผังการตัดสินใจจะแปลงชุดข้อมูลให้เป็นผังงานของคำถามใช่หรือไม่ใช่ ซึ่งสร้างขึ้นจากโหนดสามประเภท ได้แก่: ราก รวบรวมการสังเกตการณ์การฝึกอบรมทุกครั้ง โหนดภายใน ตั้งคำถามเกี่ยวกับตัวแปรทำนายหนึ่งตัวและแบ่งข้อมูลออกเป็นสองส่วน และ ใบไม้ หยุดการแบ่งและส่งคืนคลาสส่วนใหญ่
การเติบโตเป็นไปตามกระบวนการที่เห็นแก่ตัว เรียกว่า การแบ่งพาร์ติชันไบนารีแบบเรียกซ้ำ:
- ประเมินผลการแบ่งกลุ่มผู้สมัครแต่ละราย สำหรับตัวแปรทำนายแต่ละตัวและจุดตัดแต่ละจุด ให้วัดว่ากลุ่มทั้งสองที่ได้จะมีระดับความไม่บริสุทธิ์มากน้อยเพียงใด
- เก็บอันที่ดีที่สุดไว้ คำถามที่ถูกถาม ณ จุดนั้นคือ การแยกส่วนที่ช่วยลดสิ่งเจือปนได้มากที่สุด
- ทำซ้ำแบบเดียวกันกับเด็กแต่ละคน จนกว่าจะมีกฎควบคุมมาหยุดมันไว้ เช่น minsplit, minbucket, maxdepth หรือ cp
- พรุน. จากนั้น 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:
คุณเริ่มต้นที่โหนดราก ซึ่งอยู่ด้านบนสุดของกราฟ และที่ระดับความลึก 0 จาก 3:
- ที่ด้านบนคือความน่าจะเป็นโดยรวมของการเอาชีวิตรอด แสดงสัดส่วนผู้โดยสารที่รอดชีวิตจากอุบัติเหตุครั้งนี้ ผู้โดยสารร้อยละ 41 รอดชีวิต
- โหนดนี้ถามว่าผู้โดยสารเป็นเพศชายหรือไม่ ถ้าใช่ ก็จะไปยังโหนดลูกทางซ้ายของโหนดราก (ระดับความลึก 1) 63 เปอร์เซ็นต์เป็นเพศชาย โดยมีโอกาสรอดชีวิต 21 เปอร์เซ็นต์
- ในโหนดที่สอง คุณถามว่าผู้โดยสารชายมีอายุมากกว่า 3.5 ปีหรือไม่ ถ้าใช่ โอกาสรอดคือ 19 เปอร์เซ็นต์
- คุณทำแบบนั้นต่อไปเพื่อทำความเข้าใจว่าฟีเจอร์ใดที่ส่งผลต่อความน่าจะเป็นของการเอาชีวิตรอด
โปรดทราบว่า หนึ่งในคุณสมบัติหลายประการของแผนผังการตัดสินใจก็คือ จำเป็นต้องมีการเตรียมข้อมูลเพียงเล็กน้อย โดยเฉพาะอย่างยิ่งพวกเขาไม่จำเป็นต้องปรับขนาดคุณลักษณะหรือจัดกึ่งกลาง
โดยค่าเริ่มต้น ฟังก์ชัน 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 ถูกจัดว่าเป็นเท็จ
แต่ละแถวในเมทริกซ์ความสับสนแสดงถึงเป้าหมายจริง ในขณะที่แต่ละคอลัมน์แสดงถึงเป้าหมายที่คาดการณ์ไว้ แถวแรกของเมทริกซ์นี้พิจารณาผู้โดยสารที่เสียชีวิต (กลุ่มลบ): 106 คนถูกจัดประเภทว่าเสียชีวิตอย่างถูกต้อง (ลบจริง) ในขณะที่ 15 รายถูกจัดประเภทผิดว่าเป็นผู้รอดชีวิต (บวกเท็จแถวที่สองพิจารณาผู้รอดชีวิต: 58 คนได้รับการระบุอย่างถูกต้อง (บวกจริง) ขณะที่พลาดไป 30 ราย (ลบเชิงลบ).
คุณสามารถคำนวณ การทดสอบความแม่นยำ จากเมทริกซ์ความสับสน:
มันคือสัดส่วนของค่าบวกจริงและค่าลบจริงส่วนผลรวมของเมทริกซ์ ด้วย 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
เราจะดำเนินการดังนี้:
- สร้างฟังก์ชันเพื่อคืนความแม่นยำ
- ปรับความลึกสูงสุด
- ปรับจำนวนตัวอย่างขั้นต่ำที่โหนดต้องมีก่อนจึงจะสามารถแยกได้
- ปรับจำนวนตัวอย่างขั้นต่ำที่โหนดปลายสุดต้องมี
คุณสามารถเขียนฟังก์ชันเพื่อแสดงความแม่นยำได้ คุณเพียงแค่ล้อมโค้ดที่คุณใช้ก่อนหน้านี้:
- ทำนาย: Predict_unseen <- ทำนาย (พอดี, data_test, ประเภท = 'คลาส')
- สร้างตาราง: table_mat <- table(data_test$survived, Predict_unseen)
- ความแม่นยำในการคำนวณ: 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, วิธีการ, การควบคุม |
หมายเหตุ : ฝึกโมเดลกับข้อมูลการฝึกและทดสอบประสิทธิภาพกับชุดข้อมูลที่มองไม่เห็น เช่น ชุดทดสอบ



