Как исправить значение индекса, которое я использую для X_test и y_test?

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

Я пишу код для SVR. Поэтому я сгенерировал свой код в соответствии с требованиями. Но я застрял на написании кода для индекса цикла for для X_test и y_test. Мне нужно написать код так, чтобы он ассоциировался со строкой в наборах данных непосредственно после X_train и y_train. Таким образом, их индекс должен быть +1 от конечного индекса X_train и y_train.

Например:

  • В первой итерации (т.е. когда i=0), мы используем первые 1000 строк для обучения и следующую строку (т.е. 1001-ю строку) для тестирования

  • Во второй итерации (т.е. когда i=1), мы используем строки с 1 по 1001 для обучения и следующую строку (т.е. 1002-ю строку) для тестирования

  • В третьей итерации (т.е. когда i=2), мы используем строки с 2 по 1002 для обучения и следующую строку (т.е. 1003-ю строку) для тестирования и так далее.

Мой полный код:

import pandas as pd
import numpy as np

# Создадим тестовый набор данных
dataset = pd.DataFrame(data= np.random.rand(2000,22))
dataset['age'] = np.random.randint(2, size=2000)

# Отделим цель от других признаков
target = dataset['age']
data = dataset.drop('age', axis = 1)

X_train, y_train = data.loc[:1000], target.loc[:1000]

X_test,  y_test  = data.loc[1001], target.loc[1001] 

X_test = np.array(X_test).reshape(1, -1)
print(X_test.shape)

SupportVectorRefModel = SVR()
SupportVectorRefModel.fit(X_train, y_train)

y_pred = SupportVectorRefModel.predict(X_test)
y_pred

y_pred_list = []
y_test_list = []

for i in range(1, 2000):

    X_train, y_train = dataset.iloc[i:1000+i], target.iloc[i:1000+i]
    X_test, y_test = dataset.iloc[i], target.iloc [i]

    X_test = np.array(X_test).reshape(1, -1)
    print(X_test.shape)

    SupportVectorRefModel = SVR()
    SupportVectorRefModel.fit(X_train, y_train)
    y_pred = SupportVectorRefModel.predict(X_test)

    y_pred_list.append(y_pred)

    y_test_list.append(y_test)

print(y_test_list, y_pred_list)

Я хочу обновить свой код по указанному ниже:

 X_test, y_test = dataset.iloc[i], target.iloc [i]

Как я могу обновить эту строку индекса в соответствии с указанными выше требованиями?

Я изменил значения диапазона в цикле и индексацию для обучающих и тестовых данных. (Также кажется, что вы используете dataset вместо data по ошибке.)

i:(999 + i) содержит местоположения строк, которые будут увеличиваться на единицу по мере выполнения цикла.

for i in range(0, 999):

    X_train, y_train = data.iloc[i:(999 + i)], target.iloc[i:(999 + i)]
    X_test, y_test = data.iloc[i + 1000], target.iloc [i + 1000]

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

Безусловно, исправление индексации данных для X_test и y_test в указанном вами коде имеет важное значение для правильной работы модели SVR. Давайте подробно разберем, как сделать это корректно в вашем контексте.

Проблема индексации и код

Ваша задача состоит в том, чтобы создать методику сдвига обучающего и тестового набора данных одним элементом за одну итерацию, при этом индекс тестового набора данных должен всегда быть на один больше последнего индекса тренировочного набора.

Исправление индексации

На текущий момент в предложенном фрагменте кода вы неправильно определяете индексацию для выборок. Давайте представим исправленный код и объясним его.

Измененный код:

import pandas as pd
import numpy as np
from sklearn.svm import SVR

# Генерация тестового датасета
dataset = pd.DataFrame(data=np.random.rand(2000, 22))
dataset['age'] = np.random.randint(2, size=2000)

# Разделение целевой переменной от признаков
target = dataset['age']
data = dataset.drop('age', axis=1)

y_pred_list = []
y_test_list = []

# Процесс итерации по данным
for i in range(1000, 1999):
    X_train, y_train = data.iloc[i-1000:i], target.iloc[i-1000:i]
    X_test, y_test = data.iloc[i:i+1], target.iloc[i:i+1]

    # Приведение тестовых данных к правильной форме
    X_test = np.array(X_test).reshape(1, -1)

    model = SVR()
    model.fit(X_train, y_train)

    y_pred = model.predict(X_test)

    y_pred_list.append(y_pred[0])
    y_test_list.append(y_test.iloc[0])

# Отображение результатов
print("Тестовые метки:", y_test_list)
print("Предсказанные метки:", y_pred_list)

Объяснение изменений:

  1. Индексация тренирующей выборки:

    • В цикл for начнем с i=1000, так как первый X_train и y_train должны занимать первые 1000 элементов. Поскольку мы начинаем с 1000, используя range(1000, 1999), мы покрываем все необходимые итерации: от 0 до 1999 вклюительно, последний тестовый индекс будет 1999.
  2. Индексация тестовой выборки:

    • X_test и y_test определяются как data.iloc[i:i+1] и target.iloc[i:i+1], соответственно. Это гарантирует, что каждый раз берется следующий элемент после части для тренировочной выборки.
  3. Использование reshape:

    • Мы используем reshape(1, -1) для обеспечения того, что наш тестовый набор данных выглядит как двумерный массив, как того требует метод predict в SVR.

Этот подход обеспечит корректное сдвиговое разделение данных на тренировочные и тестовые наборы, необходимое для вашего анализа.

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

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