Saya sedang mengerjakan klasifikasi teks di mana saya memiliki 39 kategori / kelas dan 8,5 juta catatan. (Dalam data dan kategori masa depan akan meningkat).
Struktur atau format data saya adalah sebagai berikut.
----------------------------------------------------------------------------------------
| 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
Distribusi data tidak normal; sangat tidak seimbang:
-------------------------
| 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
Seperti yang Anda lihat mereka sangat tidak seimbang dan mengarah ke klasifikasi yang salah.
Langkah yang saya lakukan sampai sekarang
1) Gabungkan kolom product_title dan key_value_pairs dan hapus kata berhenti dan karakter khusus dan lakukan stemming.
2) Saya telah menggunakan pipa untuk TFIDFvectorizer (), LinearSVC ()
vectorizerPipe = Pipeline([
('tfidf', TfidfVectorizer(lowercase=True, stop_words='english')),
('classification', OneVsRestClassifier(LinearSVC(penalty='l2', loss='hinge'))),
])
Setelah ini saya memiliki pipa yang sesuai dan menyimpan classifier di acar
prd = vectorizerPipe.fit(df.loc[:, 'description'], df.loc[:, 'taxonomy_id'])
Di sisi Pengujian saya telah mengulangi langkah 1 seperti yang disebutkan di atas dan kemudian memuat acar dan menggunakan fungsi prediksi
pd = cl.predict([testData])
Masalah yang saya hadapi
Banyak produk yang salah diklasifikasikan ke dalam beberapa kategori lainnya
Contoh: Ultimate Nutrition Prostar 100% Whey Protein harus diklasifikasikan ke dalam kategori 311 tetapi classifier saya mengklasifikasikannya sebagai 222 yang benar-benar salah.
Saya tidak yakin apakah akan menggunakan TFidfVectorizer () atau Hashingvectorizer (), bisakah kalian membantu saya dalam memilih salah satu dari ini bersama dengan parameter mereka?
Algoritma yang saya gunakan adalah LinearSVC, apakah itu pilihan yang baik untuk masalah klasifikasi multi-kelas dengan sejumlah besar data? Atau haruskah saya menggunakan algoritma yang berbeda?
Karena data saya sangat tidak seimbang, saya mencoba undersampling acak. Hasilnya ditingkatkan tetapi mereka masih belum mencapai sasaran. Saya juga tidak yakin apakah ini pendekatan yang tepat untuk melakukan undersampling acak:
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')))
Saya baru dalam pembelajaran mesin jadi saya telah menggunakan pendekatan ini untuk klasifikasi teks. Jika pendekatan saya salah maka tolong perbaiki saya dengan yang benar.
(Alangkah baiknya jika Anda memberi saran atau solusi dengan contoh karena akan membantu saya memahami lebih baik).
*** EDIT-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)