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

Image placeholder
แวะมาทักทายกันได้


คำแนะนำจากผู้เขียน - ใครที่สนใจในเรื่องข้อมูล วิชาสถิติถือว่าเป็น foundation ของเรื่องนี้ สำหรับบทความนี้ เป็นสรุปบันทึกการเรียนวิชา statistic 104 สำหรับนักวิทยาศาสตร์ข้อมูล - sprint 05 ขอให้เครดิตแก่ Data Rockie ผู้เปิดโลกทัศน์วิชาด้านข้อมูล โดยที่ผู้เขียนเคยเรียนแล้วไม่เข้าใจแต่ เรียนกับคอร์สนี้แล้วเข้าใจ


content ในบทความนี้ประกอบไปด้วย

  1. When to use Logistic Regression
  2. A little math behind - sigmoid function
  3. Model training
    1. train-test-split
  4. Model Evaluation
    1. confusion matrix
    2. accuracy
    3. precision
    4. recall
    5. 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
happinessdivorce
100
80
90
70
80
50
90
60
80
70
11
11
31
11
41
51
61
31
21
01

ตัวแปรต้น คือ. happiness และ ตัวแปรตาม คือ divorce

ลำดับแรกลองเอาข้อมูลในตารางมา plot ด้วย scatter plot อย่างง่ายๆดูก่อน

จะเห็นว่าการ plot ที่เลข 1 และ 0

เดี๋ยวลองมาทบทวน Linear Regression กันก่อนโดย ฟังก์ชันของ regression จะเขียนแบบนี้

divorce = f(happiness)

โดยจะเป็นสมการเส้นตรง คือ

divorce = b0 + b1*happiness

b0 : intercept

b1 : slope

intercept1.211595774
slope-0.1381739366

คราวนี้เอาค่าสัมประสิทธิ์ที่ได้มาคำนวนค่าระหว่าง happiness. และ divorce ด้วยสมการเส้นตรง

happinessdivorcelinear regression
100-0.170144
800.106204
90-0.031970
700.244378
800.106204
500.520726
90-0.031970
600.382552
800.106204
700.244378
111.073422
111.073422
310.797074
111.073422
410.658900
510.520726
610.382552
310.797074
210.935248
011.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 Square20.88799261
Residual Dev.6.837894614
# of iterations9
Observations20
CoefficientsStandard ErrorP-valueOdd RatioLower 95%Upper 95%Lower 95%Upper 95%
Intercept9.9219660785.6846538870.0809161474320373.00620.295303746214055337500.29530374621405533750
happiness-1.8166816961.0046401450.070561227580.16256429470.022692059951.1645989820.022692059951.164598982

จะสังเกตได้ว่า สมการ. Logistic Regression ก็จะมี intercept และ ค่าตัวแปร X เหมือนกันซึ่งก็คือค่า happiness

CoefficientsStandard ErrorP-valueOdd RatioLower 95%Upper 95%
Intercept9.9219660785.6846538870.080920373.00620.29530374621405533750
happiness-1.8166816961.0046401450.07060.16256429470.022692059951.164598982

ให้ลองสังเกตที่ค่า p-value จากที่ผ่านๆมา เราจะทดสอบ p-value ที่ค่า 5% หรือ 0.05 ซึ่งจะเห็นว่าค่าที่ได้เกิน 0.05 แต่จริงๆแล้วเราสามารถที่จะบอกได้ เราทดสอบ ที่ 10% หรือ 0.1 ก็ได้ ซึ่งแปลได้ว่าเรา มีความมั่นใจ ค่า happiness ที่ 90%

ถ้าเห็นแบบนี้อาจจะสรุปได้ว่าค่า happiness มี significance ได้

ซึ่งในการทดสอบ significance มีการทดสอบความมั่นใจ อยู่ 3 ระดับ คือ.

10%, 5% และ 1%

ซึ่งจริงๆแล้วมันขึ้นอยู่กับนักวิจัยว่า จะตั้งค่าความมั่นใจไว้ที่เท่าไร จะน่าเชื่อมั่นมากน้อยแค่ไหน เพราะไม่มีใครรู้ว่าจะทำนายออกมาได้ถูกต้องแค่ไหน มันอาจจะตั้งค่าไว้ที่ 2% หรือ 6% ก็ได้

