สรุปบันทึกการเรียนวิชา statistic 104 สำหรับนักวิทยาศาสตร์ข้อมูล - sprint 05

คำแนะนำจากผู้เขียน - ใครที่สนใจในเรื่องข้อมูล วิชาสถิติถือว่าเป็น foundation ของเรื่องนี้ สำหรับบทความนี้ เป็นสรุปบันทึกการเรียนวิชา statistic 104 สำหรับนักวิทยาศาสตร์ข้อมูล - sprint 05 ขอให้เครดิตแก่ Data Rockie ผู้เปิดโลกทัศน์วิชาด้านข้อมูล โดยที่ผู้เขียนเคยเรียนแล้วไม่เข้าใจแต่ เรียนกับคอร์สนี้แล้วเข้าใจ
content ในบทความนี้ประกอบไปด้วย
- When to use Logistic Regression
- A little math behind - sigmoid function
- Model training
- train-test-split
- Model Evaluation
- confusion matrix
- accuracy
- precision
- recall
- F1 score
โดยจะนำเนื้อหาไปใช้ google sheet และ R
ซึ่งบทความที่แล้วเราเรียนเรื่อง Linear Regression แต่ในบทความนี้จะเรียนเรื่อง Logistic Regression ซึ่งเอามาช่วยแก้ปัญหาในเรื่องของการ Classification แบบ Binary เช่น ใช่ ไม่ใช่ , จริง ไม่จริง , 0 กับ 1 เป็นต้น
โดย matric ของ Model Evaluation จะไม่เหมือนกับ Linear Regression ใน Linear Regression นั้นจะใช้ RMSE ในการประเมิน Model ส่วน Logistic Regression จะประเมินด้วย Confusion Metrix
ยกตัวอย่างในการใช้ Logictic Regression เราเอาไปประเมินว่าคนที่ลงทะเบียนใช้งานระบบหนึ่ง จะมีโอกาสที่เลิกใช้งาน หรือ เลิกต่ออายุ (churn model) เป็นต้น

มาดูตัวอย่างในการใช้งาน Logistic Regression เป็นการทำนายว่า ความสุข (happiness) มีโอกาสที่จะทำให้ คู่รัก สามีภรรยา หย่า (divorce) กันหรือไม่
โดยที่ เลข 0 คือ ไม่เลิก และ เลข 1 คือ เลิกกัน ซึ่ง column divorce เป็น column ค่า output y ตัวแปรตาม สังเกตว่ามันจะมีแค่เลข binary 0,1
ส่วน column hapiness เป็นค่าช่วงความสุข เป็น input แกน x หรือ ตัวแปรต้น โดยที่กำหนดว่า 0 ไม่มีความสุขเลย และ 10 มีความสุขมาก
โดยสังเกตว่า ตารางนี้จะถูก sort ด้วย column divorce ซึ่ง ข้อมูล ช่วง 10 - 6 (happiness level) จะไม่ divorce ในทางตรงกันข้ามค่าช่วง 0 - 6 จะ divorce
ซึ่งสมการของ Logistic Regression สำหรับตัวอย่างนี้ ก็คือ divorced = f( happiness level) โดย divorce เป็นตัวแปรตาม ค่า happiness level เป็นตัวแปรต้น ค่า Output ที่ได้จะเรียกว่า class โดยที่ 1 คือ positive class และ 0 คือ negative class
สรุป Logistic ใช้ต่างกับ Linear อย่างไร
ก็คือจะต่างกันแค่ output ของ Model
เมื่อลองเอาข้อมูลตามตารางมา plot graph ดูก็จะเห็นว่า

ค่าจริงทางฝั่งซ้าย เป็นค่า Actual Data ที่เก็บมา แกน Y เป็น จะเป็น Divorced และ Not Divorced แบ่งเป็น 1 และ 0 โดยแกน X เป็นค่าความสุขในชีวิตคู่
ซึ่งถ้ากลับมาดูที่ code สงสับมั้ยว่า เราจะทำนายอย่างไรให้รู้ว่า คู่รักที่มีค่า happiness ต่างๆ จะเลิกกันหรือไม่เลิกกัน ดูอย่างไร
มาดูทางฝั่งขวาบ้าง เมื่อเรา Fit Logistic Regression มันจะเข้าสมการ sigmoid ที่ทำให้ข้อมูลอยู่ระหว่าง 0 ถึง 1 ซึ่งเป็นค่าความน่าจะเป็น

ทำไมค่าของ Data set ตัวนี้ไม่สามารถใช้งาน Linear Regression ไม่ได้ ลองสังเกตจากกราฟที่ได้ Model ของ Linear Regression มีโอกาสที่จะทำนายผิด ซึ่งมากกว่า. 1 และ น้อยกว่า 0 ได้ เพราะมันเป็นเส้นตรง
ด้วยเหตุนี้ เราจึงต้องบีบค่าให้อยู่ระหว่าง 0 ถึง 1 โดยใช้สมการ sigmoid function


