Запись фрагментов sklearn LOO в фрейм данных pandas с индексом в качестве столбца метки

#python #pandas #scikit-learn #cross-validation #leave-one-out

#python #pandas #scikit-learn #перекрестная проверка #оставить-один-выход

Вопрос:

Я пытаюсь (плохо) использовать функциональность sklearn LOO, и то, что я хотел бы сделать, это добавить каждый обучающий разделенный набор в столбец фрейма данных с меткой для разделенного индекса. Итак, используя пример со страницы sklearn, но слегка измененный:

 import numpy as np
from sklearn.model_selection import LeaveOneOut

x = np.array([1,2])
y = np.array([3,4])
coords = np.column_stack((x,y))
z = np.array([8, 12])
loo = LeaveOneOut()
loo.get_n_splits(coords)

print(loo)
LeaveOneOut()
for train_index, test_index in loo.split(coords):
     print("TRAIN:", train_index, "TEST:", test_index)
     XY_train, XY_test = coords[train_index], coords[test_index]
     z_train, z_test = z[train_index], z[test_index]
     print(XY_train, XY_test, z_train, z_test)
 

Который возвращает:

 TRAIN: [1] TEST: [0]
[[2 4]] [[1 3]] [12] [8]
TRAIN: [0] TEST: [1]
[[1 3]] [[2 4]] [8] [12]
 

В моем случае я хотел бы записать каждое разделенное значение в фрейм данных следующим образом:

      X    Y   Ztrain    Ztest    split
0    1    2   8         12       0
1    3    4   8         12       0
2    1    2   12        8        1
3    3    4   12        8        1
 

И так далее.

Мотивация для этого заключается в том, что я хочу попробовать точную интерполяцию разреженных точечных данных. В идеале я хочу запустить интерполяцию / сетку для каждого из обучающих наборов LOO, а затем сложить их. Но я изо всех сил пытаюсь получить доступ к каждому набору поездов, чтобы затем использовать его во что-то вроде griddata

Любая помощь будет оценена по данной проблеме или подходу в целом.

Комментарии:

1. Похоже, разделение правильное, вам просто нужно сложить их, чтобы получить ожидаемый фрейм данных.

2. Спасибо @QuangHoang — извините за боль, но как мне это сделать?

Ответ №1:

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

 df = []
for train_index, test_index in loo.split(coords):
    x = pd.DataFrame({'XY_train':coords[train_index][0],
    'XY_test':coords[test_index][0],
    'Ztrain':z[train_index][0],
    'Ztest':z[test_index][0]})
    df.append(x)
df = pd.concat(df)
df

   XY_train  XY_test  Ztrain  Ztest
0         2        1      12      8
1         4        3      12      8
0         1        2       8     12
1         3        4       8     12