【问题标题】:How Do I pass numpy array as Categorical feature in Catboost Python如何在 Catboost Python 中将 numpy 数组作为分类特征传递
【发布时间】:2019-06-08 12:28:58
【问题描述】:

我想将 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' 参数指定非零分类特征数

【问题讨论】:

    标签: python catboost


    【解决方案1】:

    在 Catboost 中使用 numpy 数组来使用分类特征几乎是不可能的。

    原因是它转换为整个数组(浮点数)的一种数据类型,而 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)
    

    【讨论】:

      【解决方案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)
      

      【讨论】:

      猜你喜欢
      • 2019-11-30
      • 2021-07-24
      • 2023-04-01
      • 2011-06-25
      • 1970-01-01
      • 2020-03-20
      • 2020-04-01
      • 2019-07-12
      • 2021-07-28
      相关资源
      最近更新 更多