39 kategori / sınıf ve 8.5 milyon kaydım olan metin sınıflandırması üzerinde çalışıyorum. (Gelecekte veri ve kategoriler artacaktır).
Verilerimin yapısı veya biçimi aşağıdaki gibidir.
----------------------------------------------------------------------------------------
| 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
Veri dağıtımı normal değildir; oldukça dengesizdir:
-------------------------
| 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
Gördüğünüz gibi, oldukça dengesiz ve yanlış sınıflandırmalara yol açıyorlar.
Şimdiye kadar gerçekleştirdiğim adımlar
1) product_title ve key_value_pairs sütunlarını birleştirin ve durdurma sözcüklerini ve özel karakterleri kaldırın ve stemming yapın.
2) TFIDFvectorizer (), LinearSVC () için boru hattı kullandım
vectorizerPipe = Pipeline([
('tfidf', TfidfVectorizer(lowercase=True, stop_words='english')),
('classification', OneVsRestClassifier(LinearSVC(penalty='l2', loss='hinge'))),
])
Bundan sonra boru hattına uydum ve sınıflandırıcıyı turşu içinde sakladım
prd = vectorizerPipe.fit(df.loc[:, 'description'], df.loc[:, 'taxonomy_id'])
Test tarafında, yukarıda belirtildiği gibi 1. adımı tekrarladım ve daha sonra turşu yükleyin ve tahmin fonksiyonunu kullanın
pd = cl.predict([testData])
Karşılaştığım sorunlar
Birçok ürün diğer bazı kategorilerde yanlış sınıflandırılıyor
Örnek: Ultimate Nutrition Prostar% 100 Whey Protein kategori 311 olarak sınıflandırılmalıdır, ancak sınıflandırıcım 222 olarak sınıflandırıyor ve bu tamamen yanlış.
TFidfVectorizer () veya Hashingvectorizer () kullanıp kullanmadığından emin değilim, sizden parametrelerle birlikte bunlardan birini seçmeme yardımcı olabilir misiniz?
Kullandığım algoritma LinearSVC, çok miktarda veri içeren çok sınıflı sınıflandırma problemleri için iyi bir seçim mi? Yoksa farklı algoritmalar mı kullanmalıyım?
Verilerim dengesiz olduğundan rastgele örnekleme denedim. Sonuçlar düzeldi, ancak hala işarete kadar değildi. Ayrıca bu rastgele örnekleme gerçekleştirmek için doğru bir yaklaşım olup olmadığından emin değilim:
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')))
Makine öğreniminde yeniyim, bu yüzden metin yaklaşımı için bu yaklaşımı kullandım. Yaklaşımım yanlışsa, lütfen beni doğru olanla düzeltin.
(Daha iyi anlamama yardımcı olacağı için örneklerle öneri veya çözüm verirseniz harika olur).
*** DÜZENLEME-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)