мин выборок на категориальное значение в catboost - PullRequest
0 голосов
/ 05 декабря 2018

Как я могу сказать CatBoost сгруппировать категориальные значения с небольшими выборками.Например, допустим, у меня есть столбец «Страна», в котором есть только 1 выборка для «Камбоджи» и 2 выборки для «Монголии» и 999 998 других стран, в каждой из которых имеется не менее 100 выборок.Я хотел бы сказать, что CatBoost не стоит использовать магию CTR в этих редких странах, а просто относиться к ним как к «другим».

1 Ответ

0 голосов
/ 14 января 2019

Предполагая, что у вас есть фрейм данных Pandas и у вас есть наборы поездов / тестов, которые вы хотите трансформировать.Небольшой фрагмент кода превратит ваши низкие счета в «другие».Я установил порог в 100, но вы можете изменить его на то, что вам нужно!

В основном код получает список значений с низким счетом и заменяет их на желаемое значение.

Примечание: вы можете запустить .value_counts () для вашего столбца, чтобы увидеть, что там, перед преобразованием столбца категории.

def transform_lowcount_cat(train=train, test=test, colstoreplace=colstoreplace, replaceval = 'other',  threshold=100): 
  for col in colstoreplace:
      unique_vals_cat = pd.DataFrame(train[col].value_counts())
      low_val_cat = unique_vals_cat[unique_vals_cat[col] < threshold].index.values
      train[col].replace(low_val_cat, replaceval, inplace=True)
      print(col + ' - TRAIN set transformed')
      if test == None:
        print('TEST set NOT transformed')
      else:
        test[col].replace(low_val_cat, replaceval, inplace=True)
        print(col + ' - TEST set transformed')

И затем вы создадите список столбцов / столбцов, которые вы хотитепреобразование и запустить код с желаемым значением замены и пороговым пределом.Обратите внимание, что это выполняет преобразование на месте.

colstoreplace = ['Col1','Col2']
transform_lowcount_cat(train=train, test=test, colstoreplace=colstoreplace, replaceval='whatever you want!', threshold = 100)
...