- Вопрос или проблема
- Ответ или решение
- Разделение данных на признаки и метки, а также на обучающую и тестовую выборки после чтения из CSV файла
- Шаг 1: Чтение данных из CSV файла
- Шаг 2: Разделение данных на признаки и метки
- Шаг 3: Разделение данных на обучающую и тестовую выборки
- Шаг 4: Проверка размеров выборок
- Шаг 5: Обучение модели
- Заключение
Вопрос или проблема
Мне нужно прочитать данные из файла CSV, а затем разделить эти данные на признаки и метки, а затем на обучающую и тестовую выборку. Однако возникает несколько проблем снова и снова. Ниже приведен код, который я пытался использовать, и ошибка:
ValueError: не удалось преобразовать строку в число с плавающей запятой: 'mon'
на строке
Y: train_y})
Код для линейной регрессии:
import pandas as pd
from sklearn.model_selection import train_test_split
import tensorflow as tf
import numpy as np
learning_rate = 0.01
training_epochs = 1000
display_step = 50
data = pd.read_csv('forestfires.csv')
y = data.temp
x = data.drop('temp', axis=1)
train_x, test_x, train_y, test_y = train_test_split(x, y,test_size=0.2)
n_samples = train_x.shape[0]
n_features = train_x.shape[1]
X = tf.placeholder('float', [None, n_features])
Y = tf.placeholder('float', [None, 1])
# Веса модели.
W = tf.Variable(np.random.randn(n_features, 1), dtype="float32")
b = tf.Variable(np.random.randn(1), dtype="float32")
# Построение линейной модели.
prediction = tf.matmul(X, W) + b
loss = tf.reduce_sum(tf.pow(prediction - Y, 2))/(2 * n_samples)
optimizer = tf.train.GradientDescentOptimizer(learning_rate).minimize(loss)
# Начать обучение.
with tf.Session() as sess:
sess.run(tf.global_variables_initializer())
for epoch in range(training_epochs):
for (x, y) in zip(train_x, train_y):
sess.run(optimizer, feed_dict={X: train_x,
Y: train_y})
# Отобразить логи за эпоху.
if (epoch + 1) % display_step == 0:
c = sess.run(loss, feed_dict={X: train_x,
Y: train_y})
print ('Эпоха:', '%04d' % (epoch+1), 'стоимость=","{:.9f}'.format(c), \
'W=', sess.run(W), 'b=', sess.run(b))
print ('Обучение завершено!')
training_cost = sess.run(loss, feed_dict={X: train_x,
Y: train_y})
print ('Обучающая стоимость=", training_cost, "W=', sess.run(W), 'b=', sess.run(b), '\n')
# Графическое отображение.
plt.plot(train_x, train_y, 'ro', label="Исходные данные")
plt.plot(train_x, sess.run(W) * train_x + sess.run(b), label="Аппроксимирующая линия")
plt.legend()
plt.show()
Может ли кто-нибудь помочь мне правильно прочитать данные в общих чертах? Снимок данных:
Я точно не знаю, каковы ваши данные, но y = data.temp
может быть серией, содержащей строковые значения, которые необходимо преобразовать в значения с плавающей запятой. Попробуйте изменить это на следующее:
y = data.temp.astype(float)
Итак, вопрос заключается в том, чтобы понять эту ошибку ValueError, которую вы получаете.
Эта ошибка, как я полагаю, относится к вашему столбцу month
, который, я предполагаю, вы используете как признак для этой сети. Если да, то, поскольку это категориальная переменная, вам нужно будет изменить ее на представление с одним “горячим” кодом (https://machinelearningmastery.com/why-one-hot-encode-data-in-machine-learning/), потому что модель не может интерпретировать строку, поэтому возникает ошибка ValueError.
Ответ или решение
Разделение данных на признаки и метки, а также на обучающую и тестовую выборки после чтения из CSV файла
В этом ответе я подробно объясню, как правильно считывать данные из CSV файла, разделять их на признаки и метки, а также делить на обучающую и тестовую выборки. Вы также узнаете, как избежать распространенных ошибок, таких как возникновение ValueError: could not convert string to float
, что часто связано с несоответствием типов данных.
Шаг 1: Чтение данных из CSV файла
Для начала нам нужно использовать библиотеку pandas
для чтения данных из файла. Предположим, что ваш CSV файл называется forestfires.csv
.
import pandas as pd
# Чтение данных из CSV файла
data = pd.read_csv('forestfires.csv')
Шаг 2: Разделение данных на признаки и метки
После того, как данные загружены, мы выделим целевую переменную (метки) и признаки:
# Определяем метки
y = data['temp'].astype(float) # Приведение к типу float, если в данных есть строки
# Определяем признаки
x = data.drop('temp', axis=1)
# Важно проверить наличие категориальных переменных
print(data.dtypes)
Если в ваших признаках есть категориальные данные (например, столбец month
с именами месяцев), их необходимо преобразовать. Это можно сделать с помощью один_hot-кодирования:
# Используем one-hot кодирование для категориальных признаков
x = pd.get_dummies(x, drop_first=True) # drop_first предотвращает мультиколлинеарность
Шаг 3: Разделение данных на обучающую и тестовую выборки
С помощью функции train_test_split
из библиотеки sklearn
мы разделим данные на обучающую и тестовую выборки:
from sklearn.model_selection import train_test_split
# Разделение данных на обучающую и тестовую выборки
train_x, test_x, train_y, test_y = train_test_split(x, y, test_size=0.2, random_state=42)
Шаг 4: Проверка размеров выборок
После разделения данных всегда полезно проверить размеры получившихся выборок:
print(train_x.shape, train_y.shape)
print(test_x.shape, test_y.shape)
Шаг 5: Обучение модели
После того как данные подготовлены, вы можете перейти к построению модели. Убедитесь, что используете корректные данные в качестве входов и выходов при обучении.
import tensorflow as tf
import numpy as np
learning_rate = 0.01
training_epochs = 1000
# Определяем количество признаков
n_features = train_x.shape[1]
# Плейсхолдеры
X = tf.placeholder('float', [None, n_features])
Y = tf.placeholder('float', [None, 1])
# Модель
W = tf.Variable(np.random.randn(n_features, 1), dtype="float32")
b = tf.Variable(np.random.randn(1), dtype="float32")
# Прогноз
prediction = tf.matmul(X, W) + b
loss = tf.reduce_sum(tf.pow(prediction - Y, 2)) / (2 * train_x.shape[0])
optimizer = tf.train.GradientDescentOptimizer(learning_rate).minimize(loss)
# Обучение модели
with tf.Session() as sess:
sess.run(tf.global_variables_initializer())
for epoch in range(training_epochs):
sess.run(optimizer, feed_dict={X: train_x, Y: train_y.values.reshape(-1, 1)})
if (epoch + 1) % 50 == 0:
c = sess.run(loss, feed_dict={X: train_x, Y: train_y.values.reshape(-1, 1)})
print(f'Epoch: {epoch + 1}, cost={c}, W={sess.run(W)}, b={sess.run(b)}')
print('Обучение завершено!')
Заключение
Следуя приведенным выше шагам, вы сможете правильно структурировать свои данные для обучения и избежать распространенных ошибок, таких как ValueError
. Не забывайте преобразовывать категориальные переменные и всегда проверяйте размеры ваших выборок. Используйте этот подход для успешного выполнения задач машинного обучения, и успех не заставит себя ждать.
Если у вас есть дополнительные вопросы или вам нужна помощь, не стесняйтесь обратиться за консультацией.