训练集包含 "labels" 作为 keras 模型的输入

Training set contains "labels" as inputs to keras model

我发现我的 keras 模型不能很好地处理输入列,如果它们不是浮点值的话。我希望能够使用包含 "labels" 的列来训练模型,标签是指各种 ID 或编码的字符串名称。理想情况下,它能够将这些标签列集成到它的模型中,决定这些分类列中的哪些值表示更高的准确性。

例如,我正在尝试预测比赛结果(赢=1,输=0),我想在历史数据中包含 "team name" 和 "coach name" .理想情况下,该模型将确定哪些球队和教练更有可能获胜。

但是,当我 运行 model.fit 和 training_set 包含除 int/float 值以外的任何值(本质上是统计的,而不是分类的)时,它会生成每个 epoch 的准确度都相同,损失分数非常高。

以下是我定义模型的方式:

model = keras.Sequential([
        keras.layers.Dense(1024, activation=tf.nn.relu, kernel_initializer=init_ru, bias_initializer=init_ru),
        keras.layers.Dense(512, activation=tf.nn.relu, kernel_initializer=init_ru, bias_initializer=init_ru),
        keras.layers.Dense(256, activation=tf.nn.relu),
        keras.layers.Dense(128, activation=tf.nn.relu),
        keras.layers.Dense(32, activation=tf.nn.relu),
        keras.layers.Dense(1, activation=tf.nn.sigmoid)
    ])
opt = keras.optimizers.Adam(lr=0.001, beta_1=0.9, beta_2=0.999, epsilon=None, decay=0.0, amsgrad=True)

model.compile(optimizer=opt, 
              loss='binary_crossentropy',
              metrics=['accuracy'])

如果我不包含任何分类数据,它会很好用,但我认为如果我能让它处理分类数据,它会改进更多。

处理分类数据的标准方法是创建有效值字典,然后将类别转换为 one_hot 向量。

这是一篇带有示例的合理介绍性文章: https://machinelearningmastery.com/how-to-one-hot-encode-sequence-data-in-python/

假设您的自变量(特征)在数据框中 df 您可以使用:

pd.get_dummies(df.iloc[:,columns_to_be_converted])

一个 numpy 数组的例子:

pd.get_dummies(np.array(["Mark","Sarah","Mark","John"]).astype(str))

输出:

   John  Mark  Sarah
0     0     1      0
1     0     0      1
2     0     1      0
3     1     0      0