การระบุสิ่งที่ไม่รู้จักด้วยการวัดคลัสเตอร์

เผยแพร่แล้ว: 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''$:

เมทริกซ์เดียวกันสองชุดที่มีสองแถวและสี่คอลัมน์: "100, 200, 0, 0" ที่แถวบนสุด และ "0, 0, 200, 300" ที่แถวล่าง สำเนาที่สองมีป้ายชื่อแถวและคอลัมน์ที่มีเส้นขอบประ แถวบนสุดมีป้ายกำกับ "c1" พร้อมเส้นขอบสีน้ำเงินอ่อน และแถวล่างจะมีป้ายกำกับ "c2" พร้อมเส้นขอบสีน้ำเงินเข้ม คอลัมน์จากซ้ายไปขวา: "c''1" (เส้นขอบสีเขียวอ่อน), "c''2" (เส้นขอบสีเขียวปานกลาง), "c''3" (เส้นขอบสีเขียวเข้ม) และ "c''4 " (ขอบสีเทา). ในสำเนาที่สอง ลูกศรชี้ไปที่ 200 ซึ่งเป็นองค์ประกอบในแถวที่สองและคอลัมน์ที่สาม ที่ฐานของลูกศรนั้นคือ: "nkk' = ค่าสัมบูรณ์ของ Ck และ C'k': n23 = ค่าสัมบูรณ์ของ c2 และ c''3 = 200"

เนื่องจาก $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$ ก็แค่ชุดเสื้อแดง

เมทริกการจัดกลุ่มสามารถแบ่งออกกว้างๆ ได้เป็นสามกลุ่มตามวิธีการเปรียบเทียบคลัสเตอร์พื้นฐาน:

กล่อง "ตัววัดคลัสเตอร์" สีน้ำเงินเข้มชี้ไปที่สีเขียว "อิงจาก?" แคปซูลซึ่งชี้ไปที่กล่องสีฟ้าอ่อนสามกล่อง อย่างแรก "การนับคู่" มี "ดัชนีแรนด์" และ "ดัชนีแรนด์ที่ปรับแล้ว" อยู่ข้างใต้ ประการที่สอง "ทฤษฎีข้อมูล" มี "ข้อมูลร่วมกันที่ทำให้เป็นมาตรฐาน" และ "การเปลี่ยนแปลงของข้อมูล" อยู่ข้างใต้ สุดท้าย "ตั้งค่าทับซ้อนกัน" มี "การวัดที่ตรงกันสูงสุด" และ "การวัด F" ด้านล่าง

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

นับคู่

การนับคู่ต้องตรวจสอบตัวอย่างทุกคู่ จากนั้นจึงนับคู่ที่การจัดกลุ่มเห็นด้วยและไม่เห็นด้วย ตัวอย่างแต่ละคู่สามารถอยู่ในหนึ่งในสี่ชุด โดยที่องค์ประกอบชุดนั้นนับ ($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 สำหรับการตรวจสอบตัวอย่างโค้ดที่นำเสนอในบทความนี้