Как скормить словарь в модель Flux в Julia
Итак, у меня есть набор данных 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)
Я хочу использовать dict_x и dict_y в качестве ввода и вывода для модели Flux
1 ответ
Рассмотрим этот пример:
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)