Бинарная кроссэнтропия Tensorflow всегда предсказывает одно и то же значение

Я новичок в общем сообществе по переполнению стека и особенно новичок в библиотеке Tensorflow (на данный момент 1 неделя). Так что я уверен, что что-то здесь упускаю, просто сам не могу этого понять.

Я выполнил несколько практик, используя пример набора данных Tensorflow и несколько различных руководств. Я обнаружил, что пытаюсь применить один из кодов руководства к своему собственному набору данных. Этот набор данных представляет собой CSV, и модель должна вернуть прогноз столбца «Последний результат». Это оказалось слишком много, потому что я быстро столкнулся с проблемой: функция «предсказать» всегда предсказывает одинаковые значения для каждой записи данных.

[[0,6335701] [0,6335701] ... [0,6335701] [0,6335701]]

import pandas as pd
from sklearn.model_selection import train_test_split
from keras.models import Sequential, load_model
from keras.layers import Dense
from sklearn.metrics import accuracy_score

df = pd.read_csv('*.csv')
x = pd.get_dummies(df.drop(['Last Result'], axis=1))
y = df['Last Result'].apply(lambda X: 1 if X == 'Registered' else 0)
x_train, x_test, y_train, y_test = train_test_split(x, y, test_size=.2)
x_train.head()
print("x train: \n", x_train)
y_train.head()
print("y train: \n", y_train)

# Below is code to create a new TensorFlow Model. If you need to call a saved model, see 'load model' below.

model = Sequential()
model.add(Dense(units=32, activation='relu', input_dim=len(x_train.columns)))
model.add(Dense(units=32, activation='relu'))
model.add(Dense(units=1, activation='sigmoid'))
model.compile(loss='binary_crossentropy', optimizer='sgd', metrics=['accuracy'])

model.fit(x_train, y_train, epochs=100, batch_size=128)

# model.save('*.keras')

# This is code to recall a previously saved TensorFlow Model

# model = load_model('*.keras')

y_hat = model.predict(x_test)
# y_hat = [0 if val < 0.5 else 1 for val in y_hat]
print(y_hat)

# print(accuracy_score(y_test, y_hat))

Я пробовал другие предложения из похожих постов, но безрезультатно. Насколько я понимаю проблему, модель ничего не изучает, а вместо этого просто угадывает все одно значение, потому что одно из ожидаемых значений истинно в ~60% случаев, то есть прогнозы ~0,60.

Любая помощь по этому вопросу будет во многом способствовать моему пониманию библиотеки. Заранее спасибо и спасибо за ваше время.

Почему в Python есть оператор "pass"?
Почему в Python есть оператор "pass"?
Оператор pass в Python - это простая концепция, которую могут быстро освоить даже новички без опыта программирования.
Некоторые методы, о которых вы не знали, что они существуют в Python
Некоторые методы, о которых вы не знали, что они существуют в Python
Python - самый известный и самый простой в изучении язык в наши дни. Имея широкий спектр применения в области машинного обучения, Data Science,...
Основы Python Часть I
Основы Python Часть I
Вы когда-нибудь задумывались, почему в программах на Python вы видите приведенный ниже код?
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
Алиса и Боб имеют неориентированный граф из n узлов и трех типов ребер:
Оптимизация кода с помощью тернарного оператора Python
Оптимизация кода с помощью тернарного оператора Python
И последнее, что мы хотели бы показать вам, прежде чем двигаться дальше, это
Советы по эффективной веб-разработке с помощью Python
Советы по эффективной веб-разработке с помощью Python
Как веб-разработчик, Python может стать мощным инструментом для создания эффективных и масштабируемых веб-приложений.
0
0
67
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Вам нужно удалить вызов функции pd.get_dummies. Просто назначьте напрямую

x = df.drop(['Last Result'], axis=1)

Вызов pd.get_dummies преобразует образцы в данные 0/1: https://pandas.pydata.org/pandas-docs/stable/reference/api/pandas.get_dummies.html.

Можете ли вы предоставить дополнительную информацию о характере вашего набора данных? Это поможет понять, что вы пытаетесь сделать.

Приносим извинения за задержку с ответом и спасибо @Bongni за четкий и краткий ответ. Однако при удалении функции .getdummies я теперь получаю сообщение об ошибке в строке 31 «model.fit(x_train, y_train, epochs=100, patch_size=128)», в котором указано: «ValueError: не удалось преобразовать строку в число с плавающей запятой: 'SK'» . В контексте база данных представляет собой старый файл вызовов, содержащий информацию об определенных контактах в базе данных. Эти данные включают регион, разрешения на электронную почту/SMS, географию и несколько других строк. Излишне говорить, что данные вообще не оптимизированы для этой задачи, это всего лишь доказательство концепции.

JLadage 18.04.2024 19:29

Хорошо, я вижу проблему. Вы можете попробовать преобразовать строки в числа. Например, если у вас десять регионов, назовите их от 0 до 9. Затем вы можете повторить это для всех записей. Это должно дать более значимые данные, чем применение .get_dummies.

Bongni 18.04.2024 21:55

Быстрый встречный вопрос: будет ли модель тогда рассматривать числа от 0 до 9 как буквальные значения или «ведра»? И если да, то есть ли способ предопределить, как он к ним относится? Кроме того, я совсем недавно открыл для себя мир предварительной обработки, так что это начинает приобретать гораздо больше смысла. Спасибо за помощь.

JLadage 18.04.2024 22:17

Он должен относиться к ним как к буквальным значениям. Что именно вы подразумеваете под предопределением того, как он к ним относится?

Bongni 18.04.2024 23:20

Другие вопросы по теме

Похожие вопросы

Асинхронный/параллельный подход к работе с (потенциально) растущей очередью задач
Текст JSON в качестве аргумента командной строки при запуске скрипта Python
Очистить новости проигрывателя rotowire MLB и сформировать их в таблицу с помощью Python
Невозможно выбрать параметры из раскрывающегося списка «Администратор» или ESS для сайта Orange HRM для роли пользователя
Неправильный вывод (но очень близкий) при добавлении значений с одного листа на другой с помощью openpyxl
Обеспечение автодополнения VSCode Python
Поднятый виджет ttk.Label не может оперативно перерисоваться?
Я получаю сообщение об ошибке malloc «Double Free Error» в своих последних сценариях Python, когда пытаюсь вставить данные на свой удаленный сервер postgresql
Решение проблемы нулевой частоты в преобразовании Фурье для задач электростатики
Проблема преобразования столбца типа объекта в тип int в pandas