Câu trả lời:
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_weight
là:
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â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.
weight
tham 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 weight
vectơ 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
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 -
Cảm ơn wacax
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_weight
sklearn 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)