Как скормить словарь модели Flux в Юлии - PullRequest
1 голос
/ 23 сентября 2019

Итак, у меня есть набор данных 20000x4, где в 4 столбцах есть строки.Первая - это описание, а остальные три - категории, последняя - та, которую я хочу предсказать.Я маркировал каждое слово первого столбца и сохранял его в словаре с соответствующим значением Int, а другие столбцы изменил на числовые значения.Теперь у меня возникли проблемы с пониманием того, как передать эти данные в модель Flux.

Согласно документации, я должен использовать « набор данных для обучения (обычно набор входов x и целевых выходов y) ».В примере он разделяет данные x и y .Но как я могу сделать это с помощью словаря плюс два числовых столбца?

Редактировать:

Вот минимальный пример того, что у меня есть сейчас:

using WordTokenizers
using DataFrames

dataframe = DataFrame(Description = ["It has pointy ears", "It has round ears"], Size = ["Big", "Small"], Color = ["Black", "Yellow"], Category = ["Dog", "Cat"])

dict_x = Dict{String, Int64}()
dict_y = Dict{String, Int64}()

function words_to_numbers(data, column, dict)
    i = 1
    for row in range(1, stop=size(data, 1))
        array_of_words = tokenize(data[row, column])
        for (index, word) in enumerate(array_of_words)
            if haskey(dict, word)
                continue
            else
                dict[word] = i
                i += 1
            end
        end
    end
end

function categories_to_numbers(data, column, dict)
    i = 1
    for row in range(1, stop=size(data, 1))
        if haskey(dict, data[row, column])
            continue
        else
            dict[data[row, column]] = i
            i += 1
        end
    end
end

words_to_numbers(dataframe, 1, dict_x)
categories_to_numbers(dataframe, 4, dict_y)

Iхочу использовать dict_x и dict_y в качестве входных и выходных данных для модели Flux

1 Ответ

1 голос
/ 23 сентября 2019

Рассмотрим этот пример:

using DataFrames

df = DataFrame()
df.food = rand(["apple", "banana", "orange"], 20)

multiplier(fruit) = (1 + (0.1 * rand())) * (fruit == "apple" ? 95 : 
    fruit == "orange" ? 45 : 105)
foodtoken(f) = (fruit == "apple" ? 0 : fruit == "orange" ? 2 : 3)

df.calories = multiplier.(df.food)
foodtoken(f) = (fruit == "apple" ? 0 : fruit == "orange" ? 2 : 3)

fooddict = Dict(fruit => (fruit == "apple" ? 0 : fruit == "orange" ? 2 : 3)
    for fruit in df.food)

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

df.token = map(x -> fooddict[x], df.food)

println(df)

Теперь вы сможете запускать прогноз с помощью df.token.в качестве входных данных и df.calories в качестве выходных.

========== приложение после того, как вы добавили следующий код: ===========

В вашем модифицированном примере вам просто нужна вспомогательная функция:

function colvalue(s, dict)
    total = 0
    for (k, v) in dict
        if occursin(k, s)
            total += 10^v
        end
    end
    total
end


words_to_numbers(dataframe, 1, dict_x)
categories_to_numbers(dataframe, 4, dict_y)

dataframe.descripval = map(x -> colvalue(x, dict_x), dataframe.Description)
dataframe.catval = map(x -> colvalue(x, dict_y), dataframe.Category)

println(dataframe)
...