Учебный набор содержит "метки" в качестве входных данных для модели керас

Я вижу, что моя модель keras плохо обрабатывает входные столбцы, если они не являются значениями с плавающей точкой. Я хотел бы иметь возможность обучать модель, используя столбцы, которые содержат "метки", а под метками я подразумеваю идентификаторы сортов или закодированные имена строк. В идеале было бы возможно интегрировать эти столбцы меток в свою модель, решая, какие значения в этих категориальных столбцах предопределяют более высокую точность.

Например, я пытаюсь предсказать результаты соревнования (Win=1, Loss=0), и я хотел бы включить "название команды" и "имя тренера" в исторические данные. В идеале модель должна определить, какие команды и тренеры с большей вероятностью выиграют.

Тем не менее, когда я бегу model.fit и training_set включает в себя все, кроме значений int/float (которые являются статистическими по природе, а не категориальными), он генерирует одинаковую точность для каждой эпохи с очень высоким показателем потерь.

Вот как я определил свою модель:

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'])

Это прекрасно работает, если я не включаю никакие категориальные данные, но я думаю, что если бы я мог заставить их работать с категориальными данными, это улучшилось бы еще больше.

2 ответа

Решение

Стандартный способ обработки категориальных данных - создать словарь допустимых значений, а затем преобразовать категорию в вектор 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))

Ouput:

   John  Mark  Sarah
0     0     1      0
1     0     0      1
2     0     1      0
3     1     0      0
Другие вопросы по тегам