JuliaML / LIBSVM.jl

LIBSVM bindings for Julia
Other
88 stars 35 forks source link

Error in Readme example #57

Closed cossio closed 3 years ago

cossio commented 4 years ago

Just running the example from the README:

using RDatasets, LIBSVM

# Load Fisher's classic iris data
iris = dataset("datasets", "iris")

# LIBSVM handles multi-class data automatically using a one-against-one strategy
labels = convert(Vector, iris[:Species])

# First dimension of input data is features; second is instances
instances = convert(Array, iris[:, 1:4])'

# Train SVM on half of the data using default parameters. See documentation
# of svmtrain for options
model = svmtrain(instances[:, 1:2:end], labels[1:2:end]);

I got this error:

ERROR: MethodError: no method matching LIBSVM.SupportVectors(::Int32, ::Array{Int32,1}, ::CategoricalArray{String,1,UInt8,String,CategoricalString{UInt8},Union{}}, ::Array{Float64,2}, ::Array{Int32,1}, ::Array{LIBSVM.SVMNode,1})
Closest candidates are:
  LIBSVM.SupportVectors(::Int32, ::Array{Int32,1}, ::Array{T,1}, ::AbstractArray{U,2}, ::Array{Int32,1}, ::Array{LIBSVM.SVMNode,1}) where {T, U} at /home/cossio/.julia/packages/LIBSVM/Zv8gE/src/LIBSVM.jl:17
  LIBSVM.SupportVectors(::LIBSVM.SVMModel, ::Any, ::Any) at /home/cossio/.julia/packages/LIBSVM/Zv8gE/src/LIBSVM.jl:25
Stacktrace:
 [1] LIBSVM.SupportVectors(::LIBSVM.SVMModel, ::CategoricalArray{String,1,UInt8,String,CategoricalString{UInt8},Union{}}, ::Array{Float64,2}) at /home/cossio/.julia/packages/LIBSVM/Zv8gE/src/LIBSVM.jl:39
 [2] LIBSVM.SVM(::LIBSVM.SVMModel, ::CategoricalArray{String,1,UInt8,String,CategoricalString{UInt8},Union{}}, ::Array{Float64,2}, ::Nothing, ::Array{CategoricalString{UInt8},1}, ::Type{T} where T, ::LIBSVM.Kernel.KERNEL) at /home/cossio/.julia/packages/LIBSVM/Zv8gE/src/LIBSVM.jl:72
 [3] svmtrain(::Array{Float64,2}, ::CategoricalArray{String,1,UInt8,String,CategoricalString{UInt8},Union{}}; svmtype::Type{T} where T, kernel::LIBSVM.Kernel.KERNEL, degree::Int64, gamma::Float64, coef0::Float64, cost::Float64, nu::Float64, epsilon::Float64, tolerance::Float64, shrinking::Bool, probability::Bool, weights::Nothing, cachesize::Float64, verbose::Bool, nt::Int64) at /home/cossio/.julia/packages/LIBSVM/Zv8gE/src/LIBSVM.jl:352
 [4] svmtrain(::Array{Float64,2}, ::CategoricalArray{String,1,UInt8,String,CategoricalString{UInt8},Union{}}) at /home/cossio/.julia/packages/LIBSVM/Zv8gE/src/LIBSVM.jl:313
 [5] top-level scope at REPL[8]:3
cossio commented 4 years ago

Same thing happens on the Scikit API example

using LIBSVM
using RDatasets: dataset

#Classification C-SVM
iris = dataset("datasets", "iris")
labels = convert(Vector, iris[:, :Species])
instances = convert(Array, iris[:, 1:4])
model = fit!(SVC(), instances[1:2:end, :], labels[1:2:end])

gives the error:

ERROR: MethodError: no method matching fit!(::SVC, ::Array{Float64,2}, ::CategoricalArrays.CategoricalArray{String,1,UInt8,String,CategoricalArrays.CategoricalString{UInt8},Union{}})
Closest candidates are:
  fit!(::Union{LIBSVM.AbstractSVC, LIBSVM.AbstractSVR}, ::AbstractArray{T,2} where T) at /home/cossio/.julia/packages/LIBSVM/Zv8gE/src/ScikitLearnAPI.jl:68
  fit!(::Union{LIBSVM.AbstractSVC, LIBSVM.AbstractSVR}, ::AbstractArray{T,2} where T, ::Array{T,1} where T) at /home/cossio/.julia/packages/LIBSVM/Zv8gE/src/ScikitLearnAPI.jl:68
  fit!(::LinearSVC, ::AbstractArray{T,2} where T, ::Array{T,1} where T) at /home/cossio/.julia/packages/LIBSVM/Zv8gE/src/ScikitLearnAPI.jl:100
Stacktrace:
 [1] top-level scope at REPL[6]:1
Jdbeck66 commented 3 years ago

Same thing here. Would like to use this package to complete an SVR on fitness data related to ribozymes

jyanar commented 3 years ago

The CategoricalArray type is throwing it off, try converting the labels like this instead:

labels = convert(Vector{String}, iris[:Species])

Which will just give you a regular Array{String,1}.