กลับมาที่ตารางทำนาย

happinessdivorcelinear regressionlogistic regression
100-0.170144
800.106204
90-0.031970
700.244378
800.106204
500.520726
90-0.031970
600.382552
800.106204
700.244378
111.073422
111.073422
310.797074
111.073422
410.658900
510.520726
610.382552
310.797074
210.935248
011.211596

เราจะทำนาย ซึ่ง ก็ใช้สมการเส้นตรงเหมือนเดิมเลย โดยที่ใช้ค่าสัมประสิทธิ์ที่ได้จาก toolspak Model Logistic Regression

happinessdivorcelinear regressionlogistic regression
100-0.170144-8.244850879
800.106204-4.611487487
90-0.031970-6.428169183
700.244378-2.794805792
800.106204-4.611487487
500.5207260.8385575997
90-0.031970-6.428169183
600.382552-0.978124096
800.106204-4.611487487
700.244378-2.794805792
111.0734228.105284383
111.0734228.105284383
310.7970744.471920991
111.0734228.105284383
410.6589002.655239295
510.5207260.8385575997
610.382552-0.978124096
310.7970744.471920991
210.9352486.288602687
011.2115969.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 แล้ว

XY
-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)))

เราก็จะได้ค่าออกมาประมาณนี้

XY
-100.000045
-90.000123
-80.000335
-70.000911
-60.002473
-50.006693
-40.017986
-30.047426
-20.119203
-10.268941
00.500000
10.731059
20.880797
30.952574
40.982014
50.993307
60.997527
70.999089
80.999665
90.999877
100.999955

ให้ลองเราค่าที่ได้มาลอง plot graph ดู

เราก็จะได้ sigmoid function ออกมา

กลับมาที่ตารางทำนายค่า divorce โดยที่เพิ่ม column มาอีก 1 column โดยตั้งชื่อว่าเป็น Prob (divorce) โดยใช้ sigmoid function ในการคำนวน มันจะเป็นค่าความน่าจะเป็นและวิ่งอยู่ที่ 0 ถึง 1

sigmoid function (0-1)
happiness (x)divorce (y)linear regressionlogistic regression (z)probability (divorce)
100-0.170144-8.244850879
800.106204-4.611487487
90-0.031970-6.428169183
700.244378-2.794805792
800.106204-4.611487487
500.5207260.8385575997
90-0.031970-6.428169183
600.382552-0.978124096
800.106204-4.611487487
700.244378-2.794805792
111.0734228.105284383
111.0734228.105284383
310.7970744.471920991
111.0734228.105284383
410.6589002.655239295
510.5207260.8385575997
610.382552-0.978124096
310.7970744.471920991
210.9352486.288602687
011.2115969.921966078

เมื่อลองคำนวนออกมาด้วย sigmoid function แล้ว จะได้ค่าตามในตารางด้านล่าง โดยเราจะใช้ สมการ sigmoid กับ column logistic regression (z) ไม่ใช่ค่า happiness (x) ตรงนี้ต้องระวัง

sigmoid function (0-1)
happiness (x)divorce (y)linear regressionlogistic regression (z)probability (divorce)
100-0.170144-8.2448508790.0002625383342
800.106204-4.6114874870.009839253192
90-0.031970-6.4281691830.001612800314
700.244378-2.7948057920.05760550737
800.106204-4.6114874870.009839253192
500.5207260.83855759970.6981613429
90-0.031970-6.4281691830.001612800314
600.382552-0.9781240960.2732641626
800.106204-4.6114874870.009839253192
700.244378-2.7948057920.05760550737
111.0734228.1052843830.9996981518
111.0734228.1052843830.9996981518
310.7970744.4719209910.9887037172
111.0734228.1052843830.9996981518
410.6589002.6552392950.9343331783
510.5207260.83855759970.6981613429
610.382552-0.9781240960.2732641626
310.7970744.4719209910.9887037172
210.9352486.2886026870.9981460899
011.2115969.9219660780.9999509179

