Можно разделить набор данных, используя kfolds с тем же% класса, используя Julia 0.6? - PullRequest
0 голосов
/ 01 ноября 2018

В Julia 0.6 возможно ли разделить набор данных, используя kfolds с одинаковым% классов? Я имею в виду, если у меня есть три класса: синий, красный и зеленый, мне бы хотелось, чтобы у каждого k-кратного числа было одинаковое количество наблюдений (или очень близких) для каждого класса. Как 20% для синего, 20% для зеленого и 20% для красного.

Я использую

folds = kfolds((Xtrain,Ttrain),k=7)
(xtreino1,ytreino1), (xvali1,yvali1) = folds[1]

но он не возвращает одинаковое количество наблюдений для каждого класса.

Ответы [ 2 ]

0 голосов
/ 01 ноября 2018

Пакет MLBase имеет стратегию перекрестной проверки StratifiedKfold:

julia> collect(StratifiedKfold([:a, :a, :a, :b, :b, :c, :c, :a, :b, :c], 3))
3-element Array{Any,1}:
 [1,2,4,6,8,9,10]
 [3,4,5,7,8,10]
 [1,2,3,5,6,7,9]

Предполагается, что возвращенные массивы будут использоваться как индексы в исходных данных.

0 голосов
/ 01 ноября 2018

Не ясно, какой пакет вы используете, но вот как вы можете достичь желаемого результата в простой Джулии. Я предполагаю, что вектор 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! должен быть загружен в глобальную область по умолчанию, насколько я помню.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...