ฉันทำงานเกี่ยวกับการจำแนกข้อความที่ฉันมี 39 หมวดหมู่ / คลาสและ 8.5 ล้านบันทึก (ในอนาคตข้อมูลและหมวดหมู่จะเพิ่มขึ้น)
โครงสร้างหรือรูปแบบของข้อมูลของฉันมีดังนี้
----------------------------------------------------------------------------------------
| product_title | Key_value_pairs | taxonomy_id |
----------------------------------------------------------------------------------------
Samsung S7 Edge | Color:black,Display Size:5.5 inch,Internal | 211
Storage:128 GB, RAM:4 GB,Primary Camera:12 MP
Case cover Honor 8 | Color:transparent,Height:15 mm,width:22 mm | 212
Ruggers Men's T-Shirt | Size:L,ideal for:men,fit:regular, | 111
sleeve:half sleeve
Optimum Nutrition Gold | Flavor:chocolate,form:powder,size:34 gm | 311
Standard Whey Protein
การกระจายข้อมูลไม่ปกติ มันไม่สมดุลอย่างมาก:
-------------------------
| taxonomy_id | count |
-------------------------
111 | 851750
112 | 355592
113 | 379433
114 | 23138
115 | 117735
116 | 145757
117 | 1339471
121 | 394026
122 | 193433
123 | 78299
124 | 111962
131 | 1776
132 | 4425
133 | 908
134 | 23062
141 | 22713
142 | 42073
211 | 7892
212 | 1574744
221 | 1047
222 | 397515
223 | 53009
231 | 1227
232 | 7683
251 | 739
252 | 327
253 | 38974
254 | 25
311 | 2901
321 | 7126
412 | 856
421 | 697802
422 | 414855
423 | 17750
425 | 1240
427 | 658
429 | 1058
431 | 20760
441 | 257
ในขณะที่คุณสามารถเห็นพวกเขามีความสมดุลสูงและนำไปสู่การจำแนกผิดพลาด
ขั้นตอนที่ฉันได้ดำเนินการจนถึงตอนนี้
1) ผสานคอลัมน์ product_title และ key_value_pairs และลบคำหยุดและอักขระพิเศษและทำการหยุดการทำงาน
2) ฉันได้ใช้ไปป์ไลน์สำหรับ TFIDFvectorizer (), LinearSVC ()
vectorizerPipe = Pipeline([
('tfidf', TfidfVectorizer(lowercase=True, stop_words='english')),
('classification', OneVsRestClassifier(LinearSVC(penalty='l2', loss='hinge'))),
])
หลังจากนี้ฉันมีท่อที่เหมาะสมและเก็บลักษณนามในดอง
prd = vectorizerPipe.fit(df.loc[:, 'description'], df.loc[:, 'taxonomy_id'])
ในด้านการทดสอบฉันได้ทำซ้ำขั้นตอนที่ 1 ดังกล่าวข้างต้นแล้วโหลดดองและใช้ฟังก์ชั่นการทำนาย
pd = cl.predict([testData])
ปัญหาที่ฉันกำลังเผชิญ
ผลิตภัณฑ์จำนวนมากถูกจัดประเภทผิดประเภท
ตัวอย่าง: Ultimate Nutrition Prostar 100% Whey Protein ควรแบ่งออกเป็นหมวดหมู่ 311 แต่ตัวจําแนกของฉันแบ่งเป็น 222 ซึ่งผิดทั้งหมด
ฉันไม่แน่ใจว่าจะใช้ TFidfVectorizer () หรือ Hashingvectorizer () พวกคุณช่วยฉันเลือกหนึ่งในนี้พร้อมกับพารามิเตอร์ได้หรือไม่?
อัลกอริทึมที่ฉันใช้เป็น LinearSVC เป็นตัวเลือกที่ดีสำหรับปัญหาการจำแนกประเภทหลายคลาสที่มีข้อมูลจำนวนมากหรือไม่? หรือฉันควรใช้อัลกอริทึมที่แตกต่างกันอย่างไร
เนื่องจากข้อมูลของฉันมีความไม่สมดุลสูงฉันจึงลองสุ่มตัวอย่างแบบสุ่ม ผลลัพธ์ได้รับการปรับปรุง แต่ก็ยังไม่ถึงมาตรฐาน นอกจากนี้ฉันไม่แน่ใจว่านี่เป็นวิธีการที่เหมาะสมในการทำการสุ่มตัวอย่างแบบสุ่มหรือไม่:
pipe = make_pipeline_imb( HashingVectorizer(lowercase=True), RandomUnderSampler(ratio={111: 405805, 112: 170431, 113: 241709, 114: 8341, 115: 50328, 116: 89445, 117: 650020, 121: 320803, 122: 162557, 123: 66156, 124: 36276, 131: 1196, 132: 3365, 133: 818, 134: 15001, 141: 6145, 142: 31783, 211: 24728, 212: 100000, 221: 791, 222: 8000, 223: 35406, 231: 785, 232: 3000, 251: 477, 252: 127, 253: 29563, 254: 33, 311: 2072, 321: 5370, 412: 652, 421: 520973, 422: 99171, 423: 16786, 425: 730, 427: 198, 429: 1249, 431: 13793, 441: 160},random_state=1), OneVsRestClassifier(LinearSVC(penalty='l2', loss='hinge')))
ฉันใหม่ในการเรียนรู้ของเครื่องดังนั้นฉันจึงใช้วิธีนี้สำหรับการจำแนกข้อความ หากวิธีการของฉันไม่ถูกต้องโปรดแก้ไขฉันด้วยวิธีที่ถูกต้อง
(มันจะดีมากถ้าคุณให้คำแนะนำหรือวิธีแก้ปัญหาพร้อมตัวอย่างเพราะมันจะช่วยให้ฉันเข้าใจได้ดีขึ้น)
*** แก้ไข-1 ****
RndmFrst = RandomForestClassifier(n_estimators=100, max_depth=20, max_features=5000,n_jobs=-1)
LogReg = LogisticRegression()
voting = VotingClassifier(estimators=[('LogReg ', LogReg), ('RndmFrst', RndmFrst)], voting='soft', n_jobs=-1)
pipe = Pipeline([('tfidf', TfidfVectorizer(ngram_range=(1,4), max_features=50000)), ('clf', voting)])
pipe = pipe.fit(df.loc[:,'description'], df.loc[:,'taxonomy_id'])
Preds = pipe.predict(test_data)