Dữ liệu mất cân bằng gây ra phân loại sai trên tập dữ liệu đa lớp


9

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

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

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

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

  4. 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')))
  5. 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)

Tôi chỉ thấy rằng bạn đã thử dưới mẫu. Chỉ cần fyi, xác thực chéo K bắt đầu trong Sci-Kit Learn cũng tính đến phân phối lớp.
Kasra Manshaei

Câu trả lời:


6

Câu hỏi hay!

Một số lưu ý

Đối với dữ liệu mất cân bằng, bạn có cách tiếp cận khác nhau. Hầu hết các lớp được thiết lập tốt là lấy mẫu lại (oversampling các lớp nhỏ / gạch dưới các lớp lớn). Một cách khác là làm cho phân loại của bạn được phân cấp, tức là phân loại các lớp lớn với tất cả các lớp khác và sau đó phân loại các lớp nhỏ trong bước thứ hai (các phân loại không được coi là giống nhau. Hãy thử các chiến lược lựa chọn mô hình để tìm ra thứ tốt nhất).

Trả lời thực tế

Tôi đã có kết quả chấp nhận được mà không cần lấy lại dữ liệu! Vì vậy, hãy thử nó nhưng sau đó cải thiện nó bằng các phương pháp lấy mẫu lại (theo thống kê chúng là loại A PHẢI).

TFIDF là tốt cho một vấn đề như vậy. Các phân loại nên được chọn thông qua lựa chọn mô hình nhưng kinh nghiệm của tôi cho thấy Hồi quy logistic và Rừng ngẫu nhiên hoạt động tốt trong vấn đề cụ thể này (tuy nhiên đó chỉ là một trải nghiệm thực tế).

Bạn có thể làm theo mã dưới đây vì nó hoạt động đơn giản sau đó bạn có thể thử sửa đổi nó để cải thiện kết quả của mình:

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]

Xin lưu ý rằng mã là trừu tượng vì vậy TianX, TrainY, TestX, v.v ... phải được bạn xác định đúng.

Gợi ý

Hãy cẩn thận về những gì là StopWord. Thực tế nhiều người (bao gồm cả bản thân tôi!) Đã mắc lỗi này để loại bỏ các từ dừng theo danh sách được xác định trước. Điều đó không đúng!

Các từ dừng là nhạy cảm với văn bản, vì vậy bạn cần loại bỏ các từ dừng theo các khái niệm lý thuyết thông tin (để đơn giản, bạn cần biết loại TFIDF bỏ qua các từ khóa cụ thể của bạn. Nếu bạn cần giải thích thêm, hãy cho tôi biết để cập nhật câu trả lời của tôi) .

Voteclassifier là một chiến lược siêu học tập trong gia đình Phương pháp tập hợp . Họ được hưởng lợi từ các phân loại khác nhau. Hãy thử chúng vì chúng hoạt động khá tốt trong thực tế.

Lược đồ bỏ phiếu chỉ đơn giản là lấy kết quả của các phân loại khác nhau và trả về đầu ra của cái có xác suất cao nhất là đúng. Vì vậy, cách tiếp cận dân chủ chống lại chế độ độc tài;)

Hy vọng nó giúp!


Chào mừng bạn Để lấy mẫu trực quan, bạn có thể tham khảo liên kết tôi đặt để lấy mẫu lại. Có một hướng dẫn từng bước.
Kasra Manshaei

Tôi đang thử giải pháp của bạn, nếu tôi bị kẹt ở bất cứ đâu hoặc trong trường hợp có bất kỳ nghi ngờ nào, tôi sẽ đăng trong phần bình luận. Hy vọng rằng sẽ tốt cho bạn!
hơn

chắc chắn bạn của tôi ... chúc may mắn!
Kasra Manshaei

1
nếu nó hoạt động thì bạn có thể chấp nhận câu trả lời :)
Kasra Manshaei

@ trước đó vì câu trả lời đã giải quyết vấn đề của bạn, vui lòng chấp nhận (và có thể nêu lên) nó; câu trả lời chiếm thời gian quý báu cho người trả lời (tình nguyện)
Sahnaut
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.