# สร้างโมเดลการถดถอยด้วย Scikit-learn: เตรียมและแสดงข้อมูล ![อินโฟกราฟิกการแสดงข้อมูล](../../../../2-Regression/2-Data/images/data-visualization.png) อินโฟกราฟิกโดย [Dasani Madipalli](https://twitter.com/dasani_decoded) ## [แบบทดสอบก่อนเรียน](https://ff-quizzes.netlify.app/en/ml/) > ### [บทเรียนนี้มีในภาษา R ด้วย!](../../../../2-Regression/2-Data/solution/R/lesson_2.html) ## บทนำ เมื่อคุณมีเครื่องมือที่จำเป็นสำหรับการเริ่มต้นสร้างโมเดลการเรียนรู้ของเครื่องด้วย Scikit-learn แล้ว คุณก็พร้อมที่จะเริ่มตั้งคำถามกับข้อมูลของคุณ การทำงานกับข้อมูลและการใช้โซลูชัน ML นั้น สิ่งสำคัญคือการเข้าใจวิธีตั้งคำถามที่ถูกต้องเพื่อปลดล็อกศักยภาพของชุดข้อมูลของคุณอย่างเหมาะสม ในบทเรียนนี้ คุณจะได้เรียนรู้: - วิธีเตรียมข้อมูลของคุณสำหรับการสร้างโมเดล - วิธีใช้ Matplotlib สำหรับการแสดงข้อมูล ## การตั้งคำถามที่ถูกต้องกับข้อมูลของคุณ คำถามที่คุณต้องการคำตอบจะกำหนดประเภทของอัลกอริทึม ML ที่คุณจะใช้ และคุณภาพของคำตอบที่คุณได้รับจะขึ้นอยู่กับลักษณะของข้อมูลของคุณอย่างมาก ลองดู [ข้อมูล](https://github.com/microsoft/ML-For-Beginners/blob/main/2-Regression/data/US-pumpkins.csv) ที่ให้มาในบทเรียนนี้ คุณสามารถเปิดไฟล์ .csv นี้ใน VS Code การดูอย่างรวดเร็วจะเห็นได้ทันทีว่ามีช่องว่างและการผสมผสานระหว่างข้อมูลตัวอักษรและตัวเลข นอกจากนี้ยังมีคอลัมน์แปลก ๆ ที่เรียกว่า 'Package' ซึ่งข้อมูลเป็นการผสมระหว่าง 'sacks', 'bins' และค่าอื่น ๆ ข้อมูลนี้ค่อนข้างยุ่งเหยิง [![ML สำหรับผู้เริ่มต้น - วิธีวิเคราะห์และทำความสะอาดชุดข้อมูล](https://img.youtube.com/vi/5qGjczWTrDQ/0.jpg)](https://youtu.be/5qGjczWTrDQ "ML สำหรับผู้เริ่มต้น - วิธีวิเคราะห์และทำความสะอาดชุดข้อมูล") > 🎥 คลิกที่ภาพด้านบนเพื่อดูวิดีโอสั้น ๆ เกี่ยวกับการเตรียมข้อมูลสำหรับบทเรียนนี้ ในความเป็นจริง ไม่บ่อยนักที่คุณจะได้รับชุดข้อมูลที่พร้อมใช้งานสำหรับการสร้างโมเดล ML ทันที ในบทเรียนนี้ คุณจะได้เรียนรู้วิธีเตรียมชุดข้อมูลดิบโดยใช้ไลบรารี Python มาตรฐาน นอกจากนี้คุณยังจะได้เรียนรู้เทคนิคต่าง ๆ ในการแสดงข้อมูล ## กรณีศึกษา: 'ตลาดฟักทอง' ในโฟลเดอร์นี้ คุณจะพบไฟล์ .csv ในโฟลเดอร์ `data` ชื่อ [US-pumpkins.csv](https://github.com/microsoft/ML-For-Beginners/blob/main/2-Regression/data/US-pumpkins.csv) ซึ่งมีข้อมูล 1757 บรรทัดเกี่ยวกับตลาดฟักทอง โดยจัดกลุ่มตามเมือง นี่คือข้อมูลดิบที่ดึงมาจาก [รายงานมาตรฐานตลาดพืชผลเฉพาะทาง](https://www.marketnews.usda.gov/mnp/fv-report-config-step1?type=termPrice) ที่เผยแพร่โดยกระทรวงเกษตรของสหรัฐอเมริกา ### การเตรียมข้อมูล ข้อมูลนี้เป็นข้อมูลสาธารณะ สามารถดาวน์โหลดได้ในหลายไฟล์แยกกันตามเมืองจากเว็บไซต์ USDA เพื่อหลีกเลี่ยงการมีไฟล์แยกกันมากเกินไป เราได้รวมข้อมูลจากทุกเมืองไว้ในสเปรดชีตเดียว ดังนั้นเราจึงได้ _เตรียม_ ข้อมูลไว้บ้างแล้ว ต่อไป มาดูข้อมูลนี้อย่างใกล้ชิดกัน ### ข้อมูลฟักทอง - ข้อสรุปเบื้องต้น คุณสังเกตเห็นอะไรเกี่ยวกับข้อมูลนี้? คุณอาจเห็นแล้วว่ามีการผสมผสานระหว่างตัวอักษร ตัวเลข ช่องว่าง และค่าที่แปลก ๆ ที่คุณต้องทำความเข้าใจ คำถามอะไรที่คุณสามารถถามข้อมูลนี้โดยใช้เทคนิคการถดถอย? เช่น "ทำนายราคาฟักทองที่ขายในแต่ละเดือน" เมื่อดูข้อมูลอีกครั้ง มีการเปลี่ยนแปลงบางอย่างที่คุณต้องทำเพื่อสร้างโครงสร้างข้อมูลที่จำเป็นสำหรับงานนี้ ## แบบฝึกหัด - วิเคราะห์ข้อมูลฟักทอง ลองใช้ [Pandas](https://pandas.pydata.org/) (ชื่อย่อมาจาก `Python Data Analysis`) ซึ่งเป็นเครื่องมือที่มีประโยชน์มากสำหรับการจัดรูปแบบข้อมูล เพื่อวิเคราะห์และเตรียมข้อมูลฟักทองนี้ ### ขั้นแรก ตรวจสอบวันที่ที่ขาดหายไป คุณจะต้องดำเนินการตรวจสอบวันที่ที่ขาดหายไป: 1. แปลงวันที่เป็นรูปแบบเดือน (วันที่ในสหรัฐฯ มีรูปแบบ `MM/DD/YYYY`) 2. ดึงเดือนออกมาใส่ในคอลัมน์ใหม่ เปิดไฟล์ _notebook.ipynb_ ใน Visual Studio Code และนำเข้าสเปรดชีตไปยัง Pandas dataframe ใหม่ 1. ใช้ฟังก์ชัน `head()` เพื่อดู 5 แถวแรก ```python import pandas as pd pumpkins = pd.read_csv('../data/US-pumpkins.csv') pumpkins.head() ``` ✅ ฟังก์ชันใดที่คุณจะใช้เพื่อดู 5 แถวสุดท้าย? 1. ตรวจสอบว่ามีข้อมูลที่ขาดหายไปใน dataframe ปัจจุบันหรือไม่: ```python pumpkins.isnull().sum() ``` มีข้อมูลที่ขาดหายไป แต่บางทีอาจจะไม่สำคัญสำหรับงานนี้ 1. เพื่อให้ง่ายต่อการทำงานกับ dataframe ของคุณ ให้เลือกเฉพาะคอลัมน์ที่คุณต้องการ โดยใช้ฟังก์ชัน `loc` ซึ่งดึงกลุ่มแถว (พารามิเตอร์แรก) และคอลัมน์ (พารามิเตอร์ที่สอง) จาก dataframe ดั้งเดิม การใช้ `:` ในกรณีนี้หมายถึง "ทุกแถว" ```python columns_to_select = ['Package', 'Low Price', 'High Price', 'Date'] pumpkins = pumpkins.loc[:, columns_to_select] ``` ### ขั้นที่สอง คำนวณราคาฟักทองเฉลี่ย ลองคิดดูว่าจะคำนวณราคาฟักทองเฉลี่ยในแต่ละเดือนได้อย่างไร คอลัมน์ใดที่คุณจะเลือกสำหรับงานนี้? คำใบ้: คุณจะต้องใช้ 3 คอลัมน์ วิธีแก้ปัญหา: คำนวณค่าเฉลี่ยของคอลัมน์ `Low Price` และ `High Price` เพื่อเติมคอลัมน์ Price ใหม่ และแปลงคอลัมน์ Date ให้แสดงเฉพาะเดือน โชคดีที่จากการตรวจสอบข้างต้น ไม่มีข้อมูลที่ขาดหายไปสำหรับวันที่หรือราคา 1. เพื่อคำนวณค่าเฉลี่ย ให้เพิ่มโค้ดต่อไปนี้: ```python price = (pumpkins['Low Price'] + pumpkins['High Price']) / 2 month = pd.DatetimeIndex(pumpkins['Date']).month ``` ✅ คุณสามารถพิมพ์ข้อมูลใด ๆ ที่คุณต้องการตรวจสอบโดยใช้ `print(month)` 2. ตอนนี้ คัดลอกข้อมูลที่แปลงแล้วไปยัง Pandas dataframe ใหม่: ```python new_pumpkins = pd.DataFrame({'Month': month, 'Package': pumpkins['Package'], 'Low Price': pumpkins['Low Price'],'High Price': pumpkins['High Price'], 'Price': price}) ``` การพิมพ์ dataframe ของคุณจะแสดงชุดข้อมูลที่สะอาดและเป็นระเบียบ ซึ่งคุณสามารถใช้สร้างโมเดลการถดถอยใหม่ได้ ### แต่เดี๋ยวก่อน! มีบางอย่างแปลก ๆ หากคุณดูที่คอลัมน์ `Package` ฟักทองถูกขายในรูปแบบที่หลากหลาย บางรายการขายในหน่วย '1 1/9 bushel' บางรายการใน '1/2 bushel' บางรายการต่อฟักทอง บางรายการต่อปอนด์ และบางรายการในกล่องใหญ่ที่มีความกว้างต่างกัน > ฟักทองดูเหมือนจะยากต่อการชั่งน้ำหนักอย่างสม่ำเสมอ เมื่อเจาะลึกลงไปในข้อมูลดั้งเดิม จะพบว่าสิ่งที่มี `Unit of Sale` เท่ากับ 'EACH' หรือ 'PER BIN' ก็มีประเภท `Package` เป็นต่อนิ้ว ต่อถัง หรือ 'each' ฟักทองดูเหมือนจะยากต่อการชั่งน้ำหนักอย่างสม่ำเสมอ ดังนั้นให้กรองโดยเลือกเฉพาะฟักทองที่มีคำว่า 'bushel' ในคอลัมน์ `Package` 1. เพิ่มตัวกรองที่ด้านบนของไฟล์ ใต้การนำเข้า .csv เริ่มต้น: ```python pumpkins = pumpkins[pumpkins['Package'].str.contains('bushel', case=True, regex=True)] ``` หากคุณพิมพ์ข้อมูลตอนนี้ คุณจะเห็นว่าคุณได้รับเพียงประมาณ 415 แถวของข้อมูลที่มีฟักทองตาม bushel ### แต่เดี๋ยวก่อน! ยังมีอีกสิ่งที่ต้องทำ คุณสังเกตเห็นหรือไม่ว่าปริมาณ bushel แตกต่างกันในแต่ละแถว? คุณต้องปรับราคามาตรฐานเพื่อแสดงราคาต่อ bushel ดังนั้นให้ทำการคำนวณเพื่อทำให้เป็นมาตรฐาน 1. เพิ่มบรรทัดเหล่านี้หลังบล็อกที่สร้าง dataframe `new_pumpkins`: ```python new_pumpkins.loc[new_pumpkins['Package'].str.contains('1 1/9'), 'Price'] = price/(1 + 1/9) new_pumpkins.loc[new_pumpkins['Package'].str.contains('1/2'), 'Price'] = price/(1/2) ``` ✅ ตามที่ [The Spruce Eats](https://www.thespruceeats.com/how-much-is-a-bushel-1389308) ระบุ น้ำหนักของ bushel ขึ้นอยู่กับประเภทของผลผลิต เนื่องจากเป็นการวัดปริมาตร "bushel ของมะเขือเทศ ตัวอย่างเช่น ควรมีน้ำหนัก 56 ปอนด์... ใบและผักใบเขียวใช้พื้นที่มากกว่าแต่น้ำหนักน้อยกว่า ดังนั้น bushel ของผักโขมจึงมีน้ำหนักเพียง 20 ปอนด์" มันค่อนข้างซับซ้อน! เราจะไม่ยุ่งกับการแปลง bushel เป็นปอนด์ และแทนที่จะใช้ราคาต่อ bushel การศึกษาทั้งหมดนี้เกี่ยวกับ bushel ของฟักทองแสดงให้เห็นว่าการเข้าใจลักษณะของข้อมูลของคุณมีความสำคัญเพียงใด! ตอนนี้ คุณสามารถวิเคราะห์ราคาต่อหน่วยตามการวัด bushel ได้ หากคุณพิมพ์ข้อมูลอีกครั้ง คุณจะเห็นว่ามันถูกปรับมาตรฐานแล้ว ✅ คุณสังเกตเห็นหรือไม่ว่าฟักทองที่ขายเป็นครึ่ง bushel มีราคาแพงมาก? คุณสามารถหาสาเหตุได้หรือไม่? คำใบ้: ฟักทองลูกเล็กมีราคาแพงกว่าลูกใหญ่มาก อาจเป็นเพราะมีจำนวนมากกว่าต่อลูก bushel เนื่องจากพื้นที่ว่างที่ไม่ได้ใช้ที่เกิดจากฟักทองพายลูกใหญ่ที่กลวง ## กลยุทธ์การแสดงข้อมูล ส่วนหนึ่งของบทบาทของนักวิทยาศาสตร์ข้อมูลคือการแสดงคุณภาพและลักษณะของข้อมูลที่พวกเขากำลังทำงานด้วย เพื่อทำสิ่งนี้ พวกเขามักจะสร้างการแสดงผลที่น่าสนใจ เช่น แผนภาพ กราฟ และแผนภูมิที่แสดงแง่มุมต่าง ๆ ของข้อมูล ด้วยวิธีนี้ พวกเขาสามารถแสดงความสัมพันธ์และช่องว่างที่ยากจะค้นพบได้ด้วยสายตา [![ML สำหรับผู้เริ่มต้น - วิธีแสดงข้อมูลด้วย Matplotlib](https://img.youtube.com/vi/SbUkxH6IJo0/0.jpg)](https://youtu.be/SbUkxH6IJo0 "ML สำหรับผู้เริ่มต้น - วิธีแสดงข้อมูลด้วย Matplotlib") > 🎥 คลิกที่ภาพด้านบนเพื่อดูวิดีโอสั้น ๆ เกี่ยวกับการแสดงข้อมูลสำหรับบทเรียนนี้ การแสดงผลยังสามารถช่วยกำหนดเทคนิคการเรียนรู้ของเครื่องที่เหมาะสมที่สุดสำหรับข้อมูลได้อีกด้วย ตัวอย่างเช่น scatterplot ที่ดูเหมือนจะเป็นเส้นตรง อาจบ่งชี้ว่าข้อมูลเหมาะสำหรับการฝึกการถดถอยเชิงเส้น ไลบรารีการแสดงข้อมูลที่ทำงานได้ดีใน Jupyter notebooks คือ [Matplotlib](https://matplotlib.org/) (ซึ่งคุณเคยเห็นในบทเรียนก่อนหน้า) > รับประสบการณ์เพิ่มเติมเกี่ยวกับการแสดงข้อมูลใน [บทเรียนเหล่านี้](https://docs.microsoft.com/learn/modules/explore-analyze-data-with-python?WT.mc_id=academic-77952-leestott) ## แบบฝึกหัด - ทดลองใช้ Matplotlib ลองสร้างแผนภาพพื้นฐานเพื่อแสดง dataframe ใหม่ที่คุณเพิ่งสร้างขึ้น แผนภาพเส้นพื้นฐานจะแสดงอะไร? 1. นำเข้า Matplotlib ที่ด้านบนของไฟล์ ใต้การนำเข้า Pandas: ```python import matplotlib.pyplot as plt ``` 1. รัน notebook ทั้งหมดอีกครั้งเพื่อรีเฟรช 1. ที่ด้านล่างของ notebook เพิ่มเซลล์เพื่อสร้างแผนภาพแบบกล่อง: ```python price = new_pumpkins.Price month = new_pumpkins.Month plt.scatter(price, month) plt.show() ``` ![scatterplot แสดงความสัมพันธ์ระหว่างราคาและเดือน](../../../../2-Regression/2-Data/images/scatterplot.png) นี่เป็นแผนภาพที่มีประโยชน์หรือไม่? มีอะไรที่ทำให้คุณประหลาดใจหรือไม่? มันไม่ค่อยมีประโยชน์นัก เนื่องจากมันแสดงเพียงการกระจายของจุดข้อมูลในแต่ละเดือน ### ทำให้มันมีประโยชน์ เพื่อให้แผนภูมิแสดงข้อมูลที่มีประโยชน์ คุณมักจะต้องจัดกลุ่มข้อมูลในบางลักษณะ ลองสร้างแผนภูมิที่แกน y แสดงเดือน และข้อมูลแสดงการกระจายของข้อมูล 1. เพิ่มเซลล์เพื่อสร้างแผนภูมิแท่งแบบกลุ่ม: ```python new_pumpkins.groupby(['Month'])['Price'].mean().plot(kind='bar') plt.ylabel("Pumpkin Price") ``` ![แผนภูมิแท่งแสดงความสัมพันธ์ระหว่างราคาและเดือน](../../../../2-Regression/2-Data/images/barchart.png) นี่เป็นการแสดงข้อมูลที่มีประโยชน์มากขึ้น! ดูเหมือนว่าราคาสูงสุดของฟักทองจะเกิดขึ้นในเดือนกันยายนและตุลาคม ตรงกับความคาดหวังของคุณหรือไม่? เพราะอะไร? --- ## 🚀ความท้าทาย สำรวจประเภทต่าง ๆ ของการแสดงผลที่ Matplotlib มีให้ ประเภทใดที่เหมาะสมที่สุดสำหรับปัญหาการถดถอย? ## [แบบทดสอบหลังเรียน](https://ff-quizzes.netlify.app/en/ml/) ## ทบทวนและศึกษาด้วยตนเอง ลองดูวิธีการแสดงข้อมูลที่หลากหลาย ทำรายการไลบรารีต่าง ๆ ที่มีอยู่และบันทึกว่าไลบรารีใดเหมาะสมที่สุดสำหรับงานประเภทใด เช่น การแสดงผล 2D เทียบกับ 3D คุณค้นพบอะไรบ้าง? ## การบ้าน [สำรวจการแสดงผล](assignment.md) --- **ข้อจำกัดความรับผิดชอบ**: เอกสารนี้ได้รับการแปลโดยใช้บริการแปลภาษา AI [Co-op Translator](https://github.com/Azure/co-op-translator) แม้ว่าเราจะพยายามให้การแปลมีความถูกต้อง แต่โปรดทราบว่าการแปลอัตโนมัติอาจมีข้อผิดพลาดหรือความไม่แม่นยำ เอกสารต้นฉบับในภาษาดั้งเดิมควรถือเป็นแหล่งข้อมูลที่เชื่อถือได้ สำหรับข้อมูลที่สำคัญ แนะนำให้ใช้บริการแปลภาษาจากผู้เชี่ยวชาญ เราไม่รับผิดชอบต่อความเข้าใจผิดหรือการตีความที่ผิดพลาดซึ่งเกิดจากการใช้การแปลนี้