การระบุสิ่งที่ไม่รู้จักด้วยการวัดคลัสเตอร์
เผยแพร่แล้ว: 2022-09-08การจัดกลุ่มเป็นวิธีการเรียนรู้ของเครื่องที่ไม่มีการควบคุมดูแลเพื่อแบ่งข้อมูลที่กำหนดออกเป็นกลุ่มตามคุณลักษณะของแต่ละตัวอย่างเท่านั้น การจัดเรียงข้อมูลลงในคลัสเตอร์สามารถช่วยระบุความคล้ายคลึงที่ไม่รู้จักระหว่างตัวอย่างหรือเปิดเผยค่าผิดปกติในชุดข้อมูล ในโลกแห่งความเป็นจริง การจัดกลุ่มมีความสำคัญในหลายสาขา ตั้งแต่การตลาดไปจนถึงชีววิทยา: แอปพลิเคชันการจัดกลุ่มประกอบด้วยการแบ่งส่วนตลาด การวิเคราะห์เครือข่ายสังคม และภาพทางการแพทย์เพื่อการวินิจฉัย
เนื่องจากกระบวนการนี้ไม่ได้รับการดูแล ผลลัพธ์จากการจัดกลุ่มหลายรายการจึงสามารถเกิดขึ้นได้จากคุณลักษณะต่างๆ ตัวอย่างเช่น สมมติว่าคุณมีชุดข้อมูลซึ่งประกอบด้วยรูปภาพต่างๆ ของกางเกงขายาวสีแดง กางเกงขายาวสีดำ เสื้อสีแดง และเสื้อเชิ้ตสีดำ อัลกอริทึมหนึ่งอาจพบคลัสเตอร์ตามรูปร่างของเสื้อผ้า ในขณะที่อีกอัลกอริทึมอาจสร้างกลุ่มตามสี
เมื่อวิเคราะห์ชุดข้อมูล เราต้องการวิธีวัดประสิทธิภาพของอัลกอริธึมการจัดกลุ่มที่แตกต่างกันอย่างแม่นยำ เราอาจต้องการเปรียบเทียบโซลูชันของอัลกอริธึมทั้งสอง หรือดูว่าผลลัพธ์ของคลัสเตอร์ใกล้เคียงกับโซลูชันที่คาดไว้เพียงใด ในบทความนี้ เราจะสำรวจเมตริกบางส่วนที่สามารถใช้เปรียบเทียบผลลัพธ์การจัดกลุ่มต่างๆ ที่ได้รับจากข้อมูลเดียวกันได้
การทำความเข้าใจการจัดกลุ่ม: ตัวอย่างโดยย่อ
มากำหนดชุดข้อมูลตัวอย่างที่เราจะใช้เพื่ออธิบายแนวคิดเมตริกการจัดกลุ่มต่างๆ และตรวจสอบประเภทของคลัสเตอร์ที่อาจสร้าง
ประการแรก สัญกรณ์และข้อกำหนดทั่วไปบางประการ:
- $D$: ชุดข้อมูล
- $A$, $B$: สองคลัสเตอร์ที่เป็นส่วนย่อยของชุดข้อมูลของเรา
- $C$: การจัดกลุ่มความจริงเบื้องต้นของ $D$ ที่เราจะเปรียบเทียบคลัสเตอร์อื่นกับ
- การทำคลัสเตอร์ $C$ มีคลัสเตอร์ $K$ $C = {C_1, …, C_k}$
- $C'$: การรวมกลุ่มที่สองของ $D$
- การทำคลัสเตอร์ $C'$ มีคลัสเตอร์ $K'$, $C' = {C^\prime_1, …, C^\prime_{k^\prime}}$
ผลลัพธ์ของคลัสเตอร์อาจแตกต่างกันไปตามคุณลักษณะการจัดเรียงเท่านั้น แต่ยังรวมถึงจำนวนคลัสเตอร์ทั้งหมดด้วย ผลลัพธ์ขึ้นอยู่กับอัลกอริทึม ความไวต่อสิ่งรบกวนเล็กน้อย พารามิเตอร์ของแบบจำลอง และคุณสมบัติของข้อมูล การใช้ชุดข้อมูลกางเกงและเสื้อเชิ้ตสีดำและสีแดงที่กล่าวถึงก่อนหน้านี้ ทำให้มีผลลัพธ์การจัดกลุ่มที่หลากหลายที่อาจเกิดจากอัลกอริธึมที่แตกต่างกัน
เพื่อแยกความแตกต่างระหว่างการทำคลัสเตอร์ทั่วไป $C$ และการทำคลัสเตอร์ตัวอย่าง เราจะใช้ $c$ ตัวพิมพ์เล็กเพื่ออธิบายคลัสเตอร์ตัวอย่างของเรา:
- $c$ โดยมีกลุ่มตามรูปร่าง: $c = {c_1, c_2}$ โดยที่ $c_1$ หมายถึงกางเกง และ $c_2$ หมายถึงเสื้อ
- $c'$ โดยมีกลุ่มตามสี: $c' = {c'_1, c'_2}$ โดยที่ $c'_1$ หมายถึงเสื้อผ้าสีแดง และ $c'_2$ หมายถึงเสื้อผ้าสีดำ
- $c''$ โดยมีกลุ่มตามรูปร่างและสี: $c'' = {{c^{\prime \prime}}_1, {c^{\prime \prime}}_2, {c^{\prime \prime}}_3, {c^{\prime \prime}}_4}$ โดยที่ ${c^{\prime \prime}}_1$ หมายถึงกางเกงขายาวสีแดง ${c^{\prime \prime}}_2 $ หมายถึงกางเกงขายาวสีดำ ${c^{\prime \prime}}_3$ หมายถึงเสื้อแดง และ ${c^{\prime \prime}}_4$ หมายถึงเสื้อเชิ้ตสีดำ
การจัดกลุ่มเพิ่มเติมอาจรวมกลุ่มมากกว่าสี่กลุ่มตามคุณลักษณะที่แตกต่างกัน เช่น เสื้อไม่มีแขนหรือแขนเสื้อ
ดังที่เห็นในตัวอย่างของเรา วิธีการจัดกลุ่มจะแบ่งตัวอย่างทั้งหมดในชุดข้อมูลออกเป็นชุดย่อยที่ไม่ปะติดปะต่อกันที่ไม่ว่างเปล่า ในกลุ่ม $c$ ไม่มีรูปภาพที่เป็นของทั้งชุดย่อยกางเกงและชุดย่อยของเสื้อ: $c_1 \cap c_2 = \emptyset$ แนวคิดนี้สามารถขยายได้ ไม่มีกลุ่มย่อยสองกลุ่มใดที่มีตัวอย่างเหมือนกัน
ภาพรวมของการวัดเปรียบเทียบคลัสเตอร์
เกณฑ์ส่วนใหญ่สำหรับการเปรียบเทียบการจัดกลุ่มสามารถอธิบายได้โดยใช้เมทริกซ์ความสับสนของคู่สกุลเงิน $C, C'$ เมทริกซ์ความสับสนจะเป็นเมทริกซ์ $K \times K'$ ซึ่งมีองค์ประกอบ $kk'$th (องค์ประกอบในแถวที่ $k$th และคอลัมน์ $k'$th) คือจำนวนตัวอย่างในส่วนตัดของคลัสเตอร์ $ C_k$ ของ $C$ และ $C'_{k'}$ ของ $C'$:
\[n_{kk'} = |C_k \cap C'_{k'}|\]เราจะแยกรายละเอียดโดยใช้ตัวอย่างกางเกงและเสื้อเชิ้ตสีดำและสีแดงแบบง่าย สมมติว่าชุดข้อมูล $D$ มีกางเกงสีแดง 100 ตัว กางเกงสีดำ 200 ตัว เสื้อสีแดง 200 ตัว และเสื้อเชิ้ตสีดำ 300 ตัว ลองตรวจสอบเมทริกซ์ความสับสนของ $c$ และ $c''$:
เนื่องจาก $K = 2$ และ $K'' = 4$ นี่คือเมทริกซ์ $2 \คูณ 4$ ให้เลือก $k = 2$ และ $k'' = 3$ เราจะเห็นว่าองค์ประกอบนั้น $n_{kk'} = n_{23} = 200$ ซึ่งหมายความว่าจุดตัดของ $c_2$ (shirts) และ ${c^{\prime\prime}}_3$ (red shirts) คือ 200 ซึ่งถูกต้องตั้งแต่ $c_2 \cap {c^{\prime\prime} }_3$ ก็แค่ชุดเสื้อแดง
เมทริกการจัดกลุ่มสามารถแบ่งออกกว้างๆ ได้เป็นสามกลุ่มตามวิธีการเปรียบเทียบคลัสเตอร์พื้นฐาน:
ในบทความนี้ เราจะพูดถึงเมตริกเพียงไม่กี่รายการที่มี แต่ตัวอย่างของเราจะช่วยกำหนดกลุ่มเมตริกการทำคลัสเตอร์ทั้งสามกลุ่ม
นับคู่
การนับคู่ต้องตรวจสอบตัวอย่างทุกคู่ จากนั้นจึงนับคู่ที่การจัดกลุ่มเห็นด้วยและไม่เห็นด้วย ตัวอย่างแต่ละคู่สามารถอยู่ในหนึ่งในสี่ชุด โดยที่องค์ประกอบชุดนั้นนับ ($N_{ij}$) ได้จากเมทริกซ์ความสับสน:
- $S_{11}$ โดยมี $N_{11}$ องค์ประกอบ: องค์ประกอบของคู่อยู่ในคลัสเตอร์เดียวกันภายใต้ทั้ง $C$ และ $C'$
- เสื้อแดงสองตัวจะต่ำกว่า $S_{11}$ เมื่อเปรียบเทียบ $c$ กับ $c''$
- $S_{00}$ โดยมี $N_{00}$ องค์ประกอบ: องค์ประกอบของทั้งคู่อยู่ในคลัสเตอร์ที่แตกต่างกันภายใต้ทั้ง $C$ และ $C'$
- เสื้อแดงและกางเกงขายาวสีดำคู่หนึ่งจะต่ำกว่า $S_{00}$ เมื่อเปรียบเทียบ $c$ กับ $c''$
- $S_{10}$ โดยมี $N_{10}$ องค์ประกอบ: องค์ประกอบของคู่อยู่ในคลัสเตอร์เดียวกันใน $C$ และคลัสเตอร์ที่แตกต่างกันใน $C'$
- เสื้อแดงและเสื้อสีดำคู่หนึ่งจะต่ำกว่า $S_{10}$ เมื่อเปรียบเทียบ $c$ กับ $c''$
- $S_{01}$ โดยมี $N_{01}$ องค์ประกอบ: องค์ประกอบของคู่อยู่ในคลัสเตอร์ที่แตกต่างกันใน $C$ และคลัสเตอร์เดียวกันใน $C'$
- $S_{01}$ ไม่มีองค์ประกอบ ($N_{01} = 0$) เมื่อเปรียบเทียบ $c$ และ $c''$
ดัชนีแรนด์ ถูกกำหนดเป็น $(N_{00} + N_{11})/(n(n-1)/2)$ โดยที่ $n$ แทนจำนวนตัวอย่าง นอกจากนี้ยังสามารถอ่านได้เป็น (จำนวนคู่ที่ปฏิบัติในทำนองเดียวกัน)/(จำนวนคู่ทั้งหมด) แม้ว่าตามทฤษฎีแล้วค่าของมันจะอยู่ระหว่าง 0 ถึง 1 แต่ในทางปฏิบัติมักจะแคบกว่านั้นมาก ค่าที่สูงขึ้นหมายถึงความคล้ายคลึงกันมากขึ้นระหว่างการจัดกลุ่ม (ดัชนีแรนด์เท่ากับ 1 จะแสดงถึงการจับคู่ที่สมบูรณ์แบบโดยที่คลัสเตอร์สองกลุ่มมีคลัสเตอร์ที่เหมือนกัน)
ข้อจำกัดประการหนึ่งของดัชนีแรนด์คือพฤติกรรมเมื่อจำนวนคลัสเตอร์เพิ่มขึ้นเพื่อให้เข้าใกล้จำนวนองค์ประกอบ ในกรณีนี้ มันจะมาบรรจบกันเป็น 1 ทำให้เกิดความท้าทายในการวัดความคล้ายคลึงของคลัสเตอร์อย่างแม่นยำ มีการแนะนำดัชนี Rand เวอร์ชันที่ปรับปรุงหรือแก้ไขหลายเวอร์ชันเพื่อแก้ไขปัญหานี้ รูปแบบหนึ่งคือ ดัชนีแรนด์ ที่ปรับแล้ว อย่างไรก็ตาม ถือว่าการจัดกลุ่มสองกลุ่มถูกสุ่มโดยมีจำนวนกลุ่มและองค์ประกอบคลัสเตอร์คงที่
ทฤษฎีสารสนเทศ
เมตริกเหล่านี้อิงตามแนวคิดทั่วไปของทฤษฎีสารสนเทศ เราจะพูดถึงสองเรื่องนี้: เอนโทรปีและข้อมูลร่วมกัน (MI)
เอนโทรปีอธิบายจำนวนข้อมูลที่มีอยู่ในคลัสเตอร์ หากเอนโทรปีที่เกี่ยวข้องกับการจัดกลุ่มเป็น 0 แสดงว่าไม่มีความไม่แน่นอนเกี่ยวกับคลัสเตอร์ของกลุ่มตัวอย่างที่สุ่มเลือก ซึ่งจะเป็นจริงเมื่อมีคลัสเตอร์เพียงกลุ่มเดียว
MI อธิบายว่าคลัสเตอร์หนึ่งให้ข้อมูลมากเพียงใดเกี่ยวกับอีกกลุ่มหนึ่ง MI สามารถระบุได้ว่าการรู้กลุ่มตัวอย่างใน $C$ ช่วยลดความไม่แน่นอนเกี่ยวกับกลุ่มตัวอย่างใน $C'$ ได้มากเพียงใด
ข้อมูลร่วมกัน ที่ทำให้เป็นมาตรฐานคือ MI ที่ถูกทำให้เป็นมาตรฐานโดยค่าเฉลี่ยทางเรขาคณิตหรือเลขคณิตของเอนโทรปีของการจัดกลุ่ม MI มาตรฐานไม่ได้ผูกมัดด้วยค่าคงที่ ดังนั้นข้อมูลร่วมกันที่เป็นมาตรฐานจึงทำให้มีการวัดคลัสเตอร์ที่ตีความได้มากกว่า
เมตริกที่ได้รับความนิยมอีกอย่างหนึ่งในหมวดหมู่นี้คือ รูปแบบข้อมูล (VI) ที่ขึ้นอยู่กับเอนโทรปีและ MI ของการจัดกลุ่ม ให้ $H(C)$ เป็นเอนโทรปีของการทำคลัสเตอร์ และ $I(C, C')$ เป็น MI ระหว่างสองคลัสเตอร์ VI ระหว่างสองคลัสเตอร์สามารถกำหนดเป็น $VI(C,C') = H(C)+H(C')-2I(C,C')$ VI ของ 0 แสดงถึงการจับคู่ที่สมบูรณ์แบบระหว่างสองคลัสเตอร์
ตั้งค่าทับซ้อนกัน
ตั้งค่าเมตริกการทับซ้อนเกี่ยวข้องกับการกำหนดการจับคู่ที่ดีที่สุดสำหรับคลัสเตอร์ใน $C$ กับคลัสเตอร์ใน $C'$ โดยพิจารณาจากการทับซ้อนสูงสุดระหว่างคลัสเตอร์ สำหรับเมตริกทั้งหมดในหมวดหมู่นี้ 1 หมายถึงการจัดกลุ่มเหมือนกัน
การ วัดการจับคู่สูงสุด จะสแกนเมทริกซ์ความสับสนในลำดับที่ลดลงและจับคู่รายการที่ใหญ่ที่สุดของเมทริกซ์ความสับสนก่อน จากนั้นจะลบคลัสเตอร์ที่ตรงกันและทำซ้ำขั้นตอนตามลำดับจนกว่าคลัสเตอร์จะหมด
F-measure เป็นอีกหนึ่งชุดเมตริกที่ทับซ้อนกัน ต่างจากการวัดที่ตรงกันสูงสุด การวัด F มักถูกใช้เพื่อเปรียบเทียบการจัดกลุ่มกับโซลูชันที่เหมาะสมที่สุด แทนที่จะเปรียบเทียบสองคลัสเตอร์
การใช้เมตริกการจัดกลุ่มด้วย F-measure
เนื่องจากการใช้งานทั่วไปของ F-measure ในโมเดลการเรียนรู้ของเครื่องและแอปพลิเคชันที่สำคัญ เช่น เสิร์ชเอ็นจิ้น เราจะสำรวจรายละเอียดเพิ่มเติมเกี่ยวกับการวัด F ด้วยตัวอย่าง
F-measure นิยาม
สมมติว่า $C$ เป็นความจริงพื้นฐานของเรา หรือทางออกที่ดีที่สุด สำหรับคลัสเตอร์ $k$th ใน $C$ โดยที่ $k \in [1, K]$ เราจะคำนวณ F-measure แต่ละรายการกับทุกคลัสเตอร์ในผลลัพธ์การจัดกลุ่ม $C'$ F-measure แต่ละรายการนี้บ่งชี้ว่าคลัสเตอร์ $C^\prime_{k'}$ อธิบายคลัสเตอร์ $C_k$ ได้ดีเพียงใด และสามารถกำหนดได้ผ่านความแม่นยำและการเรียกคืน (เมทริกการประเมินโมเดลสองตัว) สำหรับคลัสเตอร์เหล่านี้ มากำหนด $I_{kk'}$ เป็นจุดตัดขององค์ประกอบในคลัสเตอร์ $k$th ของ $C$ และคลัสเตอร์ $k'$th ของ $C'$ และ $\lvert C_k \rvert$ เป็นตัวเลข ขององค์ประกอบในคลัสเตอร์ $k$th
ความแม่นยำ $p = \frac{I_{kk'}}{\lvert C'_{k'} \rvert}$
เรียกคืน $r = \frac{I_{kk'}}{\lvert C_{k} \rvert}$
จากนั้น การวัด F แต่ละรายการของคลัสเตอร์ $k$th และ $k'$th สามารถคำนวณเป็นค่าเฉลี่ยฮาร์มอนิกของความแม่นยำและการเรียกคืนสำหรับคลัสเตอร์เหล่านี้:
\[F_{kk'} = \frac{2rp}{r+p} = \frac{2I_{kk'}}{|C_k|+|C'_{k'}|}\]ทีนี้ เพื่อเปรียบเทียบ $C$ กับ $C'$ มาดูที่ F-measure โดยรวมกัน ขั้นแรก เราจะสร้างเมทริกซ์ที่คล้ายกับตารางฉุกเฉินซึ่งมีค่าเป็นการวัด F แต่ละรายการของคลัสเตอร์ สมมติว่าเราได้จับคู่คลัสเตอร์ของ $C$ เป็นแถวของตารางและคลัสเตอร์ของ $C'$ เป็นคอลัมน์ โดยมีค่าตารางที่สอดคล้องกับการวัด F แต่ละรายการ ระบุคู่คลัสเตอร์ที่มีการวัดค่า F สูงสุดแต่ละรายการ และลบแถวและคอลัมน์ที่สอดคล้องกับคลัสเตอร์เหล่านี้ ทำซ้ำจนกว่าคลัสเตอร์จะหมด สุดท้าย เราสามารถกำหนด F-measure โดยรวมได้:
\[F(C, C') = \frac{1}{n} \sum_{i=1}^K n_imax(F(C_i, C'_j)) \forall j \in {1, K'}\ ]อย่างที่คุณเห็น การวัด F โดยรวมคือผลรวมถ่วงน้ำหนักของการวัด F แต่ละรายการสูงสุดของเราสำหรับคลัสเตอร์
การตั้งค่าข้อมูลและผลลัพธ์ที่คาดหวัง
โน้ตบุ๊ก Python ใดๆ ที่เหมาะสำหรับการเรียนรู้ของเครื่อง เช่น โน้ตบุ๊ก Jupyter จะทำงานเป็นสภาพแวดล้อมของเรา ก่อนที่เราจะเริ่ม คุณอาจต้องการตรวจสอบ README ของที่เก็บ GitHub ไฟล์ตัวอย่าง readme_help_example.ipynb
แบบขยาย และไฟล์ requirements.txt
(ไลบรารีที่จำเป็น)
เราจะใช้ข้อมูลตัวอย่างในที่เก็บ GitHub ซึ่งประกอบด้วยบทความข่าว ข้อมูลถูกจัดเรียงด้วยข้อมูล ได้แก่ category
, headline
, date
และ short_description
:
หมวดหมู่ | พาดหัวข่าว | วันที่ | คำอธิบายสั้น | |
---|---|---|---|---|
49999 | โลกโพสต์ | สงครามยาเสพติดมีผู้เสียชีวิตถึง 1,800 คนในฟิลิปปินส์ | 2016-08-22 | ในช่วงเจ็ดสัปดาห์ที่ผ่านมาเพียงอย่างเดียว |
49966 | รสชาติ | ใช่ คุณสามารถทำกาแฟสไตล์คิวบาแท้ๆ ได้ที่บ้าน | 2016-08-22 | มันคือทั้งหมดที่เกี่ยวกับครีม |
49965 | สไตล์ | ครีมกันแดดกลิ่นไก่ทอดของ KFC Will Kee... | 2016-08-22 | เมื่อคุณต้องการทำให้ตัวเองหอมฟุ้ง… |
49964 | การเมือง | HUFFPOLLSTER: พรรคเดโมแครตมีโอกาสที่แข็งแกร่งของ ... | 2016-08-22 | โมเดลแบบสำรวจความคิดเห็นของ HuffPost บ่งชี้ว่า Senate R... |
เราสามารถใช้แพนด้าในการอ่าน วิเคราะห์ และจัดการข้อมูลได้ เราจะจัดเรียงข้อมูลตามวันที่และเลือกตัวอย่างเล็กๆ (10,000 หัวข้อข่าว) สำหรับการสาธิตของเรา เนื่องจากชุดข้อมูลทั้งหมดมีขนาดใหญ่:
import pandas as pd df = pd.read_json("./sample_data/example_news_data.json", lines=True) df.sort_values(by='date', inplace=True) df = df[:10000] len(df['category'].unique())
เมื่อทำงาน คุณควรเห็นโน้ตบุ๊กแสดงผลลัพธ์เป็น 30 เนื่องจากมี 30 หมวดหมู่ในตัวอย่างข้อมูลนี้ คุณยังสามารถเรียกใช้ df.head(4)
เพื่อดูว่าข้อมูลถูกจัดเก็บอย่างไร (ควรตรงกับตารางที่แสดงในส่วนนี้)
การเพิ่มประสิทธิภาพคุณลักษณะการจัดกลุ่ม
ก่อนที่จะใช้การจัดกลุ่ม เราควรประมวลผลข้อความล่วงหน้าเพื่อลดคุณลักษณะที่ซ้ำซ้อนของแบบจำลองของเรา ซึ่งรวมถึง:
- กำลังปรับปรุงข้อความให้มีตัวพิมพ์สม่ำเสมอ
- การลบตัวเลขหรืออักขระพิเศษ
- ดำเนินการ lemmatization
- การลบคำหยุด
import re import nltk from nltk.corpus import stopwords from nltk.stem import WordNetLemmatizer wordnet_lemmatizer = WordNetLemmatizer() nltk.download('stopwords') stop_words = stopwords.words('english') nltk.download('wordnet') nltk.download('omw-1.4') def preprocess(text: str) -> str: text = text.lower() text = re.sub('[^az]',' ',text) text = re.sub('\s+', ' ', text) text = text.split(" ") words = [wordnet_lemmatizer.lemmatize(word, 'v') for word in text if word not in stop_words] return " ".join(words) df['processed_input'] = df['headline'].apply(preprocess)
พาดหัวที่ประมวลผลล่วงหน้าที่เป็นผลลัพธ์จะแสดงเป็น processed_input
ซึ่งคุณสามารถสังเกตได้โดยการเรียกใช้อีกครั้ง df.head(4)
:
หมวดหมู่ | พาดหัวข่าว | วันที่ | คำอธิบายสั้น | ประมวลผล_input | |
---|---|---|---|---|---|
49999 | โลกโพสต์ | สงครามยาเสพติดมีผู้เสียชีวิตถึง 1,800 คนในฟิลิปปินส์ | 2016-08-22 | ในช่วงเจ็ดสัปดาห์ที่ผ่านมาเพียงอย่างเดียว | ผู้เสียชีวิตจากสงครามยาเสพติดปีนขึ้นไปในฟิลิปปินส์ |
49966 | รสชาติ | ใช่ คุณสามารถทำกาแฟสไตล์คิวบาแท้ๆ ได้ที่บ้าน | 2016-08-22 | มันคือทั้งหมดที่เกี่ยวกับครีม | ใช่ทำกาแฟสไตล์คิวบาแท้ๆที่บ้าน |
49965 | สไตล์ | ครีมกันแดดกลิ่นไก่ทอดของ KFC Will Kee... | 2016-08-22 | เมื่อคุณต้องการทำให้ตัวเองหอมฟุ้ง… | ครีมกันแดดกลิ่นไก่ทอดเคเอฟซี ให้ผิวเ… |
49964 | การเมือง | HUFFPOLLSTER: พรรคเดโมแครตมีโอกาสที่แข็งแกร่งของ ... | 2016-08-22 | โมเดลแบบสำรวจความคิดเห็นของ HuffPost บ่งชี้ว่า Senate R... | พรรคเดโมแครต huffpollster คว้าโอกาสคืนวุฒิสภา |
ตอนนี้ เราต้องแสดงพาดหัวแต่ละบรรทัดเป็นเวกเตอร์ตัวเลข เพื่อให้สามารถใช้โมเดลแมชชีนเลิร์นนิงกับมันได้ มีเทคนิคการแยกคุณลักษณะต่างๆ เพื่อให้บรรลุสิ่งนี้ เราจะใช้ TF-IDF (ระยะความถี่-ความถี่เอกสารผกผัน) เทคนิคนี้ช่วยลดผลกระทบของคำที่เกิดความถี่สูงในเอกสาร (ในตัวอย่างของเราคือพาดหัวข่าว) เนื่องจากสิ่งเหล่านี้ไม่ควรเป็นคุณลักษณะในการตัดสินใจในการจัดกลุ่มหรือจัดหมวดหมู่อย่างชัดเจน
from sklearn.cluster import AgglomerativeClustering, KMeans from sklearn.feature_extraction.text import TfidfVectorizer vectorizer = TfidfVectorizer(max_features=300, tokenizer=lambda x: x.split(' ')) tfidf_mat = vectorizer.fit_transform(df['processed_input']) X = tfidf_mat.todense() X[X==0]=0.00001
ต่อไป เราจะลองใช้วิธีการจัดกลุ่มแรกของเรา การทำคลัสเตอร์แบบรวมกลุ่ม บนเวกเตอร์คุณลักษณะเหล่านี้
วิธีการจัดกลุ่ม 1: การทำคลัสเตอร์แบบรวมกลุ่ม
เมื่อพิจารณาจากหมวดหมู่ข่าวที่กำหนดเป็นวิธีแก้ปัญหาที่ดีที่สุด ให้เปรียบเทียบผลลัพธ์เหล่านี้กับผลลัพธ์ของการจัดกลุ่มแบบรวมกลุ่ม (โดยมีจำนวนคลัสเตอร์ที่ต้องการเท่ากับ 30 เนื่องจากมี 30 หมวดหมู่ในชุดข้อมูล):
clusters_agg = AgglomerativeClustering(n_clusters=30).fit_predict(X) df['class_prd'] = clusters_agg.astype(int)
เราจะระบุคลัสเตอร์ที่เป็นผลลัพธ์ด้วยป้ายกำกับจำนวนเต็ม พาดหัวข่าวที่เป็นของคลัสเตอร์เดียวกันถูกกำหนดเลเบลจำนวนเต็มเดียวกัน ฟังก์ชันคลัสเตอร์ cluster_measure
จากโมดูล compare_clusters
ของที่เก็บ GitHub ของเราส่งคืนการวัด F รวมและจำนวนคลัสเตอร์ที่ตรงกันอย่างสมบูรณ์ เพื่อให้เราสามารถดูว่าผลลัพธ์การจัดกลุ่มของเราแม่นยำเพียงใด:
from clustering.compare_clusters import cluster_measure # 'cluster_measure` requires given text categories to be in the column 'text_category` df['text_category'] = df['category'] res_df, fmeasure_aggregate, true_matches = cluster_measure(df, gt_column='class_gt') fmeasure_aggregate, len(true_matches) # Outputs: (0.19858339749319176, 0)
ในการเปรียบเทียบผลลัพธ์ของคลัสเตอร์เหล่านี้กับโซลูชันที่เหมาะสมที่สุด เราได้ F-measure ต่ำที่ 0.198 และ 0 คลัสเตอร์ที่ตรงกับกลุ่มคลาสจริง แสดงให้เห็นว่าคลัสเตอร์ที่รวมตัวกันไม่สอดคล้องกับหมวดหมู่พาดหัวที่เราเลือก ลองดูคลัสเตอร์ในผลลัพธ์เพื่อดูว่าเป็นอย่างไร
df[df['class_prd'] == 0]['category'].value_counts()
เมื่อตรวจสอบผลลัพธ์แล้ว เราพบว่าคลัสเตอร์นี้มีหัวข้อข่าวจากหมวดหมู่ทั้งหมด:
POLITICS 1268 ENTERTAINMENT 712 THE WORLDPOST 373 HEALTHY LIVING 272 QUEER VOICES 251 PARENTS 212 BLACK VOICES 211 ... FIFTY 24 EDUCATION 23 COLLEGE 14 ARTS 13
ดังนั้น การวัดค่า F ต่ำจึงสมเหตุสมผลเมื่อพิจารณาว่าคลัสเตอร์ของผลลัพธ์ไม่สอดคล้องกับโซลูชันที่เหมาะสมที่สุด อย่างไรก็ตาม สิ่งสำคัญคือต้องระลึกว่าการจัดหมวดหมู่หมวดหมู่ที่เราเลือกนั้นสะท้อนถึงการแบ่งชุดข้อมูลที่เป็นไปได้เพียงส่วนเดียว การวัดค่า F ต่ำในที่นี้ไม่ได้หมายความว่าผลลัพธ์ของการจัดกลุ่มผิด แต่ผลลัพธ์ของการจัดกลุ่มไม่ตรงกับวิธีการแบ่งพาร์ติชั่นข้อมูลที่ต้องการ
วิธีการจัดกลุ่ม 2: K-means
ลองใช้อัลกอริธึมการจัดกลุ่มยอดนิยมอื่นในชุดข้อมูลเดียวกัน: k-means clustering เราจะสร้าง dataframe ใหม่และใช้ฟังก์ชัน cluster_measure
อีกครั้ง:
kmeans = KMeans(n_clusters=30, random_state=0).fit(X) df2 = df.copy() df2['class_prd'] = kmeans.predict(X).astype(int) res_df, fmeasure_aggregate, true_matches = cluster_measure(df2) fmeasure_aggregate, len(true_matches) # Outputs: (0.18332960871141976, 0)
เช่นเดียวกับผลการจัดกลุ่มแบบ agglomerative ผลการจัดกลุ่ม k-mean ของเราได้สร้างคลัสเตอร์ที่ไม่เหมือนกับหมวดหมู่ที่เรากำหนด: มีการวัด F ที่ 0.18 เมื่อเปรียบเทียบกับโซลูชันที่เหมาะสมที่สุด เนื่องจากผลการจัดกลุ่มทั้งสองมีการวัด F ที่คล้ายคลึงกัน จึงเป็นเรื่องที่น่าสนใจที่จะเปรียบเทียบกัน เรามีคลัสเตอร์อยู่แล้ว เราก็แค่ต้องคำนวณค่า F อันดับแรก เราจะนำผลลัพธ์ทั้งสองมารวมกันเป็นคอลัมน์เดียว โดย class_gt
มีเอาต์พุตการรวมกลุ่ม และ class_prd
มีเอาต์พุตการจัดกลุ่ม k-means:
df1 = df2.copy() df1['class_gt'] = df['class_prd'] res_df, fmeasure_aggregate, true_matches = cluster_measure(df1, gt_column='class_gt') fmeasure_aggregate, len(true_matches) # Outputs: (0.4030316435020922, 0)
ด้วยการวัด F ที่สูงกว่า 0.4 เราสามารถสังเกตได้ว่าการจัดกลุ่มของอัลกอริธึมทั้งสองมีความคล้ายคลึงกันมากกว่าที่จะเป็นโซลูชันที่เหมาะสมที่สุด
ค้นพบเพิ่มเติมเกี่ยวกับผลลัพธ์การจัดกลุ่มที่ปรับปรุงแล้ว
การทำความเข้าใจเมตริกการเปรียบเทียบการจัดกลุ่มที่มีอยู่จะช่วยขยายการวิเคราะห์แบบจำลองการเรียนรู้ของเครื่อง เราได้เห็นการทำงานจริงของการวัดคลัสเตอร์ F-measure และได้ให้พื้นฐานที่คุณต้องใช้การเรียนรู้เหล่านี้กับผลลัพธ์การจัดกลุ่มครั้งต่อไปของคุณ หากต้องการเรียนรู้เพิ่มเติม นี่คือตัวเลือกอันดับต้น ๆ ของฉันสำหรับการอ่านเพิ่มเติม:
- การเปรียบเทียบคลัสเตอร์ - ภาพรวม โดย Dorothea Wagner และ Silke Wagner
- การเปรียบเทียบการจัดกลุ่ม—ระยะทางตามข้อมูล โดย Marina Meila
- ข้อมูลการวัดเชิงทฤษฎีสำหรับการเปรียบเทียบการจัดกลุ่ม: ตัวแปร คุณสมบัติ การทำให้เป็นมาตรฐาน และการแก้ไขเพื่อโอกาส โดย Nguyen Xuan Vinh, Julien Epps และ James Bailey
อ่านเพิ่มเติมในบล็อก Toptal Engineering:
- กราฟวิทยาศาสตร์ข้อมูลด้วย Python/NetworkX
- การจัดประเภทรูปภาพกึ่งควบคุมด้วยข้อมูลที่ไม่มีป้ายกำกับ
- การฝังในแมชชีนเลิร์นนิง: ทำให้ข้อมูลที่ซับซ้อนง่ายขึ้น
บล็อก Toptal Engineering ขอขอบคุณ Luis Bronchal สำหรับการตรวจสอบตัวอย่างโค้ดที่นำเสนอในบทความนี้