Не ясно, какой пакет вы используете, но вот как вы можете достичь желаемого результата в простой Джулии. Я предполагаю, что вектор y
содержит цель для вашей модели:
using Random
function balanced_kfold(y::Vector, k::Integer)
d = Dict{eltype(y), Vector{Int}}()
folds = [Int[] for i in 1:k]
for (i, v) in enumerate(y)
push!(get!(d, v, Int[]), i)
end
for val in values(d)
shuffle!(val)
for (i, pos) in enumerate(val)
push!(folds[mod1(i, k)], pos)
end
end
folds
end
В этом коде folds
будет содержать индексы записей каждого сгиба. Обратите внимание, что в этом коде вы можете получить немного дисбаланса в размерах сгибов, поскольку мы пытаемся сбалансировать как размер сгиба, так и распределение цели в каждом сгибе. Наконец, код не выполняет никаких проверок y
и k
, если они действительны.
EDIT: теперь я вижу, что вы используете Julia 0.6 - в этом случае все должно работать, но вам не нужен оператор using Random
, поскольку shuffle!
должен быть загружен в глобальную область по умолчанию, насколько я помню.