Как передать массив NumPy в качестве категориальной функции в Catboost Python - PullRequest
0 голосов
/ 14 января 2019

Я хочу передать 12-й столбец массива в качестве категориального признака.

Столбец имеет значения int от 1 до 10.

Я пробовал это:

cbr.fit(X_train, y,
        eval_set=(X_train_test, y_test),
        cat_features=[X_train[:,12]],
        use_best_model=True,
        verbose=100)

Но получил эту ошибку:

CatboostError: 'data' - это пустой массив np.float32, это означает, что нет категориальных функций, но параметр 'cat_features' указывает ненулевое количество категориальных функций

1 Ответ

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

Категориальные функции не могут быть значениями с плавающей запятой. Причина этого в том, что категориальные объекты обрабатываются как строки, и мы должны иметь одну и ту же строку в случае, если вы читаете значение функции из файла или из фрейма данных. Мы не можем сделать это для значений с плавающей запятой, но мы можем сделать это для строк и целых чисел.

Для решения вашей проблемы вам нужно использовать фрейм данных, в котором столбцы с категориальными характеристиками будут иметь целочисленный или строковый тип.

Например,

from catboost import CatBoostClassifier, Pool
import pandas as pd

data = pd.DataFrame({'string_column': ['val0', 'val1', 'val2'],
                     'int_column': [1,2,3],
                     'float_column': [1.2,2,4.1]})
print(data)
print(data.dtypes)

train_data = Pool(
    data=data,
    label=[1, 1, -1],
    weight=[0.1, 0.2, 0.3],
    cat_features=[0, 1]
)

model = CatBoostClassifier(iterations = 10)
model.fit(X=train_data)
...