เพิ่มวิทยาการข้อมูลของคุณด้วยการจัดอันดับใน Python และ Pandas

Nov 28 2022
การจัดอันดับเป็นวิธีการแปลงข้อมูลที่เรียบง่ายแต่มีประสิทธิภาพ ในบทความนี้ ผมจะอธิบายวิธีการทำงาน ประโยชน์ของมัน และวิธีที่คุณสามารถใช้วิเคราะห์ความสัมพันธ์ระหว่างตัวแปร แสดงภาพข้อมูล และแปลงคุณลักษณะต่างๆ

การจัดอันดับเป็นวิธีการแปลงข้อมูลที่เรียบง่ายแต่มีประสิทธิภาพ ในบทความนี้ ผมจะอธิบายวิธีการทำงาน ประโยชน์ของมัน และวิธีที่คุณสามารถใช้วิเคราะห์ความสัมพันธ์ระหว่างตัวแปร แสดงภาพข้อมูล และแปลงคุณลักษณะต่างๆ

สร้างโดย Jacob Ferus โดยใช้ Midjourney

อันดับคืออะไร?

ค่าการจัดอันดับหมายถึงการจัดลำดับและกำหนดค่าใหม่ให้กับแต่ละค่าตามตำแหน่งตามลำดับ ตัวอย่างเช่น ถ้าเรามีค่า:

  • 36
  • 72
  • 12
  • 102
  • 12 - อันดับที่ 1
  • 36 - อันดับที่ 2
  • 72 - อันดับ 3
  • 102 - อันดับ 4

ที่นี่ อันดับถูกกำหนดจากน้อยไปหามาก (อันดับ 1 สอดคล้องกับค่าที่น้อยที่สุด) ซึ่งจากประสบการณ์ของฉันดูเหมือนจะเป็นตัวเลือกที่พบบ่อยที่สุด แต่ก็เป็นไปได้จากมากไปหาน้อย (อันดับ 1 สอดคล้องกับค่าที่มากที่สุด)

ใช้อันดับเพื่อวิเคราะห์สมาคม

ปัญหาเกี่ยวกับความสัมพันธ์

ค่า สหสัมพันธ์หรือค่าสัมประสิทธิ์ สหสัมพันธ์แบบเพียร์สัน เป็นตัววัดที่มีประโยชน์ในการกำหนดขนาดของความสัมพันธ์เชิงเส้นระหว่างตัวแปร แต่มีจุดอ่อน ประการแรก มันใช้ได้กับความสัมพันธ์เชิงเส้นเท่านั้น ประการที่สอง มีความเสี่ยงต่อค่าผิดปกติ

ลองอธิบายสิ่งนี้ ก่อนอื่น ฉันจะแสดงโครงเรื่องของข้อมูลที่ความสัมพันธ์เกือบจะสมบูรณ์แบบ:

อย่างที่คุณเห็น ความสัมพันธ์เกือบจะสูงสุดที่ 1 ทีนี้มาแก้ไขข้อมูลและดูว่าเกิดอะไรขึ้น ในการเปลี่ยนแปลงครั้งแรก ฉันจะเปลี่ยนyเป็นเลขชี้กำลังของตัวมันเอง ในการเปลี่ยนแปลงครั้งที่สอง ฉันจะเพิ่มค่าผิดปกติในช่วงกลางของอนุกรมเวลา:

ในพล็อตด้านซ้ายยังคงมีความสัมพันธ์ที่ชัดเจน แต่ไม่เป็นเชิงเส้น ด้วยเหตุนี้ ความสัมพันธ์จึงลดลงเหลือ 0.684 ในแผนภาพที่สอง ความสัมพันธ์ยังคงเป็นเส้นตรง แต่เนื่องจากค่าผิดปกติขนาดใหญ่ค่าหนึ่ง ความสัมพันธ์จึงลดลงอย่างมากเหลือ 0.329 เราสามารถหลีกเลี่ยงปัญหาเหล่านี้ได้หรือไม่?

ป้อนความสัมพันธ์ของสเปียร์แมน

ปัญหาทั้งสองนี้สามารถบรรเทาได้โดยใช้ ความสัมพันธ์ ของสเปียร์แมน วิธีการนี้ง่าย แทนที่จะคำนวณความสัมพันธ์ระหว่างค่าดิบความสัมพันธ์จะคำนวณระหว่างอันดับของค่า:

