clj-ml/test/clj_ml/classifiers_test.clj

77 lines
3.2 KiB
Clojure

(ns clj-ml.classifiers-test
(:use [clj-ml classifiers data] :reload-all)
(:use clojure.test midje.sweet))
(deftest make-classifiers-options-c45
(fact
(let [options (make-classifier-options :decision-tree :c45 {:unpruned true :reduced-error-pruning true :only-binary-splits true :no-raising true
:no-cleanup true :laplace-smoothing true :pruning-confidence 0.12 :minimum-instances 10
:pruning-number-folds 5 :random-seed 1})]
options => (just ["-U" "-R" "-B" "-S" "-L" "-A" "-C" "0.12" "-M" "10" "-N" "5" "-Q" "1"] :in-any-order))))
(deftest make-classifier-c45
(let [c (make-classifier :decision-tree :c45)]
(is (= (class c)
weka.classifiers.trees.J48))))
(deftest train-classifier-c45
(let [c (make-classifier :decision-tree :c45)
ds (clj-ml.data/make-dataset "test" [:a :b {:c [:m :n]}] [[1 2 :m] [4 5 :m]])]
(clj-ml.data/dataset-set-class ds 2)
(classifier-train c ds)
(is true)))
(deftest make-classifier-bayes
(fact
(let [c (clj-ml.classifiers/make-classifier :bayes :naive {:kernel-estimator true :old-format true})
opts (vec (.getOptions c))]
opts => (contains ["-K" "-O"]))))
(deftest make-classifier-bayes-updateable
(let [c (clj-ml.classifiers/make-classifier :bayes :naive {:updateable true})]
(is (= (class c)
weka.classifiers.bayes.NaiveBayesUpdateable))))
(deftest train-classifier-bayes
(let [c (clj-ml.classifiers/make-classifier :bayes :naive {:kernel-estimator true :old-format true})
ds (clj-ml.data/make-dataset "test" [:a :b {:c [:m :n]}] [[1 2 :m] [4 5 :m]])]
(clj-ml.data/dataset-set-class ds 2)
(classifier-train c ds)
(is true)))
(deftest classifier-evaluate-dataset
(let [c (make-classifier :decision-tree :c45)
ds (clj-ml.data/make-dataset "test" [:a :b {:c [:m :n]}] [[1 2 :m] [4 5 :m]])
tds (clj-ml.data/make-dataset "test" [:a :b {:c [:m :n]}] [[4 1 :n] [4 5 :m]])
_ (clj-ml.data/dataset-set-class ds 2)
_ (clj-ml.data/dataset-set-class tds 2)
_ (classifier-train c ds)
res (classifier-evaluate c :dataset ds tds)]
(is (= 26 (count (keys res))))))
(deftest make-classifier-svm-smo-polykernel
(let [svm (make-classifier :support-vector-machine :smo {:kernel-function {:polynomic {:exponent 2.0}}})]
(is (= weka.classifiers.functions.supportVector.PolyKernel
(class (.getKernel svm))))))
(deftest classifier-evaluate-cross-validation
(let [c (make-classifier :decision-tree :c45)
ds (clj-ml.data/make-dataset "test" [:a :b {:c [:m :n]}] [[1 2 :m] [4 5 :m]])
_ (clj-ml.data/dataset-set-class ds 2)
_ (classifier-train c ds)
res (classifier-evaluate c :cross-validation ds 2)]
(is (= 26 (count (keys res))))))
(deftest update-updateable-classifier
(let [c (clj-ml.classifiers/make-classifier :bayes :naive {:updateable true})
ds (clj-ml.data/make-dataset "test" [:a :b {:c [:m :n]}] [[1 2 :m] [4 5 :m]])
_ (dataset-set-class ds 2)
inst (make-instance ds {:a 56 :b 45 :c :m})]
(classifier-train c ds)
(classifier-update c ds)
(classifier-update c inst)
(is true)))