ค่า x ที่เห็นเป็นค่าที่ได้จากสมการเส้นตรง ที่ model ได้ทำการทำนายขึ้นมาแล้วนำไปเข้า sigmoid เพื่อบีบค่าให้อยู่ระหว่าง 0 ถึง 1 โดยเป็นค่าความน่าจะเป็น

เวลาที่เราจะทำการ Train Dataset เราจะต้องกระจาย Dataset หรือ Random Split Data ออกเป็น 2 กลุ่ม เราจะสุ่มแบบ Random ขึ้นมาให้เท่าๆกัน โดยเป็นกลุ่มชุดข้อมูล Train ที่จะทำการสอน Model แล้วในส่วนของ Test Dataset ให้เก็บเอาไว้ก่อน แล้วนำ Train Dataset ไป Train ให้เสร็จเรียบร้อยจนได้ Model ออกมา จากนั้นก็นำ Model.ที่ได้ไปทดสอบกับ Test Dataset ซึ่งกระบวนการทดสอบ Model จะดูตาม Metric ตามในกล่อง Model Evaluation
สิ่งที่เราอยากเห็น คือ Performace ความแม่นยำของ Train Data กับ Performace ความแม่นยำของ Test Data จะต้องมีค่าใกล้เคียงกัน นี่คือเป้าหมายของการทำ Model
คราวนี้มาดูตัวอย่างแรก
When to use logistic regression | |
---|---|
happiness | divorce |
10 | 0 |
8 | 0 |
9 | 0 |
7 | 0 |
8 | 0 |
5 | 0 |
9 | 0 |
6 | 0 |
8 | 0 |
7 | 0 |
1 | 1 |
1 | 1 |
3 | 1 |
1 | 1 |
4 | 1 |
5 | 1 |
6 | 1 |
3 | 1 |
2 | 1 |
0 | 1 |
ตัวแปรต้น คือ. happiness และ ตัวแปรตาม คือ divorce
ลำดับแรกลองเอาข้อมูลในตารางมา plot ด้วย scatter plot อย่างง่ายๆดูก่อน

จะเห็นว่าการ plot ที่เลข 1 และ 0
เดี๋ยวลองมาทบทวน Linear Regression กันก่อนโดย ฟังก์ชันของ regression จะเขียนแบบนี้
divorce = f(happiness)
โดยจะเป็นสมการเส้นตรง คือ
divorce = b0 + b1*happiness
b0 : intercept
b1 : slope
intercept | 1.211595774 |
---|---|
slope | -0.1381739366 |
คราวนี้เอาค่าสัมประสิทธิ์ที่ได้มาคำนวนค่าระหว่าง happiness. และ divorce ด้วยสมการเส้นตรง
happiness | divorce | linear regression |
---|---|---|
10 | 0 | -0.170144 |
8 | 0 | 0.106204 |
9 | 0 | -0.031970 |
7 | 0 | 0.244378 |
8 | 0 | 0.106204 |
5 | 0 | 0.520726 |
9 | 0 | -0.031970 |
6 | 0 | 0.382552 |
8 | 0 | 0.106204 |
7 | 0 | 0.244378 |
1 | 1 | 1.073422 |
1 | 1 | 1.073422 |
3 | 1 | 0.797074 |
1 | 1 | 1.073422 |
4 | 1 | 0.658900 |
5 | 1 | 0.520726 |
6 | 1 | 0.382552 |
3 | 1 | 0.797074 |
2 | 1 | 0.935248 |
0 | 1 | 1.211596 |
จะสังเกตได้ว่า มีค่าที่ติดลบอยู่ และมีเกินค่า 1 ไปด้วย ซึ่งจริงๆแล้วค่าที่ได้จากการทำนายจริงๆ ควรจะมีได้ 0 และ 1 ซึ่งสมการเส้นตรง หรือ linear regression นี้ไม่สามารถใช้กับปัญหาประมาณนี้ได้
คราวนี้จะมาใช้ Model หรือ สมการ Logistic Regression กันสักหน่อย ซึ่งใน Google Sheet จะมี extension เหมือนกับใน Excel ชื่อ XLMiner ซึ่งเป็น toolspak ที่มีเครื่องมือต่างๆ ไว้ใน anaysis
ให้เราหาเมนูชื่อ. Logistic Regression