จะขอปรับตารางเพื่อเปรียบเทียบให้ดูง่ายขึ้น โดยการเปลี่ยนเป็นเปอร์เซ็น

happiness (x)divorce (y)probability (divorce)
1000.03%
800.98%
900.16%
705.76%
800.98%
5069.82%
900.16%
6027.33%
800.98%
705.76%
1199.97%
1199.97%
3198.87%
1199.97%
4193.43%
5169.82%
6127.33%
3198.87%
2199.81%
01100.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)
1000.03%ไม่เลิก 0
800.98%ไม่เลิก 0
900.16%ไม่เลิก 0
705.76%ไม่เลิก 0
800.98%ไม่เลิก 0
5069.82%เลิก 1
900.16%ไม่เลิก 0
6027.33%ไม่เลิก 0
800.98%ไม่เลิก 0
705.76%ไม่เลิก 0
1199.97%เลิก 1
1199.97%เลิก 1
3198.87%เลิก 1
1199.97%เลิก 1
4193.43%เลิก 1
5169.82%เลิก 1
6127.33%ไม่เลิก 0
3198.87%เลิก 1
2199.81%เลิก 1
01100.00%เลิก 1

สังเกตว่า column ที่ทำนายว่าเลิก แต่ก็มีบางแถวที่ทำนายผิดไปบ้าง

คราวนี้เราก็จะสร้างอีก 1 column เพื่อดูว่า ทำนายถูกหรือไม่ถูก เพื่อที่จะนำไปหาค่าความแม่นยำ

sigmoid function (0-1)Threshold >= 50%
happiness (x)divorce (y)probability (divorce)predicted divorce (y') , (y-prod)ท้ายถูกหรือไม่
1000.03%ไม่เลิก 0TRUE
800.98%ไม่เลิก 0TRUE
900.16%ไม่เลิก 0TRUE
705.76%ไม่เลิก 0TRUE
800.98%ไม่เลิก 0TRUE
5069.82%เลิก 1FALSE
900.16%ไม่เลิก 0TRUE
6027.33%ไม่เลิก 0TRUE
800.98%ไม่เลิก 0TRUE
705.76%ไม่เลิก 0TRUE
1199.97%เลิก 1TRUE
1199.97%เลิก 1TRUE
3198.87%เลิก 1TRUE
1199.97%เลิก 1TRUE
4193.43%เลิก 1TRUE
5169.82%เลิก 1TRUE
6127.33%ไม่เลิก 0FALSE
3198.87%เลิก 1TRUE
2199.81%เลิก 1TRUE
01100.00%เลิก 1TRUE
Accuracy0.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 มีเทคนิดอยู่ ซึ่ง มีขั้นตอนดังนี้

  1. กำหนดการแบ่ง data เป็น 2 ชุด โดยแบ่ง 15 และ 5 จากทั้งหมด 20
  2. เพิ่ม column ขึ้นมา 2 column โดยเป็น Column ชื่อ Id, และ Random
  3. ทำฟังก์ชัน Rand() การทำ Random ค่าขึ้นมา การ Random จะให้ค่าที่ไม่ซ้ำ
  4. ทำการ filter ค่าที่ Random โดยการ Hilight ทุก Column
  5. 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 YPredicted Y
00Predicted
00ActualNoYes
11No
01Yes
00
11
00Accuracy
10Precision
10Recall
11F1-Score
00
00
00
11
10
11
00
11
01
11

จากตารางที่จะนำมาลองฝึกทำการ ประเมิน โดยที่เราจะนำค่าที่ 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 ทางด้านขวา

predictedpredicted
ActualNoYes
No82
Yes37

จากนั้นก็นำค่าไปคำนวน metrics ต่างๆ ด้านล่างตามสมการในรูปภาพด้านบน

Accuracy75.00%
Precision77.78%
Recall70.00%
F1-Score73.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


แวะมาทักทายกันได้
donate

Categories: Tutorial Tags: #Data Science , 879