ความสัมพันธ์(อันดับ(X), อันดับ(Y))

ก่อนที่จะอธิบายว่าทำไมสิ่งนี้จึงช่วยได้ เรามาอธิบายผลกระทบของมันก่อนโดยการวางแผนอีกครั้งและคำนวณความสัมพันธ์ของสเปียร์แมน:

ตามที่แสดง ในกรณีเลขชี้กำลัง (แผนภาพด้านซ้าย) สหสัมพันธ์ของสเปียร์แมนคือ 0.999 เช่นเดียวกับสหสัมพันธ์ก่อนที่จะใช้ฟังก์ชันเอกซ์โปเนนเชียล ในกรณีของค่าผิดปกติ (พล็อตด้านขวา) ความสัมพันธ์ของ Spearman ยังคงสูงที่ 0.984 เกิดอะไรขึ้นที่นี่?

สามารถตรวจจับการเชื่อมโยงแบบไม่เชิงเส้น

ลองนึกภาพคุณมีสามลำดับข้อมูลที่แตกต่างกัน ตัวหนึ่งเพิ่มขึ้นเชิงเส้น ตัวหนึ่งเพิ่มขึ้นแบบลอการิทึม และตัวหนึ่งเพิ่มขึ้นแบบเอ็กซ์โปเนนเชียล พวกเขามีอะไรเหมือนกัน? พวกเขาทั้งหมด เพิ่มขึ้นอย่างต่อเนื่องหรือซ้ำซากจำเจ แต่โปรดทราบว่านี่ก็หมายความว่าอันดับของพวกเขาจะเหมือนกัน ดังนั้น ถ้าเราใช้ความสัมพันธ์ของ Spearman กับคู่ใดๆ ของลำดับเหล่านี้ ความสัมพันธ์จะเป็น 1! โดยการจัดอันดับ ปัจจัยเดียวที่มีผลกระทบในข้อมูลคือค่าแต่ละค่าจะมากกว่าหรือน้อยกว่าค่าอื่นๆ หรือไม่ ไม่ใช่ความแตกต่างที่แท้จริงระหว่างค่าเหล่านั้น

ลดผลกระทบจากค่าผิดปกติ

เนื่องจากลำดับเป็นสิ่งเดียวที่มีความสำคัญในความสัมพันธ์ของสเปียร์แมน หากเรามีค่า [1, 10000000000000, 2] อันดับของค่าจะเหมือนกับค่า [1, 4, 2] ดังนั้นค่าผิดปกติขนาดใหญ่และขนาดเล็กจะมีผลลดลง ผลต่างที่เป็นไปได้มากที่สุดคือความยาวของเวกเตอร์ลบ 1 (อาจน้อยกว่านี้ในกรณีที่เสมอกัน) ในทางตรงกันข้าม ค่าดิบสามารถมีความแตกต่างกันได้

ความสัมพันธ์ของอันดับและสเปียร์แมนในหมีแพนด้า

จัดอันดับข้อมูลใน Pandas ได้อย่างง่ายดาย วิธีการนี้.rank()สามารถนำไปใช้กับทุกคอลัมน์ใน data frame หรือ series ได้ทันที ตามค่าเริ่มต้น การจัดอันดับจะเป็นจากน้อยไปมาก แต่คุณสามารถเปลี่ยนจากมากไปน้อยได้โดยใช้ascending=Falseอาร์กิวเมนต์

หากมีการเสมอกัน จะใช้ค่าเฉลี่ยโดยค่าเริ่มต้น แต่พฤติกรรมนี้สามารถเปลี่ยนแปลงได้โดยใช้methodอาร์กิวเมนต์

อาร์กิวเมนต์ที่มีประโยชน์อีกอย่างคือpctย่อมาจาก เปอร์เซ็นไทล์ ด้วยสิ่งนี้ คุณจะคำนวณเปอร์เซ็นไทล์หรือควอไทล์ที่แต่ละจุดในข้อมูลที่สอดคล้องกัน เช่น เปอร์เซ็นต์ของข้อมูลที่ต่ำกว่าแต่ละจุด นี่เป็นเพียงอันดับปกติ

คุณยังสามารถคำนวณความสัมพันธ์ของ Spearman โดยใช้methodอาร์กิวเมนต์ใน.corr()เช่นdf.corr(method="spearman")