ให้เลือก ค่า Y และ. X เลือก. Output ไปที่ช่อง cell ที่ต้องการ
เราจะได้ผลลัพท์หน้าตาประมาณนี้
SUMMARY OUTPUT | ||||||||
---|---|---|---|---|---|---|---|---|
Regression Statistics | ||||||||
Chi Square | 20.88799261 | |||||||
Residual Dev. | 6.837894614 | |||||||
# of iterations | 9 | |||||||
Observations | 20 | |||||||
Coefficients | Standard Error | P-value | Odd Ratio | Lower 95% | Upper 95% | Lower 95% | Upper 95% | |
Intercept | 9.921966078 | 5.684653887 | 0.08091614743 | 20373.0062 | 0.2953037462 | 1405533750 | 0.2953037462 | 1405533750 |
happiness | -1.816681696 | 1.004640145 | 0.07056122758 | 0.1625642947 | 0.02269205995 | 1.164598982 | 0.02269205995 | 1.164598982 |
จะสังเกตได้ว่า สมการ. Logistic Regression ก็จะมี intercept และ ค่าตัวแปร X เหมือนกันซึ่งก็คือค่า happiness
Coefficients | Standard Error | P-value | Odd Ratio | Lower 95% | Upper 95% | |
---|---|---|---|---|---|---|
Intercept | 9.921966078 | 5.684653887 | 0.0809 | 20373.0062 | 0.2953037462 | 1405533750 |
happiness | -1.816681696 | 1.004640145 | 0.0706 | 0.1625642947 | 0.02269205995 | 1.164598982 |
ให้ลองสังเกตที่ค่า p-value จากที่ผ่านๆมา เราจะทดสอบ p-value ที่ค่า 5% หรือ 0.05 ซึ่งจะเห็นว่าค่าที่ได้เกิน 0.05 แต่จริงๆแล้วเราสามารถที่จะบอกได้ เราทดสอบ ที่ 10% หรือ 0.1 ก็ได้ ซึ่งแปลได้ว่าเรา มีความมั่นใจ ค่า happiness ที่ 90%
ถ้าเห็นแบบนี้อาจจะสรุปได้ว่าค่า happiness มี significance ได้
ซึ่งในการทดสอบ significance มีการทดสอบความมั่นใจ อยู่ 3 ระดับ คือ.
10%, 5% และ 1%
ซึ่งจริงๆแล้วมันขึ้นอยู่กับนักวิจัยว่า จะตั้งค่าความมั่นใจไว้ที่เท่าไร จะน่าเชื่อมั่นมากน้อยแค่ไหน เพราะไม่มีใครรู้ว่าจะทำนายออกมาได้ถูกต้องแค่ไหน มันอาจจะตั้งค่าไว้ที่ 2% หรือ 6% ก็ได้
กลับมาที่ตารางทำนาย
happiness | divorce | linear regression | logistic regression |
---|---|---|---|
10 | 0 | -0.170144 | |
8 | 0 | 0.106204 | |
9 | 0 | -0.031970 | |
7 | 0 | 0.244378 | |
8 | 0 | 0.106204 | |
5 | 0 | 0.520726 | |
9 | 0 | -0.031970 | |
6 | 0 | 0.382552 | |
8 | 0 | 0.106204 | |
7 | 0 | 0.244378 | |
1 | 1 | 1.073422 | |
1 | 1 | 1.073422 | |
3 | 1 | 0.797074 | |
1 | 1 | 1.073422 | |
4 | 1 | 0.658900 | |
5 | 1 | 0.520726 | |
6 | 1 | 0.382552 | |
3 | 1 | 0.797074 | |
2 | 1 | 0.935248 | |
0 | 1 | 1.211596 |
เราจะทำนาย ซึ่ง ก็ใช้สมการเส้นตรงเหมือนเดิมเลย โดยที่ใช้ค่าสัมประสิทธิ์ที่ได้จาก toolspak Model Logistic Regression
happiness | divorce | linear regression | logistic regression |
---|---|---|---|
10 | 0 | -0.170144 | -8.244850879 |
8 | 0 | 0.106204 | -4.611487487 |
9 | 0 | -0.031970 | -6.428169183 |
7 | 0 | 0.244378 | -2.794805792 |
8 | 0 | 0.106204 | -4.611487487 |
5 | 0 | 0.520726 | 0.8385575997 |
9 | 0 | -0.031970 | -6.428169183 |
6 | 0 | 0.382552 | -0.978124096 |
8 | 0 | 0.106204 | -4.611487487 |
7 | 0 | 0.244378 | -2.794805792 |
1 | 1 | 1.073422 | 8.105284383 |
1 | 1 | 1.073422 | 8.105284383 |
3 | 1 | 0.797074 | 4.471920991 |
1 | 1 | 1.073422 | 8.105284383 |
4 | 1 | 0.658900 | 2.655239295 |
5 | 1 | 0.520726 | 0.8385575997 |
6 | 1 | 0.382552 | -0.978124096 |
3 | 1 | 0.797074 | 4.471920991 |
2 | 1 | 0.935248 | 6.288602687 |
0 | 1 | 1.211596 | 9.921966078 |
สังเกตว่า ค่าที่ได้ ยังมีค่าติดลบ และ มีค่ามากกว่า 0 กับ 1 อยู่ ซึ่ง หลายคนอาจจะสับสนที่บอกว่า ต้องได้ค่า 0 ถึง 1
ค่าเมื่อสักครู่ยังจำได้มั้ยว่า เราใช้สูตรของสมการเส้นตรงคำนวนอยู่ และยังไม่ได้. apply สมการ sigmoid function เพื่อบีบค่าให้อยู่ระหว่าง 0 ถึง 1
ให้ตารางนี้ค้างไว้เท่านี้ก่อน เดี๋ยวเราจะมาพิจสูจน์ สมการ sigmoid function เพื่อดูว่าการทำงานของสมการนี้เป็นอย่างไร
Sigmoid function
จากตารางเราจะเห็นว่ามีค่า -10 ถึง 10 อยู่โดยเราจะใช้ สมการ sigmoid ในการบีบค่า -10 ถึง 10 ให้อยู่ระหว่าง 0 ถึง 1

