如何在Catboost Python中将numpy数组作为分类特性传递

如何在Catboost Python中将numpy数组作为分类特性传递,python,catboost,Python,Catboost,我想将numpy数组的第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的numpy数组,它表示

我想将numpy数组的第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的numpy数组,它表示没有分类特征,但'cat_features'参数指定非零个分类特征


分类特征不能是浮点值。这样做的原因是,分类特征被视为字符串,如果您从文件或数据帧读取特征值,则必须使用相同的字符串。我们不能对浮点值这样做,但我们可以对字符串和整数这样做

要解决您的问题,您需要使用dataframe,其中具有分类功能的列将是整数或字符串类型

比如说,

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)

在Catboost中使用numpy数组使用分类功能实际上是不可能的

原因是它将整个数组转换为一种数据类型(float),而Catboost要求您的分类功能为int类型。混合是不可能的。 现在,您可以构建一个数据帧,并确保其中的数据类型是正确的

df = df.astype(dtype={
    'cat_feature1':int,
    ...
})
从那里你可以做到:

df_int_list = df.select_dtypes(include='int').values.tolist()
df_no_int_list = df.select_dtypes(exclude='int').values.tolist()

df_list = []
for i,v in enumerate(df_int_list):
    df_list = df_list + [v+df_no_int_list[i]]
这是因为dataframe.Values将转换为numpy数组,然后将其转换为列表。如果列表中只有整数值,它将使用该值

cat_features=list(range(0,len(dataframe_int_list[0])))
train_data = Pool(
    data=df_list, # ensure your target values are removed
    label=... # insert your target values
    cat_features=cat_features
)

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

这对我来说并不是什么好事,但它让我走上了正确的道路。对于未来的读者:阅读文档中提供的示例有很大帮助: