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)
Jawaban:
Pertanyaan bagus!
Beberapa komentar
Untuk data yang tidak seimbang Anda memiliki pendekatan yang berbeda. Yang paling mapan adalah resampling (Oversampling kelas kecil / underssampling kelas besar). Yang lain adalah membuat klasifikasi Anda hierarkis yaitu mengklasifikasikan kelas besar terhadap semua yang lain dan kemudian mengklasifikasikan kelas kecil di langkah kedua (pengklasifikasi tidak seharusnya sama. Cobalah strategi pemilihan model untuk menemukan yang terbaik).
Jawaban Praktis
Saya mendapat hasil yang dapat diterima tanpa melakukan resampling data! Jadi cobalah tetapi kemudian memperbaikinya menggunakan metode resampling (secara statistik mereka semacam HARUS).
TFIDF baik untuk masalah seperti itu. Pengklasifikasi harus dipilih melalui pemilihan model tetapi pengalaman saya menunjukkan bahwa Regresi Logistik dan Hutan Acak bekerja dengan baik pada masalah khusus ini (namun itu hanya pengalaman praktis).
Anda dapat mengikuti kode di bawah karena ini berfungsi dengan baik maka Anda dapat mencoba memodifikasinya untuk meningkatkan hasil Anda:
Harap dicatat bahwa kode ini abstrak sehingga TianX, TrainY, TestX, dll harus didefinisikan dengan benar oleh Anda.
Petunjuk
Hati-hati dengan apa itu StopWord. Praktis banyak orang (termasuk saya sendiri!) Membuat kesalahan ini dengan menghapus kata-kata berhenti sesuai dengan daftar yang telah ditentukan. Itu tidak benar!
Stop words sensitif terhadap corpus sehingga Anda perlu menghapus stopwords sesuai dengan konsep teori informasi (untuk membuatnya sederhana, Anda perlu tahu jenis TFIDF mengabaikan stopword khusus corpus Anda. Jika Anda perlu penjelasan lebih lanjut, silakan beri tahu saya untuk memperbarui jawaban saya) .
VotingClassifier adalah strategi meta-learning dalam keluarga Metode Ensemble . Mereka mengambil manfaat dari berbagai pengklasifikasi. Cobalah mereka saat mereka bekerja cukup baik dalam latihan.
Skema pemilihan hanya mengambil hasil dari pengklasifikasi yang berbeda dan mengembalikan output yang memiliki probabilitas tertinggi untuk menjadi benar. Begitu baik pendekatan demokratis terhadap kediktatoran;)
Semoga ini bisa membantu!
sumber