Краткое руководство по началу работы
Краткий пример
Давайте создадим классификатор для классического набора данных 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
Сохранение модели на диск
Модели 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])