我想将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:“数据”是np.float32的numpy数组,表示没有分类特征,但是“ cat_features”参数指定了非零数量的分类特征
答案 0 :(得分:2)
分类要素不能为浮点值。这样做的原因是将分类要素视为字符串,并且如果您从文件或数据框中读取要素值,我们必须使用相同的字符串。我们不能对浮点值执行此操作,但可以对字符串和整数执行此操作。
要解决您的问题,您需要使用数据框,其中具有分类特征的列将是整数或字符串类型。
例如,
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)
答案 1 :(得分:0)
从字面上看,在numpy数组中使用Catboost中的分类功能几乎是不可能的。
原因是它会针对整个数组(浮点)转换为一种数据类型,因此Catboost要求您的分类特征为int类型。不能混合。 现在,您可以改为构建一个数据框,并确保其中的dtypes正确。
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)