Python 如何在keras中使用有序分类列(“无法将字符串转换为浮点:';CATEGORY';”)

Python 如何在keras中使用有序分类列(“无法将字符串转换为浮点:';CATEGORY';”),python,pandas,tensorflow,keras,Python,Pandas,Tensorflow,Keras,我正在做比赛,数据集有很多分类数据。我试图将其中一些设置为有序类别,如下所示: for col in ordered_category_rating_cols: data[col] = data[col].astype(pd.api.types.CategoricalDtype(ordered=True, categories = ["GLQ", "ALQ", "BLQ", "Rec", "LwQ", "Unf", "NA"])) 但是,当我将数据传递到model.fit()中时,会抛

我正在做比赛,数据集有很多分类数据。我试图将其中一些设置为有序类别,如下所示:

for col in ordered_category_rating_cols:
    data[col] = data[col].astype(pd.api.types.CategoricalDtype(ordered=True, categories = ["GLQ", "ALQ", "BLQ", "Rec", "LwQ", "Unf", "NA"]))
但是,当我将数据传递到
model.fit()
中时,会抛出此错误(完整堆栈如下所示):

ValueError:无法将字符串转换为浮点:“GLQ”

通过剥离一串列,我将其缩小为一列-但是如果为此打印
dtype
,它看起来是正确的:

> train_x["BsmtFinType1"].dtype
> CategoricalDtype(categories=['GLQ', 'ALQ', 'BLQ', 'Rec', 'LwQ', 'Unf', 'NA'], ordered=True)
我到处找,但找不到任何解决办法。我是否需要做些什么来告诉Keras将类别视为浮动

---------------------------------------------------------------------------
ValueError                                Traceback (most recent call last)
<ipython-input-144-c86afee8eb19> in <module>()
      4     batch_size=128,
      5     epochs=6,
----> 6     validation_split=0.1
      7 )
      8 

3 frames
/usr/local/lib/python3.6/dist-packages/tensorflow/python/keras/engine/training.py in fit(self, x, y, batch_size, epochs, verbose, callbacks, validation_split, validation_data, shuffle, class_weight, sample_weight, initial_epoch, steps_per_epoch, validation_steps, validation_freq, max_queue_size, workers, use_multiprocessing, **kwargs)
    778           validation_steps=validation_steps,
    779           validation_freq=validation_freq,
--> 780           steps_name='steps_per_epoch')
    781 
    782   def evaluate(self,

/usr/local/lib/python3.6/dist-packages/tensorflow/python/keras/engine/training_arrays.py in model_iteration(model, inputs, targets, sample_weights, batch_size, epochs, verbose, callbacks, val_inputs, val_targets, val_sample_weights, shuffle, initial_epoch, steps_per_epoch, validation_steps, validation_freq, mode, validation_in_fit, prepared_feed_values_from_dataset, steps_name, **kwargs)
    361 
    362         # Get outputs.
--> 363         batch_outs = f(ins_batch)
    364         if not isinstance(batch_outs, list):
    365           batch_outs = [batch_outs]

/usr/local/lib/python3.6/dist-packages/tensorflow/python/keras/backend.py in __call__(self, inputs)
   3275         tensor_type = dtypes_module.as_dtype(tensor.dtype)
   3276         array_vals.append(np.asarray(value,
-> 3277                                      dtype=tensor_type.as_numpy_dtype))
   3278 
   3279     if self.feed_dict:

/usr/local/lib/python3.6/dist-packages/numpy/core/numeric.py in asarray(a, dtype, order)
    536 
    537     """
--> 538     return array(a, dtype, copy=False, order=order)
    539 
    540 

ValueError: could not convert string to float: 'GLQ'
---------------------------------------------------------------------------
ValueError回溯(最近一次调用上次)
在()
4批次尺寸=128,
5个时代=6,
---->6验证_分割=0.1
7 )
8.
3帧
/usr/local/lib/python3.6/dist-packages/tensorflow/python/keras/engine/training.py-in-fit(self、x、y、批大小、历元、冗余、回调、验证拆分、验证数据、洗牌、类权重、样本权重、初始历元、每历元步数、验证步骤、验证频率、最大队列大小、工作者、使用多处理、**kwargs)
778验证步骤=验证步骤,
779验证频率=验证频率,
-->780步(每个历元的步数)
781
782 def评估(自我,
/模型迭代中的usr/local/lib/python3.6/dist-packages/tensorflow/python/keras/engine/training\u arrays.py(模型、输入、目标、样本权重、批量大小、年代、详细程度、回调、val_输入、val_目标、val_样本权重、无序、初始历元、每历元步长、验证步骤、验证频率、模式、验证拟合、从数据集准备的反馈值、步骤名称、**kwargs)
361
362#获取输出。
-->363批次输出=f(批次输入)
364如果不存在(批次,列表):
365批次输出=[批次输出]
/usr/local/lib/python3.6/dist-packages/tensorflow/python/keras/backend.py in_u____调用__(self,输入)
3275 tensor\u type=dtypes\u模块as\u dtype(tensor.dtype)
3276数组_vals.append(np.asarray(值,
->3277 dtype=张量(类型。as(numpy(类型))
3278
3279如果自进给指令:
/asarray中的usr/local/lib/python3.6/dist-packages/numpy/core/numeric.py(a,数据类型,顺序)
536
537     """
-->538返回数组(a,数据类型,copy=False,order=order)
539
540
ValueError:无法将字符串转换为浮点:“GLQ”

您可以将
类别
数据转换为它们的
代码
,这与


您可以将
类别
数据转换为它们的
代码
,这与


我将分类列转换为数据的方式

import pandas as pd
df = pd.DataFrame(data={"gender":["male","female"]})
df['gender'] = df['gender'].astype('category').cat.codes

如果多列包含分类数据

category_columns = list(df.select_dtypes(['category']).columns)
df[category_columns] = df[category_columns].apply(lambda x: x.cat.codes)

我将分类列转换为数据的方式

import pandas as pd
df = pd.DataFrame(data={"gender":["male","female"]})
df['gender'] = df['gender'].astype('category').cat.codes

如果多列包含分类数据

category_columns = list(df.select_dtypes(['category']).columns)
df[category_columns] = df[category_columns].apply(lambda x: x.cat.codes)

啊哈,宾果!我看到了,但没有意识到我必须自己为它设定值。效果很好,谢谢!@DannyTuppeny yw:-)祝你好运!宾果!我看到了,但没有意识到我必须自己为它设定值。效果很好,谢谢!@DannyTuppeny yw:-)快乐的codingAha,让我把循环改回单曲谢谢!啊哈,让我把循环改回单曲谢谢!