Как создать тренировочные наборы для K-Fold Cross Validation без Ski-Kit Learn? - PullRequest
2 голосов
/ 09 марта 2020

У меня есть набор данных, который содержит 95 строк и 9 столбцов, и я хочу выполнить 5-кратную перекрестную проверку. В тренинге первые 8 столбцов (функций) используются для прогнозирования девятого столбца. Мои тестовые наборы верны, но мой тренировочный набор х имеет размер (4,19,9), когда в нем должно быть только 8 столбцов, а мой тренировочный набор у (4,9), когда в нем должно быть 19 строк. Я неправильно индексирую подмассивы?

kdata = data[0:95,:] # Need total rows to be divisible by 5, so ignore last 2 rows 
np.random.shuffle(kdata) # Shuffle all rows
folds = np.array_split(kdata, k) # each fold is 19 rows x 9 columns

for i in range (k-1):
    xtest = folds[i][:,0:7] # Set ith fold to be test
    ytest = folds[i][:,8]
    new_folds = np.delete(folds,i,0)
    xtrain = new_folds[:][:][0:7] # training set is all folds, all rows x 8 cols
    ytrain = new_folds[:][:][8]   # training y is all folds, all rows x 1 col

1 Ответ

1 голос
/ 09 марта 2020

Добро пожаловать в переполнение стека.

После того, как вы создали новый фолд, вам нужно сложить его по строкам, используя np.row_stack().

Кроме того, я думаю, что вы неправильно нарезаете массив в Python или Numpy поведение нарезки равно [inclusive:exclusive], поэтому, когда вы указываете срез как [0:7], вы берете только 7 столбцов вместо 8 столбцов объектов, как вы и планировали.

Точно так же, если вы указываете 5-кратное значение для l oop, это должно быть range(k), что дает [0,1,2,3,4] вместо range(k-1), которое дает вам только [0,1,2,3].

Измененный код как например:

folds = np.array_split(kdata, k) # each fold is 19 rows x 9 columns
np.random.shuffle(kdata) # Shuffle all rows
folds = np.array_split(kdata, k)

for i in range (k):
    xtest = folds[i][:,:8] # Set ith fold to be test
    ytest = folds[i][:,8]
    new_folds = np.row_stack(np.delete(folds,i,0))
    xtrain = new_folds[:, :8]
    ytrain = new_folds[:,8]

    # some print functions to help you debug
    print(f'Fold {i}')
    print(f'xtest shape  : {xtest.shape}')
    print(f'ytest shape  : {ytest.shape}')
    print(f'xtrain shape : {xtrain.shape}')
    print(f'ytrain shape : {ytrain.shape}\n')

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

Fold 0
xtest shape  : (19, 8)
ytest shape  : (19,)
xtrain shape : (76, 8)
ytrain shape : (76,)

Fold 1
xtest shape  : (19, 8)
ytest shape  : (19,)
xtrain shape : (76, 8)
ytrain shape : (76,)

Fold 2
xtest shape  : (19, 8)
ytest shape  : (19,)
xtrain shape : (76, 8)
ytrain shape : (76,)

Fold 3
xtest shape  : (19, 8)
ytest shape  : (19,)
xtrain shape : (76, 8)
ytrain shape : (76,)

Fold 4
xtest shape  : (19, 8)
ytest shape  : (19,)
xtrain shape : (76, 8)
ytrain shape : (76,)
...