type hint classifiers as much as possible...

This commit is contained in:
Ben Mabey 2010-11-29 10:08:57 -07:00
parent 31348dd1e0
commit 93846bcaea

View file

@ -62,12 +62,11 @@
" "
(:use [clj-ml utils data kernel-functions]) (:use [clj-ml utils data kernel-functions])
(:import (java.util Date Random) (:import (java.util Date Random)
(weka.core Instance Instances)
(weka.classifiers.trees J48) (weka.classifiers.trees J48)
(weka.classifiers.bayes NaiveBayes) (weka.classifiers.bayes NaiveBayes NaiveBayesUpdateable)
(weka.classifiers.bayes NaiveBayesUpdateable) (weka.classifiers.functions MultilayerPerceptron SMO)
(weka.classifiers.functions MultilayerPerceptron) (weka.classifiers Classifier Evaluation)))
(weka.classifiers.functions SMO)
(weka.classifiers Evaluation)))
;; Setting up classifier options ;; Setting up classifier options
@ -131,9 +130,9 @@
(defn make-classifier-with (defn make-classifier-with
#^{:skip-wiki true} #^{:skip-wiki true}
[kind algorithm classifier-class options] [kind algorithm ^Class classifier-class options]
(let [options-read (if (empty? options) {} (first options)) (let [options-read (if (empty? options) {} (first options))
classifier (.newInstance classifier-class) ^Classifier classifier (.newInstance classifier-class)
opts (into-array String (make-classifier-options kind algorithm options-read))] opts (into-array String (make-classifier-options kind algorithm options-read))]
(.setOptions classifier opts) (.setOptions classifier opts)
classifier)) classifier))
@ -294,25 +293,26 @@
(defn classifier-train (defn classifier-train
"Trains a classifier with the given dataset as the training data." "Trains a classifier with the given dataset as the training data."
([classifier dataset] ([^Classifier classifier dataset]
(do (.buildClassifier classifier dataset) (do (.buildClassifier classifier dataset)
classifier))) classifier)))
(defn classifier-update (defn classifier-update
"If the classifier is updateable it updates the classifier with the given instance or set of instances." "If the classifier is updateable it updates the classifier with the given instance or set of instances."
([classifier instance-s] ([^Classifier classifier instance-s]
;; Arg... weka doesn't provide a formal interface for updateClassifer- How do I type hint this?
(if (is-dataset? instance-s) (if (is-dataset? instance-s)
(do (for [i (dataset-seq instance-s)] (do (doseq [i (dataset-seq instance-s)]
(.updateClassifier classifier i)) (.updateClassifier classifier ^Instance i))
classifier) classifier)
(do (.updateClassifier classifier instance-s) (do (.updateClassifier classifier ^Instance instance-s)
classifier)))) classifier))))
;; Evaluating classifiers ;; Evaluating classifiers
(defn- collect-evaluation-results (defn- collect-evaluation-results
"Collects all the statistics from the evaluation of a classifier." "Collects all the statistics from the evaluation of a classifier."
([class-values evaluation] ([class-values ^Evaluation evaluation]
(do (do
(println (.toMatrixString evaluation)) (println (.toMatrixString evaluation))
(println "=== Summary ===") (println "=== Summary ===")
@ -345,7 +345,7 @@
:evaluation-object evaluation}))) :evaluation-object evaluation})))
(defmulti classifier-evaluate (defmulti classifier-evaluate
"Evaluetes a trained classifier using the provided dataset or cross-validation. "Evaluates a trained classifier using the provided dataset or cross-validation.
The first argument must be the classifier to evaluate, the second argument is The first argument must be the classifier to evaluate, the second argument is
the kind of evaluation to do. the kind of evaluation to do.
Two possible evaluations ara availabe: dataset and cross-validations. The values Two possible evaluations ara availabe: dataset and cross-validations. The values
@ -410,19 +410,15 @@
(fn [classifier mode & evaluation-data] mode)) (fn [classifier mode & evaluation-data] mode))
(defmethod classifier-evaluate :dataset (defmethod classifier-evaluate :dataset
([classifier mode & evaluation-data] ([^Classifier classifier mode & [training-data test-data]]
(let [training-data (nth evaluation-data 0) (let [evaluation (new Evaluation training-data)
test-data (nth evaluation-data 1)
evaluation (new Evaluation training-data)
class-values (dataset-class-values training-data)] class-values (dataset-class-values training-data)]
(.evaluateModel evaluation classifier test-data (into-array [])) (.evaluateModel evaluation classifier test-data (into-array []))
(collect-evaluation-results class-values evaluation)))) (collect-evaluation-results class-values evaluation))))
(defmethod classifier-evaluate :cross-validation (defmethod classifier-evaluate :cross-validation
([classifier mode & evaluation-data] ([classifier mode & [training-data folds]]
(let [training-data (nth evaluation-data 0) (let [evaluation (new Evaluation training-data)
folds (nth evaluation-data 1)
evaluation (new Evaluation training-data)
class-values (dataset-class-values training-data)] class-values (dataset-class-values training-data)]
(.crossValidateModel evaluation classifier training-data folds (new Random (.getTime (new Date))) (into-array [])) (.crossValidateModel evaluation classifier training-data folds (new Random (.getTime (new Date))) (into-array []))
(collect-evaluation-results class-values evaluation)))) (collect-evaluation-results class-values evaluation))))
@ -434,7 +430,7 @@
"Classifies an instance using the provided classifier. "Classifies an instance using the provided classifier.
The value returned is the numeric attribute of that value for The value returned is the numeric attribute of that value for
the list of valid values for the class." the list of valid values for the class."
([classifier instance] ([^Classifier classifier ^Instance instance]
(.classifyInstance classifier instance))) (.classifyInstance classifier instance)))
(defn classifier-label (defn classifier-label