Вопрос или проблема
Я новичок в Tensorflow. Я обучил модель Tensorflow, но мне нужно взять предсказания модели и добавить их в мой оригинальный тестовый набор в качестве столбца. Как я могу это сделать?
def model(self, layers_dims, X_train, Y_train, X_test, Y_test, learning_rate=0.00001,
num_epochs=1000, print_cost=True):
"""
Реализует трехслойную нейронную сеть tensorflow: LINEAR->RELU->LINEAR->RELU->LINEAR->SOFTMAX.
Аргументы:
X_train -- тренировочный набор, размер (входной размер = 12288, количество примеров в обучающем наборе = 1080)
Y_train -- тестовый набор, размер (выходной размер = 6, количество примеров в тестовом наборе = 1080)
X_test -- тренировочный набор, размер (входной размер = 12288, количество примеров в обучающем наборе = 120)
Y_test -- тестовый набор, размер (выходной размер = 6, количество примеров в тестовом наборе = 120)
learning_rate -- скорость обучения оптимизации
num_epochs -- количество эпох в цикле оптимизации
minibatch_size -- размер минипакета
print_cost -- True, чтобы выводить стоимость каждые 100 эпох
Возвращает:
parameters -- параметры, изученные моделью. Они могут быть использованы для предсказания.
"""
ops.reset_default_graph() # чтобы иметь возможность повторно запускать модель без перезаписи переменных tf
tf.set_random_seed(1) # чтобы результаты были консистентными
seed = 3 # чтобы результаты были консистентными
(n_x, m) = X_train.shape # (n_x: входной размер, m: количество примеров в обучающем наборе)
n_y = Y_train.shape[0] # n_y: выходной размер
#print('Ytrain shape', Y_train.shape)
costs = [] # Для отслеживания стоимости
# Создать заполнители размером (n_x, n_y)
X, Y = self.create_placeholders(n_x, n_y)
# Инициализация параметров
parameters = NN_predict_trading_decisions.initialize_parameters(layers_dims)
# Прямая прогпация: Построить прямую прогпацию в графе tensorflow
ZL = NN_predict_trading_decisions.forward_propagation(X, parameters)
# Функция стоимости: Добавить функцию стоимости в граф tensorflow
cost = NN_predict_trading_decisions.compute_cost(ZL, Y)
# Обратное распространение: Определить оптимизатор tensorflow. Использовать AdamOptimizer.
#optimizer = tf.train.AdamOptimizer(learning_rate=learning_rate).minimize(cost)
optimizer = tf.train.GradientDescentOptimizer(learning_rate).minimize(cost)
# Инициализация всех переменных
init = tf.global_variables_initializer()
# Начать сессию для вычисления графа tensorflow
with tf.Session() as sess:
# Запустить инициализацию
sess.run(init)
# Выполнить цикл обучения
for epoch in range(num_epochs):
epoch_cost = 0. # Определить стоимость, связанную с эпохой
current_cost = sess.run([optimizer, cost], feed_dict= {X: X_train, Y: Y_train})
epoch_cost += current_cost[1]
# Выводить стоимость каждую эпоху
if print_cost == True and epoch % 100 == 0:
print("Cost after epoch %i: %f" % (epoch, epoch_cost))
if print_cost == True and epoch % 5 == 0:
costs.append(epoch_cost)
# построить график стоимости
plt.plot(np.squeeze(costs))
plt.ylabel('cost')
plt.xlabel('iterations (per tens)')
plt.title("Learning rate =" + str(learning_rate))
plt.show()
# сохранить параметры в переменной
parameters = sess.run(parameters)
print("Parameters have been trained!")
# Рассчитать правильные предсказания
correct_prediction = tf.equal(tf.argmax(ZL), tf.argmax(Y))
# Рассчитать точность на тестовом наборе
accuracy = tf.reduce_mean(tf.cast(correct_prediction, "float"))
print("Train Accuracy:", accuracy.eval({X: X_train, Y: Y_train}))
print("Test Accuracy:", accuracy.eval({X: X_test, Y: Y_test}))
return parameters
Благодаря Ankit Seth я нашел ответ.
# это возвращает выходной слой прямой прогпации с обученными параметрами модели.
pred = forward_propagation(X, parameters)
predictions_sigm = pred.eval(feed_dict = {X: X_test})
predictions_sigm = sigmoid(predictions)
# pred.eval возвращает слой линейной регрессии для каждого класса отдельно, поэтому нам нужно выбрать индекс максимального из них. Я не использую softmax слой, так как выход должен быть таким же.
# инициализация списка классов
y_list = []
for i in range(predictions_sigm.shape[1]):
class_list = []
class_list.append(predictions_sigm[0][i])
class_list.append(predictions_sigm[1][i])
class_list.append(predictions_sigm[2][i])
class_list.append(predictions_sigm[3][i])
# получить индекс максимального значения сигмоиды. он будет соответствовать классу
y = np.argmax(class_list)
y_list.append(y)
# затем добавить y_list в dataframe
df['predicted_y'] = y_list
Создайте список входных данных, пропустите каждый вход через вашу модель и сохраните предсказание в список, затем вы можете запустить следующий код.
preds = YOUR_LIST_OF_PREDICTION_FROM_NN
result = pd.DataFrame(data={'Id': YOUR_TEST_DATAFRAME['Id'], 'PREDICTION_COLUM_NAME': preds})
result.to_csv(path_or_buf="submittion.csv", index = False, header = True)
Затем извлеките предсказание из тензора в Tensorflow.
Это извлечет данные из Tensor:
pred = forward_propagation(X, parameters)
predictions = pred.eval(feed_dict = {X: X_test})
.
Ответ или решение
Теория
TensorFlow — это мощный инструмент для разработки и тренировки моделей машинного обучения. Однако после того, как модель обучена, необходимо иметь возможность извлекать прогнозы и работать с ними в удобном формате для последующего анализа, визуализации или использования в бизнес-процессах. В вашем случае цель — сохранить предсказания в формате DataFrame
и добавить их в исходный тестовый набор данных.
pandas
— это библиотека Python, которая предоставляет структуры данных и инструменты для простого анализа данных, наиболее часто используемой структурой данных является DataFrame
. Эта структура данных позволяет легко манипулировать данными, выполнять различные операции и экспортировать результаты в удобные форматы (например, .csv
).
Пример
Рассмотрим, как можно организовать процесс получения предсказаний с использованием TensorFlow и добавления их в DataFrame
с помощью предложенного вами кода.
Получение предсказаний
Ваша модель может быть представлена функцией forward_propagation(X, parameters)
, где X
— входные данные, а parameters
— обученные параметры вашей нейронной сети.
Ключевые действия:
- Выполнить прямое распространение для получения выходов модели.
- Применить функцию
sigmoid
для получения вероятностей (если это необходимо). - Использовать
argmax
для определения наиболее вероятного класса для каждой записи (если это задача классификации).
Код этого этапа может выглядеть следующим образом:
# получение сырых предсказаний
pred = forward_propagation(X, parameters)
predictions_sigm = pred.eval(feed_dict={X: X_test})
# применение функции сигмоида
predictions_sigm = sigmoid(predictions_sigm)
# получение предсказанного класса для каждой записи
y_list = []
for i in range(predictions_sigm.shape[1]):
class_list = [predictions_sigm[j][i] for j in range(len(predictions_sigm))]
y = np.argmax(class_list)
y_list.append(y)
Добавление результатов в DataFrame
Предположим, что у вас есть DataFrame
, содержащий тестовый набор данных. Вы можете добавить в него новый столбец с предсказаниями следующим образом:
import pandas as pd
# предположим, что df это ваш DataFrame с тестовыми данными
df['predicted_y'] = y_list
Экспорт результатов
Экспортировать результаты в формате CSV можно с помощью метода to_csv
из библиотеки pandas
. Это полезно, если вы хотите сохранить результаты для последующего использования или передачи коллегам:
df.to_csv("output_predictions.csv", index=False, header=True)
Применение
Теперь, когда вы знаете, как реализовать весь процесс, можете применить этот подход к своей задаче:
- Убедитесь, что ваша модель готова к генерации предсказаний. Параметры модели должны быть оптимально настроены и сохранены.
- Используйте входные данные из тестового набора данных и получите прогнозируемые результаты с помощью вашей модели.
- Добавьте результаты в исходный
DataFrame
, поддерживая уникальные идентификаторы или другие полезные метаданные, чтобы легче было интерпретировать результаты. - Экспортируйте или визуализируйте данные для глубинного анализа.
Если следовать этим шагам систематически, вы сможете эффективно использовать силу TensorFlow для создания предсказательных моделей и извлечения данных в удобном для последующего использования формате.