Вопрос или проблема
Я пишу код для 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)
Объяснение изменений:
-
Индексация тренирующей выборки:
- В цикл
for
начнем сi=1000
, так как первыйX_train
иy_train
должны занимать первые 1000 элементов. Поскольку мы начинаем с 1000, используяrange(1000, 1999)
, мы покрываем все необходимые итерации: от 0 до 1999 вклюительно, последний тестовый индекс будет 1999.
- В цикл
-
Индексация тестовой выборки:
X_test
иy_test
определяются какdata.iloc[i:i+1]
иtarget.iloc[i:i+1]
, соответственно. Это гарантирует, что каждый раз берется следующий элемент после части для тренировочной выборки.
-
Использование reshape:
- Мы используем
reshape(1, -1)
для обеспечения того, что наш тестовый набор данных выглядит как двумерный массив, как того требует методpredict
в SVR.
- Мы используем
Этот подход обеспечит корректное сдвиговое разделение данных на тренировочные и тестовые наборы, необходимое для вашего анализа.