Tùy chọn xử lý các tính năng phân loại của Catboost (cài đặt TLB)?


11

Tôi đang làm việc với một bộ dữ liệu với số lượng lớn các tính năng phân loại (> 80%) dự đoán một biến mục tiêu liên tục (ví dụ: Hồi quy). Tôi đã đọc khá nhiều về các cách để xử lý các tính năng phân loại. Và học được rằng mã hóa một nóng mà tôi đã sử dụng trong quá khứ thực sự là ý tưởng tồi, đặc biệt là khi nói đến rất nhiều tính năng phân loại với nhiều cấp độ (đọc các bài đăng này , và điều này ).

Mặc dù tôi đã bắt gặp các phương thức như mã hóa dựa trên mục tiêu (làm mịn) các tính năng phân loại thường dựa trên giá trị trung bình của các giá trị đích cho từng tính năng có lẽ là bài đăng / kernel này trong Kaggle. Tuy nhiên, tôi đang vật lộn để tìm ra một cách cụ thể hơn cho đến khi tôi tìm thấy CatBoost một công cụ tăng cường độ dốc nguồn mở trên các cây quyết định được phát hành năm ngoái bởi nhóm Yandex. Họ dường như cung cấp các tùy chọn đếm thống kê bổ sung cho các tính năng phân loại có khả năng hiệu quả hơn nhiều so với mã hóa đơn giản hoặc làm mịn.

Vấn đề là tài liệu không hữu ích làm thế nào để thiết lập cài đặt CTR . Tôi đã thử nhiều cách khác nhau nhưng nó không hoạt động. Tài liệu cho biết cài đặt TLBđơn giản , được đưa ra dưới dạng ( phần cài đặt TLB ):

['CtrType[:TargetBorderCount=BorderCount][:TargetBorderType=BorderType][:CtrBorderCount=Count][:CtrBorderType=Type][:Prior=num_1/denum_1]..[:Prior=num_N/denum_N]',
 'CtrType[:TargetBorderCount=BorderCount][:TargetBorderType=BorderType][:CtrBorderCount=Count][:CtrBorderType=Type][:Prior=num_1/denum_1]..[:Prior=num_N/denum_N]',
  ...]

Đây là một ví dụ siêu đơn giản, dữ liệu trông như thế này:

import pandas as pd
import catboost
data = [{'profit': '342','country': 'holland','account': 'Jones LLC', 'saving': 150, 'debt': -60, 'age': 28},
         {'profit': '875','country': 'germany','account': 'Alpha Co',  'saving': 200, 'debt': -10, 'age': 42},
         {'profit': '127','country': 'italy','account': 'Blue Inc',  'saving': 50,  'debt': -300,  'age': 38 }]
df = pd.DataFrame(data)

Dưới đây là một Regressor Catboost đơn giản:

X_train = df.drop(['profit'],axis=1)
Y_train = df['profit']
categorical_features_indices = [0,2]

train_pool = catboost.Pool(X_train, Y_train, cat_features=categorical_features_indices)

model = catboost.CatBoostRegressor(
    depth=3,
    iterations=5,
    eval_metric='RMSE',
    simple_ctr=None)

model.fit(train_pool);

Vấn đề đơn giản , một trong các cài đặt CTR, là vấn đề !! Thật đáng tiếc vì có vẻ như gói này cung cấp các phương thức khác nhau, cho đến nay không có cách nào để truy cập chúng.

CẬP NHẬT ngày 9 tháng 8 năm 2018: Vài ngày trước tôi đã nêu vấn đề này cho nhà phát triển Catboost, xem tại đây và họ đã mở một vé cho nó để cung cấp một hướng dẫn.


Dưới đây là mô tả về catboost trên phân loại có thể phân loại: tech.yandex.com/catboost/doc/dg/con accept / trộm
DiveIntoML

Vâng, tôi biết liên kết; nó đưa ra một mô tả lý thuyết chi tiết. Chưa đủ mô tả về cách sử dụng nó được đưa ra; Tôi có nghĩa là hướng dẫn sử dụng thực tế. Tôi đã thử nó vài tháng trước và nó không đơn giản.
TwinPenguins

1
Tôi hiện chỉ sử dụng tham số one_hot_max_size và tôi hiểu rằng mọi thứ không phải là một mã hóa nóng, sẽ được mã hóa bằng cách sử dụng mã hóa mở rộng mục tiêu. Tôi đang mong đợi các tài liệu chính thức bổ sung để hiểu rõ hơn về cài đặt ctr và cách tôi có thể chơi với chúng.
Garima Jain

Câu trả lời:


2

Tôi phát hiện ra rằng để thiết lập các ctrtham số và tất cả các thành phần người ta phải vượt qua một danh sách các chuỗi, mỗi chuỗi phải chứa ctrTypevà một trong các thành phần của nó:

  • Từ đầu tiên của chuỗi phải là một ctrTypeví dụ Borders:(bấm vào đây để biết thông số catboost)
  • Sau đó, một thành phần của ctrTypenên làm theo. Ví dụ TargetBorderType=5.
  • Tất cả cùng nhau 'Borders:TargetBorderType=5'.
  • Lặp lại quy trình để đặt một thành phần khác và thêm chuỗi mới vào danh sách.

Ví dụ với hai thành phần được đặt:

simple_ctr = ['Borders:TargetBorderType=Uniform', 'Borders:TargetBorderCount=50']

Nó hoạt động, cảm ơn vì lời giải thích, và xin lỗi vì đã mất một thời gian dài để quay lại kiểm tra lại, trượt qua tâm trí của tôi.
TwinPenguins

1

Bạn đã thử sử dụng định dạng được cung cấp như dưới đây:

['CtrType[:TargetBorderCount=BorderCount][:TargetBorderType=BorderType][:CtrBorderCount=Count][:CtrBorderType=Type][:Prior=num_1/denum_1]..[:Prior=num_N/denum_N]'

['BinarizedTargetMeanValue[:TargetBorderCount=1][:TargetBorderType=Uniform][:CtrBorderCount=5][:CtrBorderType=Uniform][:Prior=1]']

Đây có phải là một câu trả lời? Nó cảm thấy giống như một câu hỏi / bình luận.
Stephen Rauch

@Interested_Programmer: Nó không hoạt động, hãy tự thử trong ví dụ tôi vừa cung cấp. Bạn đã thử nó hay đơn giản là bạn đã tìm thấy nó trong tài liệu?
TwinPenguins

Tôi xin lỗi @StephenRauch. Tôi không thể chạy máy tính xách tay của mình nhưng thấy nó có thể sử dụng được trong các chức năng khác để làm theo định dạng. Nhìn nhận lại, tôi nên thêm nó như một bình luận. Tôi cũng đang chờ đợi những người sáng tạo đưa ra hướng dẫn mới.
Interest_Programmer

1
cũng điều này hoạt động. Simple_ctr = ['BinarizedTargetMeanValue'])
Interest_Programmer

1
Cảm ơn. Nhưng như bạn đã chỉ ra, nó chỉ hoạt động như Simple_ctr = ['BinarizedTargetMeanValue'])! Các tùy chọn khác không thể được cung cấp như [: TargetBorderCount = BorderCount], v.v ... Nếu bạn biết cách cho người khác ăn cùng với CtrType, hãy cho tôi biết.
TwinPenguins
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.