การจัดหมวดหมู่ข้อความ: รวมคุณสมบัติที่แตกต่าง


19

ปัญหาที่ฉันแก้ปัญหาคือการจัดหมวดหมู่ข้อความสั้น ๆ เป็นหลายคลาส วิธีการปัจจุบันของฉันคือการใช้ความถี่เทอม tf-idf และเรียนรู้ลักษณนามเชิงเส้นอย่างง่าย (การถดถอยโลจิสติก) วิธีนี้ใช้ได้ดีพอสมควร (มาโคร 90% F-1 ในชุดทดสอบเกือบ 100% สำหรับชุดฝึกอบรม) ปัญหาใหญ่คือสิ่งที่มองไม่เห็นคำ / n-g

ฉันพยายามปรับปรุงตัวจําแนกโดยการเพิ่มคุณสมบัติอื่น ๆ เช่นเวกเตอร์ขนาดคงที่ที่คำนวณโดยใช้ความคล้ายคลึงกันแบบกระจาย (ตามที่คำนวณโดย word2vec) หรือคุณสมบัติหมวดหมู่อื่น ๆ ของตัวอย่าง ความคิดของฉันคือการเพิ่มคุณสมบัติให้กับคุณสมบัติการป้อนข้อมูลแบบเบาบางจากถุงคำ อย่างไรก็ตามผลลัพธ์นี้มีประสิทธิภาพที่แย่ลงในชุดการทดสอบและการฝึกอบรม คุณสมบัติเพิ่มเติมด้วยตัวเองให้ประมาณ 80% F-1 ในชุดทดสอบดังนั้นพวกเขาจึงไม่ขยะ การขยายคุณสมบัติไม่ได้ช่วยเช่นกัน ความคิดปัจจุบันของฉันคือคุณสมบัติเหล่านี้ไม่เข้ากันได้ดีกับคุณลักษณะถุงคำ (เบาบาง)

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


3
อัปเดตบางอย่าง: ฉันสามารถรับผลลัพธ์ที่ยอมรับได้โดย l2-normalizing เวกเตอร์ที่หนาแน่นเพิ่มเติม ฉันถือว่าผิด StandardScaler sklearn จะทำอย่างนั้น ฉันยังคงมองหาวิธีการที่ซับซ้อนมากขึ้นซึ่งจะช่วยให้ฉันสามารถสร้างแบบจำลองการอ้างอิงฉลากหรือรวมความมั่นใจของตัวแยกประเภทย่อย
elmille

ฉันกำลังทำการทดลองขั้นพื้นฐานเมื่อปีที่แล้วและพบปัญหาเดียวกันกับที่คุณมี word2vec เวกเตอร์ของคุณหลังจากกระบวนการ l2-normalizing สามารถเอาชนะ BOW ได้หรือไม่? ฉันยังไม่ได้ทำ l2-normalizing แต่แม้หลังจากการทดสอบวิธีการประมวลผลโพสต์ความหมายหลายเวกเตอร์ยังคงเป็น 2-4 เปอร์เซ็นต์แน่นอนหลังคุณสมบัติ BOW tf / idf ฉันสงสัยว่าเป็นทิศทางที่เป็นอันตราย การค้นหาดั้งเดิมของฉันคือการรวมเวกเตอร์ความหมายที่หนาแน่นกับ BOW แบบดั้งเดิมและดูว่ามันสามารถปรับปรุงการจำแนกประเภทหัวข้อ / การสร้างแบบจำลอง BTW: ชุดข้อมูลใดที่คุณทำงานอยู่เหมืองของฉันคือ 20newsgroup

