summaryrefslogtreecommitdiff
path: root/report/validation_data.rb
diff options
context:
space:
mode:
authorMartin Gütlein <martin.guetlein@gmail.com>2010-03-23 14:07:14 +0100
committerMartin Gütlein <martin.guetlein@gmail.com>2010-03-23 14:07:14 +0100
commit14d2a68564061d63166cd409bf4fd30dc841d2b8 (patch)
treee07cbc10883ee8c116caa443048df0471efe02b2 /report/validation_data.rb
parent6a5ebb67493ab2c30121ae26fb75d6a24c36eafc (diff)
added predictedValues feature, some report changes (true feature prediction class), some hacks to validate IDEA/AMBIT
Diffstat (limited to 'report/validation_data.rb')
-rw-r--r--report/validation_data.rb84
1 files changed, 59 insertions, 25 deletions
diff --git a/report/validation_data.rb b/report/validation_data.rb
index 7943cd9..3f96cc8 100644
--- a/report/validation_data.rb
+++ b/report/validation_data.rb
@@ -3,6 +3,8 @@
VAL_ATTR_VARIANCE = [ :area_under_roc, :percent_correct, :root_mean_squared_error, :mean_absolute_error, :r_square, :accuracy ]
VAL_ATTR_RANKING = [ :area_under_roc, :percent_correct, :true_positive_rate, :true_negative_rate, :accuracy ]
+
+
class Object
def to_nice_s
@@ -25,19 +27,6 @@ class Object
end
end
-class Hash
-
- def mean_value
- sum = 0
- self.values.collect do |v|
- raise "cannot compute mean of non-numeric values '"+self.inspect+"'" unless v!=nil and v.is_a?(Numeric)
- sum+=v
- end
- sum/=self.values.size.to_f
- end
-
-end
-
module Reports
@@ -53,7 +42,6 @@ module Reports
def self.reset_validation_access(validation_access)
@@validation_access = validation_access
end
-
def self.resolve_cv_uris(validation_uris)
@@validation_access.resolve_cv_uris(validation_uris)
@@ -99,6 +87,11 @@ module Reports
@is_classification = @@validation_access.classification?(self)
end
+ def predicted_variable
+ return @predicted_variable if @predicted_variable!=nil
+ @predicted_variable = @@validation_access.predicted_variable(self)
+ end
+
# loads all crossvalidation attributes, of the corresponding cv into this object
def load_cv_attributes
raise "crossvalidation-id not set" unless @crossvalidation_id
@@ -119,6 +112,7 @@ module Reports
class ValidationSet
def initialize(validation_uris = nil)
+ @unique_values = {}
validation_uris = Reports::Validation.resolve_cv_uris(validation_uris) if validation_uris
@validations = Array.new
validation_uris.each{|u| @validations.push(Reports::Validation.new(u))} if validation_uris
@@ -128,9 +122,9 @@ module Reports
return @validations[index]
end
- def first()
- return @validations.first
- end
+ #def first()
+ #return @validations.first
+ #end
# returns the values of the validations for __attribute__
# * if unique is true a set is returned, i.e. not redundant info
@@ -170,18 +164,46 @@ module Reports
@validations.each{ |v| v.load_cv_attributes }
end
+ def unique_value(validation_prop)
+ return @unique_values[validation_prop] if @unique_values.has_key?(validation_prop)
+ val = @validations[0].send(validation_prop)
+ (1..@validations.size-1).each do |i|
+ if @validations[i].send(validation_prop)!=val
+ val = nil
+ break
+ end
+ end
+ @unique_values[validation_prop] = val
+ return val
+ end
+
+ def get_true_prediction_feature_value
+ if all_classification?
+ class_values = get_prediction_feature_values
+ if class_values.size == 2
+ (0..1).each do |i|
+ return class_values[i] if (class_values[i].to_s.downcase == "true" || class_values[i].to_s.downcase == "active")
+ end
+ end
+ end
+ return nil
+ end
+
+ def get_prediction_feature_values
+ return unique_value("get_prediction_feature_values")
+ end
+
# checks weather all validations are classification validations
#
def all_classification?
- @validations.each{ |v| return false unless v.classification? }
- true
+ return unique_value("classification?")
end
# checks weather all validations are regression validations
#
def all_regression?
- @validations.each{ |v| return false if v.classification? }
- true
+ # WARNING, NOT TRUE: !all_classification == all_regression?
+ return unique_value("classification?")==false
end
# returns a new set with all validation that have values as specified in the map
@@ -214,18 +236,22 @@ module Reports
# call-seq:
# to_array(attributes, remove_nil_attributes) => array
#
- def to_array(attributes, remove_nil_attributes=true)
+ def to_array(attributes, remove_nil_attributes=true, true_class_value=nil)
array = Array.new
array.push(attributes)
attribute_not_nil = Array.new(attributes.size)
@validations.each do |v|
index = 0
array.push(attributes.collect do |a|
- variance = v.send( (a.to_s+"_variance").to_sym ) if VAL_ATTR_VARIANCE.index(a)
+ if VAL_ATTR_VARIANCE.index(a)
+ variance = v.send( (a.to_s+"_variance").to_sym )
+ end
variance = " +- "+variance.to_nice_s if variance
attribute_not_nil[index] = true if remove_nil_attributes and v.send(a)!=nil
index += 1
- v.send(a).to_nice_s + variance.to_s
+ val = v.send(a)
+ val = val[true_class_value] if true_class_value!=nil && val.is_a?(Hash) && Lib::VAL_CLASS_PROPS_PER_CLASS_COMPLEMENT_EXISTS.index(a)!=nil
+ val.to_nice_s + variance.to_s
end)
end
if remove_nil_attributes #delete in reverse order to avoid shifting of indices
@@ -245,6 +271,10 @@ module Reports
def merge(equal_attributes)
new_set = Reports::ValidationSet.new
+ # unique values stay unique when merging
+ # derive unique values before, because model dependent props cannot be accessed later (when mergin validations from different models)
+ new_set.unique_values = @unique_values
+
#compute grouping
grouping = Reports::Util.group(@validations, equal_attributes)
@@ -290,7 +320,7 @@ module Reports
raise "no value for class value "+class_value.class.to_s+" "+class_value.to_s+" in hash "+val.inspect.to_s unless val.has_key?(class_value)
val = val[class_value]
else
- val = val.mean_value
+ raise "is a hash "+ranking_attribute+", specify class value plz"
end
end
rank_hash[i] = val
@@ -342,6 +372,10 @@ module Reports
@validations
end
+ protected
+ def unique_values=(unique_values)
+ @unique_values = unique_values
+ end
end
end