Документация Engee

Краткое руководство по началу работы

Краткий пример

Давайте создадим классификатор для классического набора данных Iris. Если пакет RDatasets отсутствует, добавьте его с помощью Pkg.add.

julia> using RDatasets: dataset

julia> iris = dataset("datasets", "iris");

julia> first(iris, 5)
5×5 DataFrame
│ Row │ SepalLength │ SepalWidth │ PetalLength │ PetalWidth │ Species │
│     │ Float64     │ Float64    │ Float64     │ Float64    │ Cat…    │
├─────┼─────────────┼────────────┼─────────────┼────────────┼─────────┤
│ 1   │ 5.1         │ 3.5        │ 1.4         │ 0.2        │ setosa  │
│ 2   │ 4.9         │ 3.0        │ 1.4         │ 0.2        │ setosa  │
│ 3   │ 4.7         │ 3.2        │ 1.3         │ 0.2        │ setosa  │
│ 4   │ 4.6         │ 3.1        │ 1.5         │ 0.2        │ setosa  │
│ 5   │ 5.0         │ 3.6        │ 1.4         │ 0.2        │ setosa  │

ScikitLearn.jl ожидает массивы, но можно использовать и DataFrames (см. соответствующий раздел руководства).

julia> X = convert(Array, iris[!, [:SepalLength, :SepalWidth, :PetalLength, :PetalWidth]]) #подмножество исходных данных, а не копия
150×4 Array{Float64,2}:
 5.1  3.5  1.4  0.2
 4.9  3.0  1.4  0.2
 4.7  3.2  1.3  0.2
 4.6  3.1  1.5  0.2
 5.0  3.6  1.4  0.2
 5.4  3.9  1.7  0.4
 4.6  3.4  1.4  0.3
 5.0  3.4  1.5  0.2
 4.4  2.9  1.4  0.2
 4.9  3.1  1.5  0.1
 ⋮
 6.9  3.1  5.1  2.3
 5.8  2.7  5.1  1.9
 6.8  3.2  5.9  2.3
 6.7  3.3  5.7  2.5
 6.7  3.0  5.2  2.3
 6.3  2.5  5.0  1.9
 6.5  3.0  5.2  2.0
 6.2  3.4  5.4  2.3
 5.9  3.0  5.1  1.8

julia> y = convert(Array, iris[!, :Species])
150-element Array{String,1}:
 "setosa"
 "setosa"
 "setosa"
 "setosa"
 "setosa"
 "setosa"
 "setosa"
 "setosa"
 "setosa"
 "setosa"
 ⋮
 "virginica"
 "virginica"
 "virginica"
 "virginica"
 "virginica"
 "virginica"
 "virginica"
 "virginica"
 "virginica"

Далее мы загрузим модель LogisticRegression из библиотеки scikit-learn. Для этого потребуется scikit-learn. См. раздел Установка.

julia> using ScikitLearn

julia> @sk_import linear_model: LogisticRegression
PyObject <class 'sklearn.linear_model._logistic.LogisticRegression'>

Конструктор каждой модели принимает гиперпараметры (такие как сила регрессии, нужно ли адаптировать перехват, тип штрафа и т. д.) в качестве именованных аргументов. Дополнительные сведения см. в ?LogisticRegression.

julia> model = LogisticRegression(fit_intercept=true, max_iter = 200)
PyObject LogisticRegression(max_iter=200)

Затем мы обучим модель и оценим ее точность на обучающем наборе:

julia> fit!(model, X, y);

julia> accuracy = score(model, X, y)
0.9733333333333334

julia> println("accuracy: $accuracy")
accuracy: 0.9733333333333334

Перекрестная проверка

Будут обучены пять моделей на пяти обучающих или тестовых разбиениях X и y и возвращена точность тестового набора каждой из них:

julia> using ScikitLearn.CrossValidation: cross_val_score

julia> cross_val_score(LogisticRegression(max_iter=130), X, y; cv=5)  # 5-кратная
5-element Array{Float64,1}:
 0.9666666666666667
 1.0
 0.9333333333333333
 0.9666666666666667
 1.0

Дополнительные сведения см. в этом руководстве.

Настройка гиперпараметра

LogisticRegression имеет параметр силы регуляризации C (чем меньше, тем сильнее). Мы можем использовать алгоритмы поиска по сетке для нахождения оптимального C.

GridSearchCV опробует все значения C в 0.1:0.1:2.0 и возвратит то, которое имеет наибольшую производительность при перекрестной проверке.

jldoctest quickstart julia> using ScikitLearn.GridSearch: GridSearchCV


julia> gridsearch = GridSearchCV(LogisticRegression(max*iter=200), Dict(:C => 0.1:0.1:2.0)) GridSearchCV   estimator: PyCall.PyObject   param*grid: Dict{Symbol,StepRangeLen{Float64,Base.TwicePrecision{Float64},Base.TwicePrecision{Float64}}}   scoring: Nothing nothing   loss*func: Nothing nothing   score*func: Nothing nothing   fit*params: Dict{Any,Any}   n*jobs: Int64 1   iid: Bool true   refit: Bool true   cv: Nothing nothing   verbose: Int64 0   error*score: String "raise"   scorer*: Nothing nothing   best*params*: Nothing nothing   best*score*: Nothing nothing   grid*scores*: Nothing nothing   best*estimator*: Nothing nothing


julia> fit!(gridsearch, X, y);


julia> println("Best parameters: :(gridsearch.best_params_)") Best parameters: Dict{Symbol,Any}(:C => 0.6)

Наконец, мы построим график точности перекрестной проверки и C.

@setup quickstart_ex using RDatasets iris = dataset("datasets", "iris") X = convert(Array, iris[!, [:SepalLength, :SepalWidth, :PetalLength,          :PetalWidth]]) y = convert(Array, iris[!,:Species])


using ScikitLearn using ScikitLearn.GridSearch: GridSearchCV @sk*import linear*model: LogisticRegression


gridsearch = GridSearchCV(LogisticRegression(max_iter=200), Dict(:C => 0.1:0.1:2.0)) fit!(gridsearch, X, y)
@repl quickstart*ex using PyPlot, Statistics plot([cv*res.parameters[:C] for cv*res in gridsearch.grid*scores*],      [mean(cv*res.cv*validation*scores) for cv*res in gridsearch.grid*scores_]) savefig("gridplot.svg");nothing #hide
gridplot

Сохранение модели на диск

Модели Python и Julia можно сохранить на диск.

jldoctest quickstart julia> import JLD, PyCallJLD


julia> JLD.save("my_model.jld", "model", model)


julia> model = JLD.load("my*model.jld", "model")    # Загрузить обратно ┌ Warning: type PyCallJLD.PyObjectSerialization not present in workspace; reconstructing └ @ JLD ~/.julia/packages/JLD/uVJmd/src/jld*types.jl:722 JLD.var"##PyCallJLD.PyObjectSerialization#253"(UInt8[0x80, 0x03, 0x63, 0x73, 0x6b, 0x6c, 0x65, 0x61, 0x72, 0x6e  …  0x2e, 0x32, 0x32, 0x2e, 0x31, 0x71, 0x43, 0x75, 0x62, 0x2e])