Я новичок в общем сообществе по переполнению стека и особенно новичок в библиотеке 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.
Любая помощь по этому вопросу будет во многом способствовать моему пониманию библиотеки. Заранее спасибо и спасибо за ваше время.






Вам нужно удалить вызов функции 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.
Можете ли вы предоставить дополнительную информацию о характере вашего набора данных? Это поможет понять, что вы пытаетесь сделать.
Хорошо, я вижу проблему. Вы можете попробовать преобразовать строки в числа. Например, если у вас десять регионов, назовите их от 0 до 9. Затем вы можете повторить это для всех записей. Это должно дать более значимые данные, чем применение .get_dummies.
Быстрый встречный вопрос: будет ли модель тогда рассматривать числа от 0 до 9 как буквальные значения или «ведра»? И если да, то есть ли способ предопределить, как он к ним относится? Кроме того, я совсем недавно открыл для себя мир предварительной обработки, так что это начинает приобретать гораздо больше смысла. Спасибо за помощь.
Он должен относиться к ним как к буквальным значениям. Что именно вы подразумеваете под предопределением того, как он к ним относится?
Приносим извинения за задержку с ответом и спасибо @Bongni за четкий и краткий ответ. Однако при удалении функции .getdummies я теперь получаю сообщение об ошибке в строке 31 «model.fit(x_train, y_train, epochs=100, patch_size=128)», в котором указано: «ValueError: не удалось преобразовать строку в число с плавающей запятой: 'SK'» . В контексте база данных представляет собой старый файл вызовов, содержащий информацию об определенных контактах в базе данных. Эти данные включают регион, разрешения на электронную почту/SMS, географию и несколько других строк. Излишне говорить, что данные вообще не оптимизированы для этой задачи, это всего лишь доказательство концепции.