ตัวอย่าง:

ดังที่เห็นได้ หลังจากใช้.rank()ค่าทุกค่าจะเปลี่ยนเป็นลำดับตามลำดับในแต่ละคอลัมน์โดยอิสระ

การใช้อันดับสำหรับการแสดงภาพ

ข้อมูลที่จัดอันดับมีประโยชน์อย่างยิ่งสำหรับวัตถุประสงค์ในการแสดงภาพ ไม่เพียงเพราะสามารถลดผลกระทบของค่าผิดปกติ แต่ยังเพราะทำให้ข้อมูลอยู่ในการกระจายและมาตราส่วนประเภทเดียวกันด้วย ฉันจะอธิบายสิ่งนี้สำหรับตัวแปรเดียวและหลังจากนั้นหลายตัวแปรพร้อมกัน ผมจะเริ่มต้นด้วยการดึงข้อมูลอนุกรมเวลามาวิเคราะห์ ซึ่งมาจากลิงค์นี้

การแสดงภาพหนึ่งตัวแปร

ตอนนี้เรามาเห็นภาพคอลัมน์แรก (AF3):

ทางด้านซ้าย มีค่าผิดปกติขนาดใหญ่มากค่าหนึ่งที่ทำให้โครงเรื่องทั้งหมดยุ่งเหยิง ทางด้านขวา เมื่อใช้ข้อมูลจัดอันดับ โครงเรื่องจะชัดเจนขึ้นมาก โปรดทราบว่าการใช้ข้อมูลจัดอันดับมีจุดอ่อนในการสูญเสียข้อมูล ดังนั้นโปรดระวังสิ่งที่แสดงจริง การเปลี่ยนแปลงแบบสัมบูรณ์จะถูกลบออกและคุณสมบัติการกระจายเช่นเดียวกัน

การแสดงภาพหลายตัวแปร

เพื่อให้เห็นภาพตัวแปรหลายตัว ฉันจะพล็อตข้อมูลอนุกรมเวลาเป็นเมทริกซ์โดยplt.imshowใช้ ตัวแปรแต่ละตัวจะเป็นแถว (แกน y) และแต่ละขั้นตอนเวลาจะเป็นคอลัมน์ (แกน x) ฉันจะใช้สามขั้นตอนการประมวลผลล่วงหน้าที่แตกต่างกันเพื่อแสดงให้เห็นถึงประโยชน์ของการใช้อันดับ: ระดับมาตรฐาน ระดับต่ำสุด-สูงสุด และการจัดอันดับ:

ขนาดมาตรฐาน:

สำหรับข้อมูลมาตราส่วนมาตรฐานจะมองไม่เห็นอะไรเลย เหตุผลก็คือสเกลสีเป็นแบบเส้นตรง กล่าวคือ ถ้าค่าหนึ่งมีค่ามากกว่าค่าอื่นมาก สีของค่าที่น้อยกว่าจะใกล้เคียงกัน ในขณะที่ค่าสูงสุดจะมีเฉพาะสีสว่างเท่านั้น นอกจากนี้ เนื่องจากนี่เป็นพล็อตเดียวสำหรับคอลัมน์ทั้งหมด ค่าผิดปกติขนาดใหญ่หนึ่งค่าในหนึ่งคอลัมน์สามารถให้ทิปสเกลได้

วิธีแก้ไขคือการใช้สเกลสีแบบลอการิทึม ปัญหาคือว่าหากคุณลักษณะบางอย่างมีมาตราส่วนเชิงเส้นและบางส่วนมีมาตราส่วนลอการิทึม โครงเรื่องจะยังไม่สอดคล้องกันมาก

ปรับสเกลต่ำสุด-สูงสุด:

ตอนนี้ข้อมูลดูดีขึ้นเล็กน้อย ค่าที่มากที่สุดจะเท่ากันสำหรับทุกคอลัมน์ แต่ถึงกระนั้น ถ้าค่าที่มากที่สุดเป็นค่าผิดปกติ สีของข้อมูลที่เหลือจะเข้มขึ้น ดูคอลัมน์ O1 และ O2

จัดอันดับ:

สุดท้าย ด้วยการแปลงแบบจัดอันดับ แต่ละคอลัมน์จะถูกแสดงเท่าๆ กัน และง่ายต่อการดูว่าคอลัมน์ต่างๆ แตกต่างกันอย่างไรโดยมีความสัมพันธ์กันอย่างไร

โครงเรื่องเช่นนี้มีประโยชน์ในการทำให้เห็นภาพแนวโน้ม ตัวอย่างเช่น แนวโน้มรอบขั้นตอนเวลา 10700 จะมองเห็นได้ชัดเจนสำหรับคอลัมน์ส่วนใหญ่ จำสิ่งที่แสดงไว้เช่นเดิม ข้อมูลการกระจายเกี่ยวกับค่าผิดปกติ ค่าเอียง ฯลฯ จะถูกลบออก

การแปลงคุณสมบัติโดยใช้อันดับ

ประโยชน์เดียวกันในการลดผลกระทบของค่าผิดปกติและการลดความซับซ้อนของการกระจายจะมีประโยชน์เมื่อสร้างโมเดลแมชชีนเลิร์นนิงโดยดำเนินการแปลงคุณลักษณะจากค่าดิบเป็นอันดับ เพื่อแสดงสิ่งนี้ ฉันจะเปรียบเทียบการเปลี่ยนแปลงนี้กับการปรับขนาดมาตรฐานสำหรับ ชุดข้อมูล ที่อยู่อาศัยในแคลิฟอร์เนีย หมายเหตุ การแปลงฟีเจอร์ เช่น การปรับขนาดมาตรฐานและการใช้ข้อมูลจัดอันดับไม่จำเป็นสำหรับโมเดลแบบต้นไม้ ในการทดลองนี้ ฉันจะใช้เครือข่ายประสาทแบบฟีดฟอร์เวิร์ดจากไลบรารี sklearn เพื่อความเรียบง่าย แต่ฉันขอแนะนำ PyTorch, TensorFlow หรือไลบรารีที่คล้ายกันในทางปฏิบัติ

ก่อนอื่นมาโหลดและแยกข้อมูล:

ตอนนี้ เรามาดูกันก่อนว่าโครงข่ายประสาทเทียมอย่างง่ายที่มีการปรับขนาดมาตรฐานนั้นทำได้ดีเพียงใด:

ก่อนทำการแปลงอันดับ คุณควรตรวจสอบว่าคอลัมน์ใดจะได้ประโยชน์จากการแปลงดังกล่าว เพื่อตรวจสอบสิ่งนี้ ลองวางแผนกราฟฮิสโตแกรมของแต่ละคอลัมน์:

AveRooms, AveBedrms, Population และ AveOccup ดูเหมือนจะมีค่าผิดปกติมาก ตอนนี้ มาทำการแปลงอันดับก่อนขั้นตอนการปรับขนาดมาตรฐานในคอลัมน์เหล่านี้เท่านั้น:

ที่นี่ฉันได้สร้างคลาสที่ทำการแปลงอันดับ ขั้นแรก อันดับจะดึงมาจากข้อมูลการฝึก จากนั้นสำหรับข้อมูลการทดสอบ ข้อมูลจะถูกแมปกับอันดับที่ใกล้ที่สุดในข้อมูลการฝึก นอกจากนี้ยังมีตัวเลือกอื่นๆ เช่น หากอยู่ระหว่างอันดับให้ใช้ค่าเฉลี่ยบางประเภท ในทางปฏิบัติ คุณควรใช้ scikit-learn QuantileTransformerแทน ซึ่งคล้ายกันและมีฟังก์ชันและตัวเลือกเพิ่มเติม

ผลลัพธ์ดีขึ้น! แน่นอนว่าอาจไม่เป็นเช่นนั้นเสมอไป แต่ก็คุ้มค่าที่จะลองแปลงคุณลักษณะต่างๆ ในระหว่างการสร้างแบบจำลองเพื่อดูว่าสามารถปรับปรุงที่สำคัญได้หรือไม่

ขอบคุณที่อ่าน!

หากคุณสนใจที่จะอ่านบทความเพิ่มเติมเกี่ยวกับวิทยาศาสตร์ข้อมูล โปรดดูรายการอ่านของฉันด้านล่าง:

หากคุณต้องการเป็นสมาชิกระดับกลาง คุณสามารถใช้ลิงก์อ้างอิง ของฉัน ได้หากต้องการ ขอให้เป็นวันที่ดี.