Data yang tidak seimbang menyebabkan kesalahan klasifikasi pada dataset multiclass

9

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

  1. 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.

  2. Saya tidak yakin apakah akan menggunakan TFidfVectorizer () atau Hashingvectorizer (), bisakah kalian membantu saya dalam memilih salah satu dari ini bersama dengan parameter mereka?

  3. 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?

  4. 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')))
  5. 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)
outlier
sumber
Saya baru saja melihat Anda mencoba under-sampling. Hanya fyi, validasi silang K-fold Mulai di Sci-Kit Learn juga memperhitungkan distribusi kelas.
Kasra Manshaei

Jawaban:

6

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:

train = pd.read_csv(...)
test = pd.read_csv(...)    

# TFIDF Bag Of Words Model For Text Curpos. Up to 4-grams and 50k Features
vec = TfidfVectorizer(ngram_range=(1,4), max_features=50000)
TrainX = vec.fit_transform(train)
TestX = vec.transform(test)


# Initializing Base Estimators
clf1 = LogisticRegression()
clf2 = RandomForestClassifier(n_estimators=100, max_depth=20, max_features=5000,n_jobs=-1)

# Soft Voting Classifier For Each Column
clf = VotingClassifier(estimators=[('lr', clf1), ('rf', clf2)], voting='soft', n_jobs=-1)
clf = clf.fit(TrainX, TrainY)
preds = clf.predict_proba(TestX)[:,1]

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!

Kasra Manshaei
sumber
Selamat datang! Untuk resampling intuitif Anda dapat merujuk ke tautan yang saya masukkan untuk resampling. Ada instruksi langkah demi langkah.
Kasra Manshaei
Saya mencoba solusi Anda, jika saya terjebak di mana saja atau jika ada keraguan saya akan memposting di bagian komentar. berharap itu akan baik-baik saja untuk Anda!
outlier
tentu teman saya ... semoga berhasil!
Kasra Manshaei
1
jika berhasil maka Anda dapat menerima jawabannya :)
Kasra Manshaei
@ sebelumnya karena jawaban tersebut telah mengatasi masalah Anda, silakan menerima (dan mungkin mengunggulkannya); jawaban membutuhkan waktu yang berharga untuk responden (sukarela)
desertnaut