Tôi đang làm việc về phân loại văn bản nơi tôi có 39 danh mục / lớp và 8,5 triệu hồ sơ. (Trong dữ liệu và danh mục trong tương lai sẽ tăng).
Cấu trúc hoặc định dạng của dữ liệu của tôi là như sau.
----------------------------------------------------------------------------------------
| 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
Phân phối dữ liệu không bình thường; nó rất mất cân bằng:
-------------------------
| 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
Như bạn có thể thấy chúng rất mất cân bằng và dẫn đến phân loại sai.
Các bước tôi đã thực hiện cho đến bây giờ
1) Hợp nhất cột Product_title và key_value_pairs và xóa các từ dừng và ký tự đặc biệt và thực hiện xuất phát.
2) Tôi đã sử dụng đường ống cho TFIDFvectorizer (), linearSVC ()
vectorizerPipe = Pipeline([
('tfidf', TfidfVectorizer(lowercase=True, stop_words='english')),
('classification', OneVsRestClassifier(LinearSVC(penalty='l2', loss='hinge'))),
])
Sau này, tôi có đường ống phù hợp và lưu trữ phân loại trong dưa chua
prd = vectorizerPipe.fit(df.loc[:, 'description'], df.loc[:, 'taxonomy_id'])
Về phía Kiểm tra tôi đã lặp lại bước 1 như đã đề cập ở trên và sau đó tải dưa chua và sử dụng chức năng dự đoán
pd = cl.predict([testData])
Những vấn đề tôi đang phải đối mặt
Rất nhiều sản phẩm đang bị phân loại sai thành một số loại khác
Ví dụ: Ultimate Protein Prostar 100% Whey Protein nên được phân loại vào loại 311 nhưng phân loại của tôi đang phân loại nó là 222, điều này hoàn toàn sai.
Tôi không chắc nên sử dụng TFidfVectorizer () hay Hashingvectorizer (), các bạn có thể giúp tôi chọn một trong số này cùng với các tham số của họ không?
Thuật toán tôi đang sử dụng là linearSVC, nó có phải là một lựa chọn tốt cho các vấn đề phân loại nhiều lớp với lượng dữ liệu lớn? Hay tôi nên sử dụng các thuật toán khác nhau?
Vì dữ liệu của tôi rất mất cân bằng, tôi đã thử lấy mẫu ngẫu nhiên. Kết quả đã được cải thiện nhưng chúng vẫn không đạt được mục đích. Ngoài ra, tôi không chắc liệu đây có phải là cách tiếp cận phù hợp để thực hiện việc lấy mẫu ngẫu nhiên hay không:
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')))
Tôi là người mới trong học máy nên tôi đã sử dụng phương pháp này để phân loại văn bản. Nếu cách tiếp cận của tôi là sai thì xin vui lòng sửa cho tôi với đúng.
(Sẽ thật tuyệt nếu bạn đưa ra gợi ý hoặc giải pháp với các ví dụ vì nó sẽ giúp tôi hiểu rõ hơn).
*** CHỈNH SỬA-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)