Mã hóa các biến phân loại bằng cách sử dụng ước tính khả năng


22

Tôi đang cố gắng hiểu làm thế nào tôi có thể mã hóa các biến phân loại bằng cách ước tính khả năng, nhưng cho đến nay đã có rất ít thành công.

Bất kỳ đề xuất sẽ được đánh giá rất cao.


Phải làm gì trong thời gian dự đoán khi chúng ta không có nhãn mục tiêu?
Ranjeet Singh

Câu trả lời:


24

Tôi cũng đang học chủ đề này, và đây là những gì tôi tìm thấy:

  • Loại mã hóa này được gọi là mã hóa khả năng , mã hóa tác động hoặc mã hóa mục tiêu

  • Ý tưởng là mã hóa biến phân loại của bạn với việc sử dụng biến mục tiêu (liên tục hoặc phân loại tùy theo nhiệm vụ). Ví dụ: nếu bạn có tác vụ hồi quy, bạn có thể mã hóa biến phân loại của mình bằng giá trị trung bình của mục tiêu. Đối với mỗi danh mục, bạn tính giá trị trung bình tương ứng của mục tiêu (trong số danh mục này) và thay thế giá trị của danh mục bằng giá trị trung bình này.

  • Nếu bạn có nhiệm vụ phân loại, bạn tính tần suất tương đối của mục tiêu theo từng giá trị danh mục.

  • Từ quan điểm toán học, mã hóa này có nghĩa là xác suất mục tiêu của bạn, có điều kiện trên từng giá trị danh mục.

  • Nếu bạn làm điều đó một cách đơn giản, như tôi đã mô tả ở trên, bạn có thể sẽ có được một ước tính sai lệch. Đó là lý do tại sao trong cộng đồng Kaggle họ thường sử dụng 2 cấp độ xác nhận chéo. Đọc bình luận này của raddar ở đây . Các máy tính xách tay tương ứng là ở đây .

Báo giá:

Đó là giá trị trung bình của y. Nhưng không có nghĩa đơn giản, nhưng trong xác nhận chéo trong cách xác thực chéo;

Giả sử chúng ta có xác nhận chéo 20 lần. chúng ta cần bằng cách nào đó để tính giá trị trung bình của tính năng cho lần gập số 1 bằng cách sử dụng thông tin chỉ từ lần gấp # 2- # 20.

Vì vậy, bạn thực hiện các lần gấp # 2- # 20, tạo một bộ xác thực chéo khác trong đó (tôi đã thực hiện 10 lần). tính toán phương tiện cho mỗi lần rời khỏi (cuối cùng bạn nhận được 10 phương tiện). Bạn tính trung bình 10 phương tiện này và áp dụng vectơ đó cho bộ xác thực số 1 chính của bạn. Lặp lại điều đó trong 19 lần còn lại.

Thật khó để giải thích, khó hiểu và thành thạo :) Nhưng nếu làm đúng nó có thể mang lại nhiều lợi ích :)

  • Một triển khai mã hóa này là ở đây .

  • Trong thư viện R vtreat họ đã thực hiện mã hóa tác động. Xem bài này .

  • Trong thư viện CatBoost, họ có rất nhiều tùy chọn để mã hóa biến phân loại bao gồm mã hóa đích.

  • Không có mã hóa như vậy trong sklearn.


1
Có Target Encoding trong Sklearn-contrib Thể loại mã hóa
Josh

Làm thế nào bạn sẽ thực hiện tương tác tính năng trong trường hợp bạn sử dụng mã hóa mục tiêu? Ví dụ: bạn đã mã hóa mục tiêu F1 và F2. Bạn có thể nhân các giá trị được mã hóa F1 * F2 không?
Michael Larionov

Nếu bạn tính giá trị trung bình cho mỗi lần LOO, thì bạn lấy trung bình của chúng, nó hoàn toàn giống như bạn đang lấy giá trị trung bình của # 2- # 20, tôi không hiểu tại sao điều này có thể được coi là CV. Ngoài ra tôi không hiểu ý anh ta là "vectơ" khi anh ta tính trung bình 10 nghĩa đó.
SiXUlm

Một bình luận muộn; mã hóa đích trong Bộ mã hóa danh mục là một mã hóa trung bình đơn giản; nó không thực hiện chính quy hóa nếp gấp trong vòng được mô tả bởi raddar.
Dan Scally

7

Mã hóa mục tiêu hiện có sẵn trong sklearn thông qua gói category_encoders.

Bộ mã hóa mục tiêu

class category_encoders.target_encoder.TargetEncoder (verbose = 0, cols = none, drop_invariant = false, return_df = True, impute_missing = True, handle_unknown = 'impute', min_samples_leaf = 1, smooth

Mã hóa mục tiêu cho các tính năng phân loại. Dựa trên để lại một cách tiếp cận ra.

Theo ghi nhận của josh trong bình luận ở trên.


1

Mã hóa khả năng vẫn chưa có sẵn trên scikit learn. Bạn có thể làm điều đó bằng cách tạo một từ điển, và sau đó thực hiện một chức năng thay thế.

dict1 = {'cate1':1,'cate2':1,'cate3':2,'cate4':2}
for i in df.shape[0]:
    df.iloc[i] = dict1[df.iloc[i]] 
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.