ฉันทำงานกับชุดข้อมูลสำหรับการแข่งขัน CIKM 2014 สำหรับฉันการแทนเวกเตอร์ไม่สามารถเอาชนะ BOW ด้วยน้ำหนัก tf-idf ได้ แผนของฉันคือการใช้พวกเขานอกเหนือจากการปรับปรุงคุณภาพ จากประสบการณ์ของฉัน (สำหรับการจำแนกข้อความ) รูปแบบของ tf-idf + รูปแบบเชิงเส้นที่มี n-g เป็นวิธีที่แข็งแกร่งมาก ขณะนี้ฉันกำลังทดลองกับโครงข่ายประสาทเทียมและแม้กระทั่งกับโมเดลที่ซับซ้อนเหล่านี้ (มากหรือน้อย) ที่เข้าใกล้ยากที่จะเอาชนะ
elmille

ถึง Mod: ขออภัยที่ฉันไม่มีชื่อเสียง 50 คนดังนั้นฉันจึงไม่สามารถเขียนลงในช่องแสดงความคิดเห็นได้ สวัสดี elmille: ใช่นั่นคือสิ่งที่ฉันพบในการทดสอบทั้งหมด อย่างไรก็ตามคุณพบว่าคำว่า vec + BOW ช่วยคุณได้หรือไม่? จากประสบการณ์ของฉันเมื่อฉันเชื่อมคำ vec กับ BOW tf-idf (ในกรณีของฉัน vec นี้เป็นเวกเตอร์โดยรวมภายในบทความทั้งหมดไม่ใช่ของคำ vec แต่คล้ายกันมาก) ประสิทธิภาพลดลง ฉันคิดว่ามันควรจะเป็น BOW + vec> BOW> vec เนื่องจากมีข้อมูลผู้ช่วยซึ่งกันและกัน ผลลัพธ์ที่แท้จริงคือ BOW> vec> BOW + vec จากนั้นฉันทำการปรับขนาดมาตรฐานและการทำให้เป็นมาตรฐานเพื่อคำนับและ vec ใน

คำตอบ:


13

หากฉันเข้าใจอย่างถูกต้องคุณจะมีคุณสมบัติสองรูปแบบสำหรับแบบจำลองของคุณ (1) ข้อมูลตัวอักษรที่คุณแสดงเป็นคำที่กระจัดกระจายและ (2) คุณสมบัติที่หนาแน่นกว่าเดิม หากเป็นกรณีนั้นมีวิธีการทั่วไป 3 วิธี:

  1. ทำการลดขนาด (เช่น LSA ผ่านTruncatedSVD) บนข้อมูลที่กระจัดกระจายของคุณเพื่อทำให้มันหนาแน่นและรวมคุณสมบัติต่างๆเข้ากับเมทริกซ์หนาแน่นเดียวเพื่อฝึกโมเดลของคุณ
  2. เพิ่มคุณสมบัติความหนาแน่นไม่กี่ตัวลงในเมทริกซ์กระจัดกระจายของคุณโดยใช้บางสิ่งบางอย่างเช่น scipy hstackลงในเมทริกซ์กระจัดกระจายเดียวเพื่อฝึกโมเดลของคุณ
  3. สร้างแบบจำลองโดยใช้เพียงข้อมูลข้อความที่กระจัดกระจายของคุณแล้วรวมการคาดการณ์ (ความน่าจะเป็นถ้าการจำแนกประเภท) เป็นคุณลักษณะที่หนาแน่นกับคุณลักษณะที่หนาแน่นอื่น ๆ ของคุณเพื่อสร้างแบบจำลอง (เช่น: ตระการตาผ่านการวางซ้อน) หากคุณไปเส้นทางนี้อย่าลืมใช้การคาดคะเน CV เป็นคุณสมบัติในการฝึกอบรมโมเดลของคุณมิฉะนั้นคุณจะมีแนวโน้มที่จะไม่เหมาะสม (คุณสามารถสร้างคลาสให้ทำได้ทั้งหมดภายในครั้งเดียวPipelineหากต้องการ)

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

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


10

