Разделение данных на признаки/метки и обучение/тестирование после чтения из csv файла.

Вопрос или проблема

Мне нужно прочитать данные из файла 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. Не забывайте преобразовывать категориальные переменные и всегда проверяйте размеры ваших выборок. Используйте этот подход для успешного выполнения задач машинного обучения, и успех не заставит себя ждать.

Если у вас есть дополнительные вопросы или вам нужна помощь, не стесняйтесь обратиться за консультацией.

Оцените материал
Добавить комментарий

Капча загружается...