ValueError: Найдены входные переменные с несовпадающим числом образцов: [0, 6]

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

Я пытаюсь вставить некоторые данные в алгоритм, но получаю эту ошибку:

ValueError: Найдены входные переменные с несоответствующим числом образцов: [0, 6]

Как я могу это решить?

Вот мой код ниже:

#Импорт всех библиотек
from connect_db import connect_db
import pandas as pd
from pathlib import Path
import matplotlib.pyplot as plt
import matplotlib as mpl
import datetime
import numpy as np
from sklearn.ensemble import RandomForestClassifier
from sklearn.model_selection import train_test_split

#Информация о доступе к базе данных
DB_CONFIG = {
    'host': 'localhost',
    'database': 'test_db',
    'user': 'root',
    'user_pass': 'root'
}

#Создать функцию парсера даты
def dateparser(s):
    return datetime.datetime.strptime(s, '%Y-%m-%d %H:%M:%S')

#Инициализировать классификатор алгоритма
clf = RandomForestClassifier(random_state=0)

#Инициализировать скрипт подключения
connect_db = connect_db(host=DB_CONFIG['host'],
                        database=DB_CONFIG['database'],
                        user=DB_CONFIG['user'],
                        password=DB_CONFIG['user_pass'])

#Создать подключение
cnx = connect_db.connect()

#Создать курсор для работы с базой данных
cursor = cnx.cursor()

#Создать движок для преобразования csv файла в sql таблицу.
engine = connect_db.create_engine()

mpl.rcParams['agg.path.chunksize'] = 10000

#Открыть csv файл и передать его в sql таблицу
with open(Path("databases/weather_data.csv")) as file:
    #Прочитать файл, используя функцию для преобразования даты в правильный формат.
    csv_data = pd.read_csv(file, parse_dates=['Date_Time'], date_parser=dateparser)

    #Преобразовать файл в sql базу данных и загрузить данные.
    sql_data = csv_data.to_sql(name=f"{DB_CONFIG['database']}",
                               con=engine,
                               if_exists="replace",
                               chunksize=100)
    #Прочитать sql таблицу
    sql_data = pd.read_sql_table('test_db', engine)

#Изменить порядок столбцов для большей гибкости 
sql_data = sql_data[['Location','Date_Time','Temperature_C','Humidity_pct','Wind_Speed_kmh', 'Precipitation_mm']]

#Срез данных.
y = np.array(sql_data.iloc[5])
x = np.array(sql_data.loc['Temperature_C':'Wind_Speed_kmh'])

#Разделить данные на обучающие и тестовые
x_train, x_test, y_train, y_test = train_test_split(x, y, test_size=0.33)

#Вставить данные в алгоритм
clf.fit(x_train, y_train)

#Проверить данные
y_pred = clf.predict(x_test)

#Построить и показать данные для визуализации
plt.scatter(x_test, y_test, color="red")
plt.plot(x_test, y_pred, color="blue", linewidth=2)
plt.show()
```

Я полагаю, вы неправильно используете .loc[] и .iloc[]. iloc[5] возвращает вам шестую строку, а не шестой столбец. Для шестого столбца вам нужно использовать .iloc[:, 5]. Для loc, я думаю, .loc[:, ‘Temperature_C’:’Wind_Speed_kmh’] должно сработать, но не уверен. Посмотрите документацию pandas.

Ответ или решение

Ошибка ValueError: Found input variables with inconsistent numbers of samples: [0, 6] может быть вызвана несколькими причинами, связанными с особенностями работы с данными в Python, особенно если вы используете библиотеку Pandas для обработки данных и библиотеку Scikit-learn для машинного обучения. Давайте разберем основные моменты и предложим возможные решения.

1. Причина ошибки

Ошибка говорит о том, что вы пытаетесь обучить модель (в вашем случае классификатор RandomForestClassifier) с использованием двух массивов, у которых разное количество образцов. В данном контексте:

  • Первый массив (например, y) имеет 0 образцов.
  • Второй массив (например, x) имеет 6 образцов.

Это может произойти, если вы неправильно извлекли данные из датафрейма Pandas. Давайте внимательно посмотрим на ваш код.

2. Ошибка в работе с Pandas

Согласно вашему коду, вы используете следующие строки для извлечения значений для x и y:

y = np.array(sql_data.iloc[5])
x = np.array(sql_data.loc['Temperature_C':'Wind_Speed_kmh'])

2.1. Использование iloc и loc

В строке y = np.array(sql_data.iloc[5]) вы извлекаете шестую строку датафрейма (а не шестой столбец). В вашем случае это может быть причиной того, что массив y оказывается пустым, если в строке нет значений. Для того чтобы извлечь значение из определенного столбца, следует использовать:

y = np.array(sql_data.iloc[:, 5])  # Получение значений из шестого столбца

2.2. Обработка массива x

Для извлечения значений из нескольких столбцов рекомендуется использовать loc корректным образом. Правильный вариант должен выглядеть так:

x = np.array(sql_data.loc[:, 'Temperature_C':'Wind_Speed_kmh'])

3. Исправленный код

Предлагаю внести следующие изменения в ваш код:

# Изменение для извлечения корректных данных из датафрейма
y = np.array(sql_data.iloc[:, 5])  # Получить значения из шестого столбца, например, для целевой переменной
x = np.array(sql_data.loc[:, 'Temperature_C':'Wind_Speed_kmh'])  # Получить значения из столбцов от 'Temperature_C' до 'Wind_Speed_kmh'

4. Разделение данных на обучающую и тестовую выборки

Выбранные вами массивы x и y теперь должны иметь одинаковую длину (число строк). После внесения изменений вы можете снова выполнить разделение данных:

x_train, x_test, y_train, y_test = train_test_split(x, y, test_size=0.33)

5. Заключение

Убедитесь, что на выходе x и y имеют совпадающее количество примеров, и ваш код больше не вызовет ошибку ValueError. Ошибки подобного рода часто возникают из-за неправильной индексации или использования методов библиотеки Pandas. Регулярно проверяйте размеры и формы получаемых массивов, чтобы избежать подобных проблем в будущем.

Если у вас есть дополнительные вопросы, не стесняйтесь обращаться. Успехов в вашей работе с данными!

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

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