# การถดถอยโลจิสติกเพื่อทำนายหมวดหมู่ ![ภาพเปรียบเทียบการถดถอยเชิงเส้นและโลจิสติก](../../../../2-Regression/4-Logistic/images/linear-vs-logistic.png) ## [แบบทดสอบก่อนเรียน](https://ff-quizzes.netlify.app/en/ml/) > ### [บทเรียนนี้มีในภาษา R ด้วย!](../../../../2-Regression/4-Logistic/solution/R/lesson_4.html) ## บทนำ ในบทเรียนสุดท้ายเกี่ยวกับการถดถอย ซึ่งเป็นหนึ่งในเทคนิคพื้นฐานของ Machine Learning แบบคลาสสิก เราจะมาดูการถดถอยโลจิสติก คุณสามารถใช้เทคนิคนี้เพื่อค้นหารูปแบบในการทำนายหมวดหมู่แบบทวิภาค เช่น ขนมนี้เป็นช็อกโกแลตหรือไม่? โรคนี้ติดต่อหรือไม่? ลูกค้าคนนี้จะเลือกสินค้านี้หรือไม่? ในบทเรียนนี้ คุณจะได้เรียนรู้: - ไลบรารีใหม่สำหรับการแสดงผลข้อมูล - เทคนิคสำหรับการถดถอยโลจิสติก ✅ เพิ่มความเข้าใจเกี่ยวกับการทำงานกับการถดถอยประเภทนี้ใน [โมดูลการเรียนรู้](https://docs.microsoft.com/learn/modules/train-evaluate-classification-models?WT.mc_id=academic-77952-leestott) ## ความรู้พื้นฐานที่ควรมี หลังจากที่เราได้ทำงานกับข้อมูลฟักทองมาแล้ว เราคุ้นเคยพอที่จะสังเกตเห็นว่ามีหมวดหมู่แบบทวิภาคหนึ่งที่เราสามารถทำงานด้วยได้: `Color` เรามาสร้างโมเดลการถดถอยโลจิสติกเพื่อทำนายว่า _ฟักทองที่กำหนดมีแนวโน้มที่จะมีสีอะไร_ (สีส้ม 🎃 หรือสีขาว 👻) > ทำไมเราถึงพูดถึงการจัดหมวดหมู่แบบทวิภาคในบทเรียนเกี่ยวกับการถดถอย? เพื่อความสะดวกทางภาษา เนื่องจากการถดถอยโลจิสติก [จริง ๆ แล้วเป็นวิธีการจัดหมวดหมู่](https://scikit-learn.org/stable/modules/linear_model.html#logistic-regression) แม้ว่าจะเป็นวิธีที่อิงกับเส้นตรง เรียนรู้วิธีอื่น ๆ ในการจัดหมวดหมู่ข้อมูลในกลุ่มบทเรียนถัดไป ## กำหนดคำถาม สำหรับจุดประสงค์ของเรา เราจะกำหนดคำถามนี้เป็นแบบทวิภาค: 'สีขาว' หรือ 'ไม่ใช่สีขาว' ในชุดข้อมูลของเรายังมีหมวดหมู่ 'ลาย' แต่มีตัวอย่างน้อยมาก ดังนั้นเราจะไม่ใช้มัน และมันจะหายไปเมื่อเราลบค่าที่เป็น null ออกจากชุดข้อมูลอยู่แล้ว > 🎃 ข้อเท็จจริงสนุก ๆ บางครั้งเราเรียกฟักทองสีขาวว่า 'ฟักทองผี' พวกมันแกะสลักได้ยาก ดังนั้นจึงไม่ได้รับความนิยมเท่าฟักทองสีส้ม แต่ก็ดูเท่ดี! ดังนั้นเราสามารถปรับคำถามของเราใหม่ได้ว่า: 'ฟักทองผี' หรือ 'ไม่ใช่ฟักทองผี' 👻 ## เกี่ยวกับการถดถอยโลจิสติก การถดถอยโลจิสติกแตกต่างจากการถดถอยเชิงเส้นที่คุณได้เรียนรู้มาก่อนหน้านี้ในหลาย ๆ ด้านที่สำคัญ [![ML สำหรับผู้เริ่มต้น - ทำความเข้าใจการถดถอยโลจิสติกสำหรับการจัดหมวดหมู่ใน Machine Learning](https://img.youtube.com/vi/KpeCT6nEpBY/0.jpg)](https://youtu.be/KpeCT6nEpBY "ML สำหรับผู้เริ่มต้น - ทำความเข้าใจการถดถอยโลจิสติกสำหรับการจัดหมวดหมู่ใน Machine Learning") > 🎥 คลิกที่ภาพด้านบนเพื่อดูวิดีโอสั้น ๆ เกี่ยวกับการถดถอยโลจิสติก ### การจัดหมวดหมู่แบบทวิภาค การถดถอยโลจิสติกไม่ได้ให้คุณสมบัติเช่นเดียวกับการถดถอยเชิงเส้น อันแรกให้การทำนายเกี่ยวกับหมวดหมู่แบบทวิภาค ("สีขาวหรือไม่ใช่สีขาว") ในขณะที่อันหลังสามารถทำนายค่าต่อเนื่องได้ เช่น จากแหล่งที่มาของฟักทองและเวลาการเก็บเกี่ยว _ราคาจะเพิ่มขึ้นเท่าใด_ ![โมเดลการจัดหมวดหมู่ฟักทอง](../../../../2-Regression/4-Logistic/images/pumpkin-classifier.png) > อินโฟกราฟิกโดย [Dasani Madipalli](https://twitter.com/dasani_decoded) ### การจัดหมวดหมู่อื่น ๆ ยังมีการถดถอยโลจิสติกประเภทอื่น ๆ เช่น มัลติโนเมียลและออร์ดินัล: - **มัลติโนเมียล** ซึ่งเกี่ยวข้องกับการมีมากกว่าหนึ่งหมวดหมู่ - "สีส้ม สีขาว และลาย" - **ออร์ดินัล** ซึ่งเกี่ยวข้องกับหมวดหมู่ที่มีลำดับ เช่น ฟักทองที่เรียงตามขนาดที่มีจำนวนจำกัด (เล็ก, กลาง, ใหญ่, ใหญ่มาก) ![มัลติโนเมียล vs ออร์ดินัล](../../../../2-Regression/4-Logistic/images/multinomial-vs-ordinal.png) ### ตัวแปรไม่จำเป็นต้องมีความสัมพันธ์กัน จำได้ไหมว่าการถดถอยเชิงเส้นทำงานได้ดีกว่ากับตัวแปรที่มีความสัมพันธ์กัน? การถดถอยโลจิสติกตรงกันข้าม - ตัวแปรไม่จำเป็นต้องสอดคล้องกัน ซึ่งเหมาะกับข้อมูลนี้ที่มีความสัมพันธ์ค่อนข้างอ่อน ### คุณต้องการข้อมูลที่สะอาดและมากพอ การถดถอยโลจิสติกจะให้ผลลัพธ์ที่แม่นยำมากขึ้นหากคุณใช้ข้อมูลมากขึ้น ชุดข้อมูลขนาดเล็กของเราไม่เหมาะสมที่สุดสำหรับงานนี้ ดังนั้นโปรดคำนึงถึงข้อนี้ [![ML สำหรับผู้เริ่มต้น - การวิเคราะห์และเตรียมข้อมูลสำหรับการถดถอยโลจิสติก](https://img.youtube.com/vi/B2X4H9vcXTs/0.jpg)](https://youtu.be/B2X4H9vcXTs "ML สำหรับผู้เริ่มต้น - การวิเคราะห์และเตรียมข้อมูลสำหรับการถดถอยโลจิสติก") > 🎥 คลิกที่ภาพด้านบนเพื่อดูวิดีโอสั้น ๆ เกี่ยวกับการเตรียมข้อมูลสำหรับการถดถอยเชิงเส้น ✅ คิดเกี่ยวกับประเภทของข้อมูลที่เหมาะสมกับการถดถอยโลจิสติก ## แบบฝึกหัด - ทำความสะอาดข้อมูล ก่อนอื่น ทำความสะอาดข้อมูลเล็กน้อยโดยลบค่าที่เป็น null และเลือกเฉพาะบางคอลัมน์: 1. เพิ่มโค้ดต่อไปนี้: ```python columns_to_select = ['City Name','Package','Variety', 'Origin','Item Size', 'Color'] pumpkins = full_pumpkins.loc[:, columns_to_select] pumpkins.dropna(inplace=True) ``` คุณสามารถดู dataframe ใหม่ของคุณได้เสมอ: ```python pumpkins.info ``` ### การแสดงผล - แผนภูมิหมวดหมู่ ตอนนี้คุณได้โหลด [สมุดบันทึกเริ่มต้น](../../../../2-Regression/4-Logistic/notebook.ipynb) พร้อมข้อมูลฟักทองอีกครั้งและทำความสะอาดเพื่อรักษาชุดข้อมูลที่มีตัวแปรบางตัว รวมถึง `Color` ลองแสดง dataframe ในสมุดบันทึกโดยใช้ไลบรารีที่แตกต่าง: [Seaborn](https://seaborn.pydata.org/index.html) ซึ่งสร้างขึ้นบน Matplotlib ที่เราใช้ก่อนหน้านี้ Seaborn มีวิธีที่น่าสนใจในการแสดงผลข้อมูลของคุณ ตัวอย่างเช่น คุณสามารถเปรียบเทียบการกระจายของข้อมูลสำหรับแต่ละ `Variety` และ `Color` ในแผนภูมิหมวดหมู่ 1. สร้างแผนภูมิแบบนี้โดยใช้ฟังก์ชัน `catplot` กับข้อมูลฟักทอง `pumpkins` และระบุการจับคู่สีสำหรับแต่ละหมวดหมู่ของฟักทอง (สีส้มหรือสีขาว): ```python import seaborn as sns palette = { 'ORANGE': 'orange', 'WHITE': 'wheat', } sns.catplot( data=pumpkins, y="Variety", hue="Color", kind="count", palette=palette, ) ``` ![กริดของข้อมูลที่แสดงผล](../../../../2-Regression/4-Logistic/images/pumpkins_catplot_1.png) โดยการสังเกตข้อมูล คุณสามารถเห็นได้ว่าข้อมูล `Color` เกี่ยวข้องกับ `Variety` อย่างไร ✅ จากแผนภูมิหมวดหมู่นี้ คุณสามารถจินตนาการถึงการสำรวจที่น่าสนใจอะไรบ้าง? ### การเตรียมข้อมูล: การเข้ารหัสฟีเจอร์และป้ายกำกับ ชุดข้อมูลฟักทองของเรามีค่าที่เป็นสตริงสำหรับทุกคอลัมน์ การทำงานกับข้อมูลหมวดหมู่เป็นเรื่องง่ายสำหรับมนุษย์ แต่ไม่ใช่สำหรับเครื่องจักร อัลกอริธึม Machine Learning ทำงานได้ดีกับตัวเลข นั่นคือเหตุผลที่การเข้ารหัสเป็นขั้นตอนที่สำคัญมากในกระบวนการเตรียมข้อมูล เนื่องจากช่วยให้เราสามารถเปลี่ยนข้อมูลหมวดหมู่ให้เป็นข้อมูลเชิงตัวเลขโดยไม่สูญเสียข้อมูลใด ๆ การเข้ารหัสที่ดีนำไปสู่การสร้างโมเดลที่ดี สำหรับการเข้ารหัสฟีเจอร์ มีตัวเข้ารหัสหลักสองประเภท: 1. ตัวเข้ารหัสแบบลำดับ: เหมาะสำหรับตัวแปรลำดับ ซึ่งเป็นตัวแปรหมวดหมู่ที่ข้อมูลของพวกมันมีลำดับเชิงตรรกะ เช่น คอลัมน์ `Item Size` ในชุดข้อมูลของเรา มันสร้างการจับคู่ที่แต่ละหมวดหมู่แสดงด้วยตัวเลขซึ่งเป็นลำดับของหมวดหมู่ในคอลัมน์ ```python from sklearn.preprocessing import OrdinalEncoder item_size_categories = [['sml', 'med', 'med-lge', 'lge', 'xlge', 'jbo', 'exjbo']] ordinal_features = ['Item Size'] ordinal_encoder = OrdinalEncoder(categories=item_size_categories) ``` 2. ตัวเข้ารหัสหมวดหมู่: เหมาะสำหรับตัวแปรที่ไม่มีลำดับ ซึ่งเป็นตัวแปรหมวดหมู่ที่ข้อมูลของพวกมันไม่มีลำดับเชิงตรรกะ เช่น ฟีเจอร์ทั้งหมดที่แตกต่างจาก `Item Size` ในชุดข้อมูลของเรา มันเป็นการเข้ารหัสแบบ one-hot ซึ่งหมายความว่าแต่ละหมวดหมู่แสดงด้วยคอลัมน์ไบนารี: ตัวแปรที่เข้ารหัสจะเท่ากับ 1 หากฟักทองเป็นของ `Variety` นั้น และ 0 หากไม่ใช่ ```python from sklearn.preprocessing import OneHotEncoder categorical_features = ['City Name', 'Package', 'Variety', 'Origin'] categorical_encoder = OneHotEncoder(sparse_output=False) ``` จากนั้น `ColumnTransformer` ถูกใช้เพื่อรวมตัวเข้ารหัสหลายตัวในขั้นตอนเดียวและนำไปใช้กับคอลัมน์ที่เหมาะสม ```python from sklearn.compose import ColumnTransformer ct = ColumnTransformer(transformers=[ ('ord', ordinal_encoder, ordinal_features), ('cat', categorical_encoder, categorical_features) ]) ct.set_output(transform='pandas') encoded_features = ct.fit_transform(pumpkins) ``` ในทางกลับกัน สำหรับการเข้ารหัสป้ายกำกับ เราใช้คลาส `LabelEncoder` ของ scikit-learn ซึ่งเป็นคลาสยูทิลิตี้ที่ช่วยทำให้ป้ายกำกับเป็นปกติ โดยที่ป้ายกำกับมีค่าเฉพาะระหว่าง 0 และ n_classes-1 (ที่นี่คือ 0 และ 1) ```python from sklearn.preprocessing import LabelEncoder label_encoder = LabelEncoder() encoded_label = label_encoder.fit_transform(pumpkins['Color']) ``` เมื่อเราเข้ารหัสฟีเจอร์และป้ายกำกับแล้ว เราสามารถรวมพวกมันเข้าด้วยกันใน dataframe ใหม่ `encoded_pumpkins` ```python encoded_pumpkins = encoded_features.assign(Color=encoded_label) ``` ✅ ข้อดีของการใช้ตัวเข้ารหัสแบบลำดับสำหรับคอลัมน์ `Item Size` คืออะไร? ### วิเคราะห์ความสัมพันธ์ระหว่างตัวแปร ตอนนี้เราได้เตรียมข้อมูลของเราแล้ว เราสามารถวิเคราะห์ความสัมพันธ์ระหว่างฟีเจอร์และป้ายกำกับเพื่อให้เข้าใจว่าโมเดลจะสามารถทำนายป้ายกำกับได้ดีเพียงใดจากฟีเจอร์ วิธีที่ดีที่สุดในการทำการวิเคราะห์ประเภทนี้คือการแสดงผลข้อมูล เราจะใช้ฟังก์ชัน `catplot` ของ Seaborn อีกครั้งเพื่อแสดงความสัมพันธ์ระหว่าง `Item Size`, `Variety` และ `Color` ในแผนภูมิหมวดหมู่ เพื่อแสดงผลข้อมูลได้ดียิ่งขึ้น เราจะใช้คอลัมน์ `Item Size` ที่เข้ารหัสและคอลัมน์ `Variety` ที่ไม่ได้เข้ารหัส ```python palette = { 'ORANGE': 'orange', 'WHITE': 'wheat', } pumpkins['Item Size'] = encoded_pumpkins['ord__Item Size'] g = sns.catplot( data=pumpkins, x="Item Size", y="Color", row='Variety', kind="box", orient="h", sharex=False, margin_titles=True, height=1.8, aspect=4, palette=palette, ) g.set(xlabel="Item Size", ylabel="").set(xlim=(0,6)) g.set_titles(row_template="{row_name}") ``` ![แผนภูมิหมวดหมู่ของข้อมูลที่แสดงผล](../../../../2-Regression/4-Logistic/images/pumpkins_catplot_2.png) ### ใช้แผนภูมิแบบฝูง เนื่องจาก `Color` เป็นหมวดหมู่แบบทวิภาค (สีขาวหรือไม่ใช่) มันต้องการ 'วิธีการเฉพาะ [specialized approach](https://seaborn.pydata.org/tutorial/categorical.html?highlight=bar) ในการแสดงผล' ยังมีวิธีอื่น ๆ ในการแสดงความสัมพันธ์ของหมวดหมู่นี้กับตัวแปรอื่น ๆ คุณสามารถแสดงตัวแปรเคียงข้างกันด้วยแผนภูมิ Seaborn 1. ลองใช้แผนภูมิแบบ 'swarm' เพื่อแสดงการกระจายของค่า: ```python palette = { 0: 'orange', 1: 'wheat' } sns.swarmplot(x="Color", y="ord__Item Size", data=encoded_pumpkins, palette=palette) ``` ![แผนภูมิแบบฝูงของข้อมูลที่แสดงผล](../../../../2-Regression/4-Logistic/images/swarm_2.png) **ระวัง**: โค้ดด้านบนอาจสร้างคำเตือน เนื่องจาก Seaborn ไม่สามารถแสดงจุดข้อมูลจำนวนมากในแผนภูมิแบบฝูงได้ วิธีแก้ปัญหาที่เป็นไปได้คือการลดขนาดของเครื่องหมายโดยใช้พารามิเตอร์ 'size' อย่างไรก็ตาม โปรดทราบว่าสิ่งนี้อาจส่งผลต่อความสามารถในการอ่านแผนภูมิ > **🧮 คณิตศาสตร์เบื้องหลัง** > > การถดถอยโลจิสติกอาศัยแนวคิดของ 'ความน่าจะเป็นสูงสุด' โดยใช้ [ฟังก์ชันซิกมอยด์](https://wikipedia.org/wiki/Sigmoid_function) ฟังก์ชันซิกมอยด์บนกราฟมีลักษณะเหมือนรูปตัว 'S' มันรับค่าและแมปไปยังค่าระหว่าง 0 และ 1 เส้นโค้งของมันยังเรียกว่า 'เส้นโค้งโลจิสติก' สูตรของมันมีลักษณะดังนี้: > > ![ฟังก์ชันโลจิสติก](../../../../2-Regression/4-Logistic/images/sigmoid.png) > > โดยที่จุดกึ่งกลางของซิกมอยด์อยู่ที่จุด 0 ของ x, L คือค่ามากสุดของเส้นโค้ง และ k คือความชันของเส้นโค้ง หากผลลัพธ์ของฟังก์ชันมากกว่า 0.5 ป้ายกำกับจะถูกกำหนดให้เป็นคลาส '1' ของตัวเลือกแบบทวิภาค หากไม่ใช่ จะถูกจัดเป็น '0' ## สร้างโมเดลของคุณ การสร้างโมเดลเพื่อค้นหาการจัดหมวดหมู่แบบทวิภาคนั้นง่ายอย่างน่าประหลาดใจใน Scikit-learn [![ML สำหรับผู้เริ่มต้น - การถดถอยโลจิสติกสำหรับการจัดหมวดหมู่ข้อมูล](https://img.youtube.com/vi/MmZS2otPrQ8/0.jpg)](https://youtu.be/MmZS2otPrQ8 "ML สำหรับผู้เริ่มต้น - การถดถอยโลจิสติกสำหรับการจัดหมวดหมู่ข้อมูล") > 🎥 คลิกที่ภาพด้านบนเพื่อดูวิดีโอสั้น ๆ เกี่ยวกับการสร้างโมเดลการถดถอยเชิงเส้น 1. เลือกตัวแปรที่คุณต้องการใช้ในโมเดลการจัดหมวดหมู่ของคุณและแบ่งชุดข้อมูลการฝึกอบรมและการทดสอบโดยเรียกใช้ `train_test_split()`: ```python from sklearn.model_selection import train_test_split X = encoded_pumpkins[encoded_pumpkins.columns.difference(['Color'])] y = encoded_pumpkins['Color'] X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=0) ``` 2. ตอนนี้คุณสามารถฝึกโมเดลของคุณได้โดยเรียกใช้ `fit()` พร้อมข้อมูลการฝึกอบรมของคุณ และพิมพ์ผลลัพธ์ออกมา: ```python from sklearn.metrics import f1_score, classification_report from sklearn.linear_model import LogisticRegression model = LogisticRegression() model.fit(X_train, y_train) predictions = model.predict(X_test) print(classification_report(y_test, predictions)) print('Predicted labels: ', predictions) print('F1-score: ', f1_score(y_test, predictions)) ``` ดูคะแนนของโมเดลของคุณ มันไม่ได้แย่เลยเมื่อพิจารณาว่าคุณมีข้อมูลเพียงประมาณ 1000 แถว: ```output precision recall f1-score support 0 0.94 0.98 0.96 166 1 0.85 0.67 0.75 33 accuracy 0.92 199 macro avg 0.89 0.82 0.85 199 weighted avg 0.92 0.92 0.92 199 Predicted labels: [0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 1 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 1 0 1 0 0 1 0 0 0 0 0 1 0 1 0 1 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 1 0 1 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 1 0 0 0 1 1 0 0 0 0 0 1 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 1 0 0 0 0 0 0 0 0 1 1] F1-score: 0.7457627118644068 ``` ## เข้าใจได้ดีขึ้นด้วยเมทริกซ์ความสับสน แม้ว่าคุณจะสามารถรับรายงานคะแนน [คำศัพท์](https://scikit-learn.org/stable/modules/generated/sklearn.metrics.classification_report.html?highlight=classification_report#sklearn.metrics.classification_report) โดยการพิมพ์รายการด้านบน คุณอาจเข้าใจโมเดลของคุณได้ง่ายขึ้นโดยใช้ [เมทริกซ์ความสับสน](https://scikit-learn.org/stable/modules/model_evaluation.html#confusion-matrix) เพื่อช่วยให้เราเข้าใจว่าโมเดลทำงานอย่างไร > 🎓 '[เมทริกซ์ความสับสน](https://wikipedia.org/wiki/Confusion_matrix)' (หรือ 'เมทริกซ์ข้อผิดพลาด') เป็นตารางที่แสดงค่าจริงและค่าที่โมเดลทำนายไว้ในรูปแบบของค่าบวกและค่าลบที่ถูกต้องและผิดพลาด ซึ่งช่วยวัดความแม่นยำของการทำนาย 1. ในการใช้เมทริกซ์ความสับสน ให้เรียกใช้ `confusion_matrix()`: ```python from sklearn.metrics import confusion_matrix confusion_matrix(y_test, predictions) ``` ดูเมทริกซ์ความสับสนของโมเดลของคุณ: ```output array([[162, 4], [ 11, 22]]) ``` ใน Scikit-learn เมทริกซ์ความสับสนมีแถว (แกน 0) เป็นป้ายกำกับจริง และคอลัมน์ (แกน 1) เป็นป้ายกำกับที่ทำนาย | | 0 | 1 | | :---: | :---: | :---: | | 0 | TN | FP | | 1 | FN | TP | เกิดอะไรขึ้นที่นี่? สมมติว่าโมเดลของเราถูกขอให้จัดหมวดหมู่ฟักทองระหว่างสองหมวดหมู่แบบทวิภาค คือ หมวดหมู่ 'สีขาว' และหมวดหมู่ 'ไม่ใช ความสัมพันธ์ระหว่าง Confusion Matrix กับ Precision และ Recall คืออะไร? จำไว้ว่า Classification Report ที่แสดงไว้ข้างต้นแสดงค่า Precision (0.85) และ Recall (0.67) Precision = tp / (tp + fp) = 22 / (22 + 4) = 0.8461538461538461 Recall = tp / (tp + fn) = 22 / (22 + 11) = 0.6666666666666666 ✅ ถาม: จาก Confusion Matrix โมเดลทำงานเป็นอย่างไร? ตอบ: ไม่เลวเลย; มีจำนวน True Negatives ที่ดี แต่ก็มี False Negatives อยู่บ้าง มาทบทวนคำศัพท์ที่เราเคยเห็นก่อนหน้านี้โดยใช้การแมป TP/TN และ FP/FN จาก Confusion Matrix: 🎓 Precision: TP/(TP + FP) สัดส่วนของตัวอย่างที่เกี่ยวข้องในตัวอย่างที่ถูกดึงมา (เช่น ฉลากที่ถูกระบุได้ดี) 🎓 Recall: TP/(TP + FN) สัดส่วนของตัวอย่างที่เกี่ยวข้องที่ถูกดึงมา ไม่ว่าจะระบุได้ดีหรือไม่ 🎓 f1-score: (2 * precision * recall)/(precision + recall) ค่าเฉลี่ยแบบถ่วงน้ำหนักระหว่าง Precision และ Recall โดยค่าที่ดีที่สุดคือ 1 และแย่ที่สุดคือ 0 🎓 Support: จำนวนครั้งที่ฉลากแต่ละตัวถูกดึงมา 🎓 Accuracy: (TP + TN)/(TP + TN + FP + FN) เปอร์เซ็นต์ของฉลากที่ถูกทำนายได้อย่างถูกต้องในตัวอย่าง 🎓 Macro Avg: การคำนวณค่าเฉลี่ยแบบไม่ถ่วงน้ำหนักสำหรับแต่ละฉลาก โดยไม่คำนึงถึงความไม่สมดุลของฉลาก 🎓 Weighted Avg: การคำนวณค่าเฉลี่ยสำหรับแต่ละฉลาก โดยคำนึงถึงความไม่สมดุลของฉลากด้วยการถ่วงน้ำหนักตาม Support (จำนวนตัวอย่างจริงสำหรับแต่ละฉลาก) ✅ คุณคิดว่าคุณควรดู Metric ใดหากคุณต้องการลดจำนวน False Negatives ของโมเดล? ## การแสดงผล ROC Curve ของโมเดลนี้ [![ML for beginners - การวิเคราะห์ประสิทธิภาพ Logistic Regression ด้วย ROC Curves](https://img.youtube.com/vi/GApO575jTA0/0.jpg)](https://youtu.be/GApO575jTA0 "ML for beginners - การวิเคราะห์ประสิทธิภาพ Logistic Regression ด้วย ROC Curves") > 🎥 คลิกที่ภาพด้านบนเพื่อดูวิดีโอสั้นเกี่ยวกับ ROC Curves มาทำการแสดงผลอีกครั้งเพื่อดู 'ROC' Curve: ```python from sklearn.metrics import roc_curve, roc_auc_score import matplotlib import matplotlib.pyplot as plt %matplotlib inline y_scores = model.predict_proba(X_test) fpr, tpr, thresholds = roc_curve(y_test, y_scores[:,1]) fig = plt.figure(figsize=(6, 6)) plt.plot([0, 1], [0, 1], 'k--') plt.plot(fpr, tpr) plt.xlabel('False Positive Rate') plt.ylabel('True Positive Rate') plt.title('ROC Curve') plt.show() ``` ใช้ Matplotlib เพื่อแสดงผล [Receiving Operating Characteristic](https://scikit-learn.org/stable/auto_examples/model_selection/plot_roc.html?highlight=roc) หรือ ROC ROC Curves มักถูกใช้เพื่อดูผลลัพธ์ของตัวจำแนกในแง่ของ True Positives เทียบกับ False Positives "ROC Curves มักมีแกน Y เป็น True Positive Rate และแกน X เป็น False Positive Rate" ดังนั้น ความชันของกราฟและพื้นที่ระหว่างเส้นกลางกับกราฟจึงสำคัญ: คุณต้องการกราฟที่พุ่งขึ้นและข้ามเส้นอย่างรวดเร็ว ในกรณีของเรา มี False Positives ในช่วงเริ่มต้น และจากนั้นกราฟก็พุ่งขึ้นและข้ามเส้นได้อย่างเหมาะสม: ![ROC](../../../../2-Regression/4-Logistic/images/ROC_2.png) สุดท้าย ใช้ [`roc_auc_score` API](https://scikit-learn.org/stable/modules/generated/sklearn.metrics.roc_auc_score.html?highlight=roc_auc#sklearn.metrics.roc_auc_score) ของ Scikit-learn เพื่อคำนวณ 'Area Under the Curve' (AUC) จริง: ```python auc = roc_auc_score(y_test,y_scores[:,1]) print(auc) ``` ผลลัพธ์คือ `0.9749908725812341` เนื่องจาก AUC มีค่าตั้งแต่ 0 ถึง 1 คุณต้องการคะแนนที่สูง เพราะโมเดลที่ทำนายได้ถูกต้อง 100% จะมี AUC เท่ากับ 1; ในกรณีนี้ โมเดลถือว่า _ดีมาก_ ในบทเรียนเกี่ยวกับการจำแนกประเภทในอนาคต คุณจะได้เรียนรู้วิธีปรับปรุงคะแนนของโมเดล แต่สำหรับตอนนี้ ขอแสดงความยินดี! คุณได้เรียนจบบทเรียนเกี่ยวกับ Regression แล้ว! --- ## 🚀ความท้าทาย ยังมีอีกมากมายเกี่ยวกับ Logistic Regression ที่ต้องเรียนรู้! แต่วิธีที่ดีที่สุดในการเรียนรู้คือการทดลอง ค้นหาชุดข้อมูลที่เหมาะสมกับการวิเคราะห์ประเภทนี้และสร้างโมเดลด้วยชุดข้อมูลนั้น คุณได้เรียนรู้อะไร? เคล็ดลับ: ลองดู [Kaggle](https://www.kaggle.com/search?q=logistic+regression+datasets) สำหรับชุดข้อมูลที่น่าสนใจ ## [แบบทดสอบหลังการบรรยาย](https://ff-quizzes.netlify.app/en/ml/) ## ทบทวนและศึกษาด้วยตนเอง อ่านหน้าแรก ๆ ของ [เอกสารนี้จาก Stanford](https://web.stanford.edu/~jurafsky/slp3/5.pdf) เกี่ยวกับการใช้งาน Logistic Regression ในทางปฏิบัติ ลองคิดถึงงานที่เหมาะสมกับการใช้ Regression ประเภทต่าง ๆ ที่เราได้ศึกษาไปจนถึงตอนนี้ งานประเภทใดที่เหมาะสมที่สุด? ## งานที่ได้รับมอบหมาย [ลองทำ Regression นี้อีกครั้ง](assignment.md) --- **ข้อจำกัดความรับผิดชอบ**: เอกสารนี้ได้รับการแปลโดยใช้บริการแปลภาษา AI [Co-op Translator](https://github.com/Azure/co-op-translator) แม้ว่าเราจะพยายามให้การแปลมีความถูกต้องมากที่สุด แต่โปรดทราบว่าการแปลโดยอัตโนมัติอาจมีข้อผิดพลาดหรือความไม่ถูกต้อง เอกสารต้นฉบับในภาษาดั้งเดิมควรถือเป็นแหล่งข้อมูลที่เชื่อถือได้ สำหรับข้อมูลที่สำคัญ ขอแนะนำให้ใช้บริการแปลภาษามืออาชีพ เราไม่รับผิดชอบต่อความเข้าใจผิดหรือการตีความที่ผิดพลาดซึ่งเกิดจากการใช้การแปลนี้