Dữ liệu đa giác không cân bằng với XGBoost


17

Tôi có 3 lớp với bản phân phối này:

Class 0: 0.1169
Class 1: 0.7668
Class 2: 0.1163

Và tôi đang sử dụng xgboostđể phân loại. Tôi biết rằng có một tham số được gọi là scale_pos_weight.

Nhưng làm thế nào nó được xử lý cho trường hợp 'đa kính' và làm thế nào tôi có thể đặt nó đúng cách?

Câu trả lời:


16

scale_pos_weightđược sử dụng để phân loại nhị phân như bạn đã nêu. Đó là một giải pháp tổng quát hơn để xử lý các lớp mất cân bằng. Một cách tiếp cận tốt khi gán giá trị scale_pos_weightlà:

sum(negative instances) / sum(positive instances)

Đối với trường hợp cụ thể của bạn, có một tùy chọn khác để cân nhắc các điểm dữ liệu riêng lẻ và tính trọng số của chúng trong khi làm việc với bộ tăng tốc và để tối ưu hóa xảy ra liên quan đến trọng số của chúng sao cho mỗi điểm được thể hiện như nhau. Bạn chỉ cần sử dụng đơn giản:

xgboost.DMatrix(..., weight = *weight array for individual weights*)

Bạn có thể xác định các trọng số theo ý muốn và bằng cách đó, bạn thậm chí có thể xử lý sự mất cân bằng trong các lớp cũng như sự mất cân bằng giữa các lớp khác nhau.


> Cách tiếp cận tốt khi gán giá trị cho scale_pose_ weight là: sum (trường hợp phủ định) / sum (trường hợp tích cực)
lcrmorin

1
Tôi thấy lời khuyên này ở khắp mọi nơi và thật hợp lý khi gán trọng số cao hơn cho lớp ít đại diện hơn. Tuy nhiên tôi có một thời gian khó tìm một nguồn thảo luận về giá trị chính xác này. Tôi có được trực giác đằng sau giá trị cụ thể đó (làm cho mẫu cân bằng) nhưng tôi nghi ngờ có sự đánh đổi phương sai ở đâu đó, điều đó sẽ khiến bạn muốn xem xét trọng lượng thấp hơn.
lcrmorin

6

Câu trả lời này của @KeremT là chính xác. Tôi cung cấp một ví dụ cho những người vẫn gặp vấn đề với việc thực hiện chính xác.

weighttham số trong XGBoost là mỗi phiên bản không phải mỗi lớp. Do đó, chúng ta cần gán trọng số của mỗi lớp cho các thể hiện của nó, đó là điều tương tự.

Ví dụ: nếu chúng ta có ba lớp không cân bằng với tỷ lệ

class A = 10%
class B = 30%
class C = 60%

Trọng lượng của họ sẽ là (chia lớp nhỏ nhất cho người khác)

class A = 1.000
class B = 0.333
class C = 0.167

Sau đó, nếu dữ liệu đào tạo là

index   class
0       A
1       A
2       B
3       C
4       B

chúng tôi xây dựng các weightvectơ như sau:

index   class    weight
0       A        1.000
1       A        1.000
2       B        0.333
3       C        0.167
4       B        0.333

3

Mọi người đều vấp phải câu hỏi này khi giải quyết vấn đề phân loại đa lớp không cân bằng bằng XGBoost trong R. Tôi cũng vậy!

Tôi đang tìm một ví dụ để hiểu rõ hơn về cách áp dụng nó. Đầu tư gần một giờ để tìm liên kết được đề cập dưới đây. Đối với tất cả những người đang tìm kiếm một ví dụ, ở đây đi -

/datascience//a/9493/37156

Cảm ơn wacax


0

Chỉ cần chỉ định từng trường hợp dữ liệu tàu của bạn với trọng lượng lớp của nó. Đầu tiên hãy lấy trọng số của lớp với class_weight.compute_class_weightsklearn sau đó gán cho mỗi hàng dữ liệu của xe lửa trọng lượng phù hợp của nó.

Tôi giả sử ở đây rằng dữ liệu xe lửa có cột 'lớp' chứa số lớp. Tôi cũng giả sử rằng có nb_groupes từ 1 đến nb_groupes.

from sklearn.utils import class_weight
class_weights = list(class_weight.compute_class_weight('balanced',
                                             np.unique(train['class']),
                                             train['class']))

w_array = np.ones(y_train.shape[0], dtype = 'float')
for i, val in enumerate(y_train):
    w_array[i] = class_weights[val-1]

xgb_classifier.fit(X, y, sample_weight=w_array)
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.