หรือจะใช้อีกสมการหนึ่งก็ได้
Y = EXP(X) / (1+EXP(X))

คำนวนแล้วได้ค่าออกมาเท่ากัน
ข้อควรระวัง ตัวแปร X ที่เห็นอยู่ในสมการ จริงๆแล้วเมื่อเราเอาค่า สัมประสิทธิ์ที่ได้จากสมการเส้นตรงแล้ว นำมาใช้เป็นตัวคำนวน sigmoid เราจะเปลี่ยนตัวแปรนี้เป็น ตัวแปร Z แทนเพื่อป้องกันการสับสน จะได้เห็นในตารางทำนาย divorce หลังจากพิสูจน์ คำนวน sigmoid แล้ว
X | Y |
---|---|
-10 | |
-9 | |
-8 | |
-7 | |
-6 | |
-5 | |
-4 | |
-3 | |
-2 | |
-1 | |
0 | |
1 | |
2 | |
3 | |
4 | |
5 | |
6 | |
7 | |
8 | |
9 | |
10 |
นี่คือสูตรที่เขียนใน google sheet
=ArrayFormula(1/(1+exp(-A2:A22)))
หรือใช้อีกสูตรหนึ่งก็ได้
=ArrayFormula(EXP(A2:A22)/(1+EXP(A2:A22)))
เราก็จะได้ค่าออกมาประมาณนี้
X | Y |
---|---|
-10 | 0.000045 |
-9 | 0.000123 |
-8 | 0.000335 |
-7 | 0.000911 |
-6 | 0.002473 |
-5 | 0.006693 |
-4 | 0.017986 |
-3 | 0.047426 |
-2 | 0.119203 |
-1 | 0.268941 |
0 | 0.500000 |
1 | 0.731059 |
2 | 0.880797 |
3 | 0.952574 |
4 | 0.982014 |
5 | 0.993307 |
6 | 0.997527 |
7 | 0.999089 |
8 | 0.999665 |
9 | 0.999877 |
10 | 0.999955 |
ให้ลองเราค่าที่ได้มาลอง plot graph ดู

