Follow WeChat public account: Xiaocheng Online
Follow the programmer’s homestead: Cheng Zhiwei’s blog
1. Load bag
(@v1.4) pkg> add LIBSVM
Updating registry at `C:\Users\cheng\.julia\registries\General`
Updating git-repo `https://github.com/JuliaRegistries/General.git`
Resolving package versions…
Installed MbedTLS_jll ──── v2.16.6+1
Installed LIBSVM ───────── v0.4.0
Installed OpenBLAS_jll ─── v0.3.9+5
Installed Fontconfig_jll ─ v2.13.1+12
Installed LIBLINEAR ────── v0.5.1
Updating `C:\Users\cheng\.julia\environments\v1.4\Project.toml`
[b1bec4e5] + LIBSVM v0.4.0
Updating `C:\Users\cheng\.julia\environments\v1.4\Manifest.toml`
[a3f928ae] ↑ Fontconfig_jll v2.13.1+11 ⇒ v2.13.1+12
[2d691ee1] + LIBLINEAR v0.5.1
[b1bec4e5] + LIBSVM v0.4.0
[c8ffd9c3] ↑ MbedTLS_jll v2.16.6+0 ⇒ v2.16.6+1
[4536629a] ↑ OpenBLAS_jll v0.3.9+4 ⇒ v0.3.9+5
Building LIBLINEAR → `C:\Users\cheng\.julia\packages\LIBLINEAR\yTdp5\deps\build.log`
Building LIBSVM ───→ `C:\Users\cheng\.julia\packages\LIBSVM\5Z99T\deps\build.log`
(@v1.4) pkg> ^C
2. Load the data set
julia> using RDatasets
julia> iris = dataset(“datasets”,”iris”)
150×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 │
│ 6 │ 5.4 │ 3.9 │ 1.7 │ 0.4 │ setosa │
│ 7 │ 4.6 │ 3.4 │ 1.4 │ 0.3 │ setosa │
│ 8 │ 5.0 │ 3.4 │ 1.5 │ 0.2 │ setosa │
│ 9 │ 4.4 │ 2.9 │ 1.4 │ 0.2 │ setosa │
│ 10 │ 4.9 │ 3.1 │ 1.5 │ 0.1 │ setosa │
⋮
│ 140 │ 6.9 │ 3.1 │ 5.4 │ 2.1 │ virginica │
│ 141 │ 6.7 │ 3.1 │ 5.6 │ 2.4 │ virginica │
│ 142 │ 6.9 │ 3.1 │ 5.1 │ 2.3 │ virginica │
│ 143 │ 5.8 │ 2.7 │ 5.1 │ 1.9 │ virginica │
│ 144 │ 6.8 │ 3.2 │ 5.9 │ 2.3 │ virginica │
│ 145 │ 6.7 │ 3.3 │ 5.7 │ 2.5 │ virginica │
│ 146 │ 6.7 │ 3.0 │ 5.2 │ 2.3 │ virginica │
│ 147 │ 6.3 │ 2.5 │ 5.0 │ 1.9 │ virginica │
│ 148 │ 6.5 │ 3.0 │ 5.2 │ 2.0 │ virginica │
│ 149 │ 6.2 │ 3.4 │ 5.4 │ 2.3 │ virginica │
│ 150 │ 5.9 │ 3.0 │ 5.1 │ 1.8 │ virginica │
3. Separate data from labels
julia> features = convert(Array,iris[:,1:4])
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
5.4 3.7 1.5 0.2
4.8 3.4 1.6 0.2
4.8 3.0 1.4 0.1
⋮
6.0 3.0 4.8 1.8
6.9 3.1 5.4 2.1
6.7 3.1 5.6 2.4
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> labels = convert(Array,iris[:,5])
150-element Array{String,1}:
“setosa”
“setosa”
“setosa”
“setosa”
“setosa”
“setosa”
“setosa”
“setosa”
“setosa”
“setosa”
“setosa”
“setosa”
“setosa”
⋮
“virginica”
“virginica”
“virginica”
“virginica”
“virginica”
“virginica”
“virginica”
“virginica”
“virginica”
“virginica”
“virginica”
“virginica”
4. Create a training set and test set
julia> features_train,features_test = features[1:2:end,:],features[2:2:end,:]
([5.1 3.5 1.4 0.2; 4.7 3.2 1.3 0.2; … ; 6.3 2.5 5.0 1.9; 6.2 3.4 5.4 2.3], [4.9 3.0 1.4 0.2; 4.6 3.1 1.5 0.2; … ; 6.5 3.0 5.2 2.0; 5.9 3.0 5.1 1.8])
julia> labels_train,lables_test = labels[1:2:end],labels[2:2:end]
([“setosa”, “setosa”, “setosa”, “setosa”, “setosa”, “setosa”, “setosa”, “setosa”, “setosa”, “setosa” … “virginica”, “virginica”, “virginica”, “virginica”, “virginica”, “virginica”, “virginica”, “virginica”, “virginica”, “virginica”], [“setosa”, “setosa”, “setosa”, “setosa”, “setosa”, “setosa”, “setosa”, “setosa”, “setosa”, “setosa” … “virginica”, “virginica”, “virginica”, “virginica”, “virginica”, “virginica”, “virginica”, “virginica”, “virginica”, “virginica”])
5. Create a model
julia> using LIBSVM
[ Info: Precompiling LIBSVM [b1bec4e5-fd48-53fe-b0cb-9723c09d164b]
julia> model = svmtrain(features_train’,labels_train)
LIBSVM.SVM{String}(SVC, LIBSVM.Kernel.RadialBasis, nothing, 4, 3, [“setosa”, “versicolor”, “virginica”], Int32[1, 2, 3], Float64[], Int32[], LIBSVM.SupportVectors{String,Float64}(30, Int32[5, 13, 12], [“setosa”, “setosa”, “setosa”, “setosa”, “setosa”, “versicolor”, “versicolor”, “versicolor”, “versicolor”, “versicolor” … “virginica”, “virginica”, “virginica”, “virginica”, “virginica”, “virginica”, “virginica”, “virginica”, “virginica”, “virginica”], [4.4 5.8 … 5.8 6.3; 2.9 4.0 … 2.7 2.5; 1.4 1.2 … 5.1 5.0; 0.2 0.2 … 1.9 1.9], Int32[5, 8, 10, 13, 23, 26, 27, 28, 29, 31 … 56, 57, 58, 59, 60, 64, 68, 70, 72, 74], LIBSVM.SVMNode[LIBSVM.SVMNode(1, 4.4), LIBSVM.SVMNode(1, 5.8), LIBSVM.SVMNode(1, 5.7), LIBSVM.SVMNode(1, 4.8), LIBSVM.SVMNode(1, 5.1), LIBSVM.SVMNode(1, 7.0), LIBSVM.SVMNode(1, 6.9), LIBSVM.SVMNode(1, 6.5), LIBSVM.SVMNode(1, 6.3), LIBSVM.SVMNode(1, 5.0) … LIBSVM.SVMNode(1, 6.5), LIBSVM.SVMNode(1, 6.8), LIBSVM.SVMNode(1, 5.8), LIBSVM.SVMNode(1, 6.5), LIBSVM.SVMNode(1, 7.7), LIBSVM.SVMNode(1, 6.2), LIBSVM.SVMNode(1, 6.1), LIBSVM.SVMNode(1, 6.0), LIBSVM.SVMNode(1, 5.8), LIBSVM.SVMNode(1, 6.3)]), 0.0, [0.8070380364343522 0.8047780005392675; 0.0 0.741676866696239; … ; -0.0 -1.0; -0.0 -1.0], Float64[], Float64[], [0.12550506116227908, 0.21415319269230185, -0.07664844428517169], 3, 0.25, 200.0, 0.001, 1.0, 0.5, 0.1, true, false)
6. Predict the test set
julia> (predicted_labels,decision_values) = svmpredict(model,features_test’)
([“setosa”, “setosa”, “setosa”, “setosa”, “setosa”, “setosa”, “setosa”, “setosa”, “setosa”, “setosa” … “virginica”, “versicolor”, “virginica”, “virginica”, “virginica”, “virginica”, “virginica”, “virginica”, “virginica”, “virginica”], [1.0795373127217927 1.076285347307982 … -0.8977486201494332 -0.9364766069276098; 1.1004210525961036 1.0767138900115194 … -1.0382989966396097 -1.0734485152396267; 0.26369235850072076 0.2543044167727957 … -0.5718494685608961 -0.31568093085243765])
7. Statistics accuracy
julia> using Statistics
julia> mean(predicted_labels .==lables_test)*1.0
0.9333333333333333
julia> predicted_labels .==lables_test
75-element BitArray{1}:
1
1
1
1
1
1
1
1
1
1
1
1
1
⋮
0
1
1
0
1
1
1
1
1
1
1
1