ตัวแบบเชิงเส้นเพิ่มคุณสมบัติของพวกเขาคูณด้วยน้ำหนักที่สอดคล้องกัน ตัวอย่างเช่นหากคุณมีคุณสมบัติเบาบาง 1,000 รายการเพียง 3 หรือ 4 แห่งเท่านั้นที่มีการใช้งานในแต่ละอินสแตนซ์ (และอื่น ๆ เป็นศูนย์) และ 20 คุณสมบัติหนาแน่นที่ไม่ใช่ศูนย์ทั้งหมดดังนั้นจึงเป็นไปได้ว่าคุณลักษณะที่หนาแน่นจะทำให้ ผลกระทบในขณะที่คุณสมบัติเบาบางจะเพิ่มมูลค่าเพียงเล็กน้อยเท่านั้น คุณสามารถตรวจสอบสิ่งนี้ได้โดยดูที่คุณลักษณะน้ำหนักสำหรับสองสามกรณีและวิธีที่มันมีผลต่อผลรวมของผลลัพธ์

วิธีหนึ่งในการแก้ไขคือการออกไปจากรุ่นเสริม นี่คือโมเดลผู้สมัครสองสามแบบ

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

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

ในที่สุดป่าสุ่มอาจใช้เป็นวิธีการวงดนตรีที่ดีในกรณีนี้ การสุ่มตัวอย่างจะทำให้แน่ใจว่าจะใช้คุณสมบัติต่าง ๆ (กระจัดกระจาย / หนาแน่น) เป็นโหนดการตัดสินใจหลักในต้นไม้ที่แตกต่างกัน ต้นไม้ RF / การตัดสินใจยังดีสำหรับการตรวจสอบคุณสมบัติด้วยตนเองดังนั้นจึงควรสังเกตโครงสร้างของมันด้วย

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


ขอบคุณสำหรับคำตอบ! ฉันมีคำถามติดตามสองคำถาม :) 1) SVM (ที่มีเคอร์เนลเชิงเส้น) และ Naive Bayes แตกต่างกันอย่างไรโดยที่พวกเขาไม่ได้สรุปคุณลักษณะและน้ำหนักที่สอดคล้องกันของพวกเขา (เช่นสิ่งที่คุณเรียกว่า ทั้งสองอย่างมีประสิทธิภาพสร้างไฮเพอร์เพลชันแบบแยกดังนั้นผลลัพธ์จะไม่เพิ่มคุณสมบัติบางอย่างคูณด้วยน้ำหนักที่สอดคล้องกันหรือไม่ 2) ฉันต้องการลองใช้ฟอเรสต์แบบสุ่ม แต่น่าเสียดายที่พื้นที่ฟีเจอร์นั้นใหญ่เกินไปที่จะแสดงในรูปแบบหนาแน่น (ฉันใช้ sklearn) มีการใช้งานที่สามารถจัดการได้หรือไม่
elmille

1) ในการถดถอยเชิงเส้นคุณมีความสนใจในจุดบนไฮเปอร์เพลนดังนั้นคุณจึงเพิ่มคุณสมบัติที่มีน้ำหนักเพื่อรับจุดที่ทำนายไว้ ใน SVM ตรงกันข้ามคุณกำลังมองหาจุดที่ด้านข้างของไฮเปอร์เพลน คุณจัดหมวดหมู่โดยการตรวจสอบอย่างง่าย ๆ ว่าด้านใดเป็นตัวอย่างของคุณไม่มีการสรุปรวมที่เกี่ยวข้องในระหว่างการทำนาย Naive Bayes อาจรวมรูปแบบต่าง ๆ (เช่นทวินามหรือพหุนาม) แต่โดยทั่วไปแล้วคุณมีความน่าจะเป็นทวีคูณ
แฟน

2) ฉันเคยเห็นงานวิจัยบางอย่างในหัวข้อนี้ แต่ไม่เคยพบการใช้งาน (อาจเป็น googling จะให้ลิงค์ที่นี่) อย่างไรก็ตามคุณสามารถไปได้อีกทางหนึ่ง - ลดขนาดด้วยพูด PCA แล้วเรียกใช้ฟอเรสต์แบบสุ่มโดยยึดตามชุดข้อมูลที่ลดลง
แฟน
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.