เราก็จะได้ sigmoid function ออกมา
กลับมาที่ตารางทำนายค่า divorce โดยที่เพิ่ม column มาอีก 1 column โดยตั้งชื่อว่าเป็น Prob (divorce) โดยใช้ sigmoid function ในการคำนวน มันจะเป็นค่าความน่าจะเป็นและวิ่งอยู่ที่ 0 ถึง 1
sigmoid function (0-1) | ||||
---|---|---|---|---|
happiness (x) | divorce (y) | linear regression | logistic regression (z) | probability (divorce) |
10 | 0 | -0.170144 | -8.244850879 | |
8 | 0 | 0.106204 | -4.611487487 | |
9 | 0 | -0.031970 | -6.428169183 | |
7 | 0 | 0.244378 | -2.794805792 | |
8 | 0 | 0.106204 | -4.611487487 | |
5 | 0 | 0.520726 | 0.8385575997 | |
9 | 0 | -0.031970 | -6.428169183 | |
6 | 0 | 0.382552 | -0.978124096 | |
8 | 0 | 0.106204 | -4.611487487 | |
7 | 0 | 0.244378 | -2.794805792 | |
1 | 1 | 1.073422 | 8.105284383 | |
1 | 1 | 1.073422 | 8.105284383 | |
3 | 1 | 0.797074 | 4.471920991 | |
1 | 1 | 1.073422 | 8.105284383 | |
4 | 1 | 0.658900 | 2.655239295 | |
5 | 1 | 0.520726 | 0.8385575997 | |
6 | 1 | 0.382552 | -0.978124096 | |
3 | 1 | 0.797074 | 4.471920991 | |
2 | 1 | 0.935248 | 6.288602687 | |
0 | 1 | 1.211596 | 9.921966078 |
เมื่อลองคำนวนออกมาด้วย sigmoid function แล้ว จะได้ค่าตามในตารางด้านล่าง โดยเราจะใช้ สมการ sigmoid กับ column logistic regression (z) ไม่ใช่ค่า happiness (x) ตรงนี้ต้องระวัง
sigmoid function (0-1) | ||||
---|---|---|---|---|
happiness (x) | divorce (y) | linear regression | logistic regression (z) | probability (divorce) |
10 | 0 | -0.170144 | -8.244850879 | 0.0002625383342 |
8 | 0 | 0.106204 | -4.611487487 | 0.009839253192 |
9 | 0 | -0.031970 | -6.428169183 | 0.001612800314 |
7 | 0 | 0.244378 | -2.794805792 | 0.05760550737 |
8 | 0 | 0.106204 | -4.611487487 | 0.009839253192 |
5 | 0 | 0.520726 | 0.8385575997 | 0.6981613429 |
9 | 0 | -0.031970 | -6.428169183 | 0.001612800314 |
6 | 0 | 0.382552 | -0.978124096 | 0.2732641626 |
8 | 0 | 0.106204 | -4.611487487 | 0.009839253192 |
7 | 0 | 0.244378 | -2.794805792 | 0.05760550737 |
1 | 1 | 1.073422 | 8.105284383 | 0.9996981518 |
1 | 1 | 1.073422 | 8.105284383 | 0.9996981518 |
3 | 1 | 0.797074 | 4.471920991 | 0.9887037172 |
1 | 1 | 1.073422 | 8.105284383 | 0.9996981518 |
4 | 1 | 0.658900 | 2.655239295 | 0.9343331783 |
5 | 1 | 0.520726 | 0.8385575997 | 0.6981613429 |
6 | 1 | 0.382552 | -0.978124096 | 0.2732641626 |
3 | 1 | 0.797074 | 4.471920991 | 0.9887037172 |
2 | 1 | 0.935248 | 6.288602687 | 0.9981460899 |
0 | 1 | 1.211596 | 9.921966078 | 0.9999509179 |
จะขอปรับตารางเพื่อเปรียบเทียบให้ดูง่ายขึ้น โดยการเปลี่ยนเป็นเปอร์เซ็น
happiness (x) | divorce (y) | probability (divorce) |
10 | 0 | 0.03% |
8 | 0 | 0.98% |
9 | 0 | 0.16% |
7 | 0 | 5.76% |
8 | 0 | 0.98% |
5 | 0 | 69.82% |
9 | 0 | 0.16% |
6 | 0 | 27.33% |
8 | 0 | 0.98% |
7 | 0 | 5.76% |
1 | 1 | 99.97% |
1 | 1 | 99.97% |
3 | 1 | 98.87% |
1 | 1 | 99.97% |
4 | 1 | 93.43% |
5 | 1 | 69.82% |
6 | 1 | 27.33% |
3 | 1 | 98.87% |
2 | 1 | 99.81% |
0 | 1 | 100.00% |
สังเกตได้ว่าค่านี้ คือ ค่าความน่าจะเป็น โดยเทียบกับค่า happiness ว่าจะได้ค่า divorce ออกมา เช่น ถ้า happiness เท่ากับ 7 ค่าความน่าจะเป็นอยู่ 5.76% จึงถูกทำนายว่า ไม่เลิก หรือเลข 0
สิ่งที่เราจะต้องทำถัดไป คือ กำหนดค่า threshold ขึ้นมา ซึ่งเป็นค่าที่เป็นการบอกว่า เลิกหรือไม่เลิก ก็ Column ในการทำนายค่า predicted divorce (y') , (y-prod) ผ่านค่าความน่าจะเป็น โดยเพิ่มขึ้นมาอีก 1 column จากตารางก่อนหน้านี้
=if(E4>0.5,"TRUE","FALSE")
sigmoid function (0-1) | Threshold >= 50% | ||
---|---|---|---|
happiness (x) | divorce (y) | probability (divorce) | predicted divorce (y') , (y-prod) |
10 | 0 | 0.03% | ไม่เลิก 0 |
8 | 0 | 0.98% | ไม่เลิก 0 |
9 | 0 | 0.16% | ไม่เลิก 0 |
7 | 0 | 5.76% | ไม่เลิก 0 |
8 | 0 | 0.98% | ไม่เลิก 0 |
5 | 0 | 69.82% | เลิก 1 |
9 | 0 | 0.16% | ไม่เลิก 0 |
6 | 0 | 27.33% | ไม่เลิก 0 |
8 | 0 | 0.98% | ไม่เลิก 0 |
7 | 0 | 5.76% | ไม่เลิก 0 |
1 | 1 | 99.97% | เลิก 1 |
1 | 1 | 99.97% | เลิก 1 |
3 | 1 | 98.87% | เลิก 1 |
1 | 1 | 99.97% | เลิก 1 |
4 | 1 | 93.43% | เลิก 1 |
5 | 1 | 69.82% | เลิก 1 |
6 | 1 | 27.33% | ไม่เลิก 0 |
3 | 1 | 98.87% | เลิก 1 |
2 | 1 | 99.81% | เลิก 1 |
0 | 1 | 100.00% | เลิก 1 |
สังเกตว่า column ที่ทำนายว่าเลิก แต่ก็มีบางแถวที่ทำนายผิดไปบ้าง
คราวนี้เราก็จะสร้างอีก 1 column เพื่อดูว่า ทำนายถูกหรือไม่ถูก เพื่อที่จะนำไปหาค่าความแม่นยำ
sigmoid function (0-1) | Threshold >= 50% | |||
---|---|---|---|---|
happiness (x) | divorce (y) | probability (divorce) | predicted divorce (y') , (y-prod) | ท้ายถูกหรือไม่ |
10 | 0 | 0.03% | ไม่เลิก 0 | TRUE |
8 | 0 | 0.98% | ไม่เลิก 0 | TRUE |
9 | 0 | 0.16% | ไม่เลิก 0 | TRUE |
7 | 0 | 5.76% | ไม่เลิก 0 | TRUE |
8 | 0 | 0.98% | ไม่เลิก 0 | TRUE |
5 | 0 | 69.82% | เลิก 1 | FALSE |
9 | 0 | 0.16% | ไม่เลิก 0 | TRUE |
6 | 0 | 27.33% | ไม่เลิก 0 | TRUE |
8 | 0 | 0.98% | ไม่เลิก 0 | TRUE |
7 | 0 | 5.76% | ไม่เลิก 0 | TRUE |
1 | 1 | 99.97% | เลิก 1 | TRUE |
1 | 1 | 99.97% | เลิก 1 | TRUE |
3 | 1 | 98.87% | เลิก 1 | TRUE |
1 | 1 | 99.97% | เลิก 1 | TRUE |
4 | 1 | 93.43% | เลิก 1 | TRUE |
5 | 1 | 69.82% | เลิก 1 | TRUE |
6 | 1 | 27.33% | ไม่เลิก 0 | FALSE |
3 | 1 | 98.87% | เลิก 1 | TRUE |
2 | 1 | 99.81% | เลิก 1 | TRUE |
0 | 1 | 100.00% | เลิก 1 | TRUE |
Accuracy | 0.9 |
คราวนี้เราก็นำค่าที่ทำนายถูกหรือไม่ มาหาค่าความแม่นยำ Accuracy โดยการใช้สูตรนี้
=ArrayFormula(AVERAGE(G4:G23*1))
เพื่อหาค่าเฉลี่ย เราจะได้ค่าเท่า 0.9 หรือ ความแม่นยำนี้อยู่ 90%
สังเกตว่า ทำนายผิดไป 2 คน เฉลี่ยแล้วตกคนละ 5%
มาดูที่ค่า Threshold สักนิดก่อนจะจบ ซึ่งค่านี้ก็เป็นส่วนสำคัญที่จำทำให้ Accuracy ของเราดีขึ้นหรือแย่ลงได้ด้วย ซึ่ง มันสามารถปรับจูนได้ ถ้าสมมติว่าเราปรับค่า threshold จากเดิม 0.5 เป็น 0.05 หรือ 5% ค่าความแม่นยำจะอยู่ที่ 80% ก็จะเห็นว่ามีค่าลดลง ค่า threshold นี้จะเรียกว่า hyper parameter จะต้องเลือกดีๆเพราะมีผลต่อค่าการทำนาย
หลังจากที่ได้ทำการ Train Model เสร็จเรียบร้อยแล้ว เราก็จะนำ Model ที่ได้ทำการทดสอบนั้นมาตรวจดูว่า Model มีประสิทธิภาพแค่ไหน โดยเข้าสู่ Model Evaluation

มาลองทำ Data Split กันก่อน ในการแบ่ง Data ใน Googl sheet มีเทคนิดอยู่ ซึ่ง มีขั้นตอนดังนี้
- กำหนดการแบ่ง data เป็น 2 ชุด โดยแบ่ง 15 และ 5 จากทั้งหมด 20
- เพิ่ม column ขึ้นมา 2 column โดยเป็น Column ชื่อ Id, และ Random
- ทำฟังก์ชัน Rand() การทำ Random ค่าขึ้นมา การ Random จะให้ค่าที่ไม่ซ้ำ
- ทำการ filter ค่าที่ Random โดยการ Hilight ทุก Column
- Hilight สี โดยแบ่งตามการ split ที่ตั้งเอาไว้ในตอนแรก
Model Evaluation
โมเดลของเราดีขนาดไหน
โมเดลของเรา ทำนาย ได้ดีแค่ไหน
หลังจากที่เราได้ทำการ split data เพื่อทำการ train และ เอาไว้ test ซึ่ง เทียบได้กับ การสอนหนังสือนักเรียน เราก็จะใช้ข้อมูลที่เป็น ชุด train โดยไม่ให้เห็น ข้อมูลที่เป็นชุด Test ซึ่งถ้าหากว่านักเรียน หรือ Model ของเราเห็นข้อมูลทดสอบก่อน เทียบกับข้อมูลข้อสอบหลุด ทำให้นักเรียน ได้คะแนนดีกว่าปกติ

เราจะ Evaluete Model ด้วย Unseen Dataset หรือ Test Dataset เท่านั้น ซึ่ง ข้อมูล Unseen กับ Test จะเป็นข้อมูลคนละชุดหรือชุดเดียวกันก็ได้ กรณีแบ่งเป็น คนละชุดก็หมายความว่า จะต้องแบ่งจาก Full Dataset เป็น Train , Test, Unseen Dataset
Confusion Metrix

จากตารางที่เห็นในรูปภาพเราจะเรียกอีกอย่างหนึ่งว่า Crosstab ซึ่งเป็นการนำ Predicted crosstabulation กับ ค่า Actual
ถ้าตามความหมายของตาราง confustion metrix มันหมายถึงว่า Model ของเรามันกำลัง งง อยู่ คำว่า งง ในที่นี้ก็หมายถึงว่า มันสับสน ทายผิดเป็นถูก ทายถูกเป็นผิด
ไม่มี Model ที่ไหนที่มัน perfect 100% มันจะมีการทายผิด แต่หน้าที่ของเราคือ จะต้องนำ Model ที่ได้มาใช้กับ Dataset ที่เหมาะสมกับมัน ให้ทายถูกมากที่สุดปรับแต่งให้ accuracy แม่นยำมากขึ้น

Accuracy คือ ความแม่นยำ หรือ ผลรวมของจำนวนที่ทายถูก ทั้ง Yes และ No มารวมกันหารด้วย จำนวนขัอมูลทั้งหมด

precision คือ ทุกครั้งที่ Model ทำนายว่า Yes เราทายถูกกี่ครั้ง ซึ่ง จำนวนทั้งหมดที่ Model ทายออกมาว่า Yes ในค่า Actual อาจจะมีทั้ง Yes และ No จากตัวอย่าง ทายออกมาว่า Yes ทั้งหมด 66 ครั้ง โดยทายถูก 50 ครั้ง และ ผิด 16 ครั้ง นำมาทำอัตราส่วน ได้ 75.7%

Recall คือ ถ้าเรามองค่า Actual จริงของ Dataset มีอยู่ 59 ที่เป็น Yes แล้ว Model ของเราทายถูกเป็น Yes จำนวน 50 ซึ่งเป็นการตรวจสอบว่า Model มันจำได้ ลักษาณะที่เป็น Yes ว่าทั้ง 59 นี้เป็นค่า Yes ในอัตราส่วนเท่าไร

การหาค่าเฉลี่ยของค่าที่ Evaluate ออกมา
คราวนี้เราจะไปลองทำ Model Evaluation ที่ google sheet กันดู
Actual Y | Predicted Y | ||||
---|---|---|---|---|---|
0 | 0 | Predicted | |||
0 | 0 | Actual | No | Yes | |
1 | 1 | No | |||
0 | 1 | Yes | |||
0 | 0 | ||||
1 | 1 | ||||
0 | 0 | Accuracy | |||
1 | 0 | Precision | |||
1 | 0 | Recall | |||
1 | 1 | F1-Score | |||
0 | 0 | ||||
0 | 0 | ||||
0 | 0 | ||||
1 | 1 | ||||
1 | 0 | ||||
1 | 1 | ||||
0 | 0 | ||||
1 | 1 | ||||
0 | 1 | ||||
1 | 1 |
จากตารางที่จะนำมาลองฝึกทำการ ประเมิน โดยที่เราจะนำค่าที่ column และ predicted มาหาผลรวมก่อนโดยใช้สูตร
=countifs(ACTUAL,0,PREDICTED,0) // ค่าที่หา คือ no หรือ 0
=countifs(ACTUAL,0,PREDICTED,1)
=countifs(ACTUAL,1,PREDICTED,0)
=countifs(ACTUAL,1,PREDICTED,1) // ค่าที่หา คือ yes หรือ 1
นำไปใส่ในตาราง confusion metrix ทางด้านขวา
predicted | predicted | |
---|---|---|
Actual | No | Yes |
No | 8 | 2 |
Yes | 3 | 7 |
จากนั้นก็นำค่าไปคำนวน metrics ต่างๆ ด้านล่างตามสมการในรูปภาพด้านบน
Accuracy | 75.00% |
---|---|
Precision | 77.78% |
Recall | 70.00% |
F1-Score | 73.68% |
ลองมาทำบน R กันดูบ้าง
# Logistic Regression Example
happiness <- c(10,8,9,7,8,5,9,6,8,7,1,1,3,1,4,5,6,3,2,0)
divorce <- c(0,0,0,0,0,0,0,0,0,0,1,1,1,1,1,1,1,1,1,1)
df <- data.frame(happiness, divorce)
View(df)
##
> data.frame(happiness, divorce)
happiness divorce
1 10 0
2 8 0
3 9 0
4 7 0
5 8 0
...
ให้ลองสร้าง data frame ตาราง divorce ขึ้นมาด้วย R
ลอง Fit Logistic Regression กับทั้ง full data
## Fit Logistic Regression Full Dataset
model <- glm(divorce ~ happiness, data = df, family="binomial")
##
> glm(divorce ~ happiness, data = df, family="binomial")
Call: glm(formula = divorce ~ happiness, family = "binomial", data = df)
Coefficients:
(Intercept) happiness
9.922 -1.817
Degrees of Freedom: 19 Total (i.e. Null); 18 Residual
Null Deviance: 27.73
Residual Deviance: 6.838 AIC: 10.84
เมื่อรันค่าออกมาแล้วนำไปเปรียบเทียบกับค่าสัมประสิทธิ์กับใน google ก็มีค่าเท่ากัน
มาลองดูว่าค่า happiness มีค่า significance หรือไม่
> summary(model)
Call:
glm(formula = divorce ~ happiness, family = "binomial", data = df)
Deviance Residuals:
Min 1Q Median
-1.54781 -0.14063 -0.00650
3Q Max
0.08337 1.61079
Coefficients:
Estimate Std. Error
(Intercept) 9.922 5.684
happiness -1.817 1.005
z value Pr(>|z|)
(Intercept) 1.746 0.0809 .
happiness -1.809 0.0705 .
---
Signif. codes:
0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05
‘.’ 0.1 ‘ ’ 1
(Dispersion parameter for binomial family taken to be 1)
Null deviance: 27.7259 on 19 degrees of freedom
Residual deviance: 6.8379 on 18 degrees of freedom
AIC: 10.838
Number of Fisher Scoring iterations: 7
code ด้านล่างนี้จะเป็นการหาค่าความน่าจะเป็นของ divorce โดยจะต้องกำหนดค่า type เท่ากับ response
## Predict and Evaluation Model
df$prob_divorce <- predict(model, type="response")
##
> df$prob_divorce
[1] 0.0002625384 0.0098392536 0.0016128004
[4] 0.0576055088 0.0098392536 0.6981613409
[7] 0.0016128004 0.2732641643 0.0098392536
[10] 0.0576055088 0.9996981518 0.9996981518
[13] 0.9887037167 0.9996981518 0.9343331766
[16] 0.6981613409 0.2732641643 0.9887037167
[19] 0.9981460898 0.9999509178
ถ้าลองเอาไปเทียบกับใน google sheet จะมีค่าเท่ากัน
คราวนี้เราก็เอาค่าความน่าจะเป็นมา ทำนายโดยกำหนด threshold ในเงื่อนไข ifelse
df$pred_divorce <- ifelse(df$prob_divorce >= 0.5, 1, 0)
##
> df$pred_divorce
[1] 0 0 0 0 0 1 0 0 0 0 1 1 1 1 1 1 0 1 1 1
แล้วนำมา Evaluation Confusion metrix โดยการใช้ฟังก์ชัน table มันจะเป็นฟังก์ชันที่เอาตัวแปรมา cross กันได้
dnn เป็น argument ที่เอาไว้ใช้ตั้งชื่อ สังเกตค่าที่ได้ออกมา
## confusion matrix
confusion_matrix <- table(df$pred_divorce,
df$divorce, dnn= c("Predicted", "Actual"))
##
Actual
Predicted 0 1
0 9 1
1 1 9
เราได้ค่าตาราง confusion matrix แล้วนำค่าที่ได้มาหาตำแหน่ง แล้ว หาค่า matric ต่างๆ
cat("Accuracy : ", (confusion_matrix[1,1] + confusion_matrix[2,2])/ sum(confusion_matrix))
cat("Precision : ", confusion_matrix[2,2]/(confusion_matrix[2,1] + confusion_matrix[2,2]))
cat("Recall : ", confusion_matrix[2,2]/(confusion_matrix[1,2] + confusion_matrix[2,2]))
cat("F1 Score : ", 2 * (0.9 * 0.9) / (0.9 + 0.9))
###
Accuracy : 0.9
Precision : 0.9
Recall : 0.9
F1 Score : 0.9
คอร์สนี้ดีมากกกก (ไก่ ล้านตัว) ใครอ่านจบ แนะนำว่าให้ไปสมัครเรียน ติดตามได้ที่ link ด้านล่างนี้เลย จริงๆ
Course Online DATA ROCKIE Bootcamp
