Class: Ossert::Classifiers::Growing::Classifier

Inherits:
Object
  • Object
show all
Defined in:
lib/ossert/classifiers/growing/classifier.rb

Defined Under Namespace

Classes: ThresholdToRange

Constant Summary collapse

GRADES =
%w(
  ClassA
  ClassB
  ClassC
  ClassD
  ClassE
).freeze
REVERSED_GRADE =
{
  'ClassA' => 'ClassE',
  'ClassB' => 'ClassD',
  'ClassC' => 'ClassC',
  'ClassD' => 'ClassB',
  'ClassE' => 'ClassA'
}.freeze

Instance Attribute Summary collapse

Instance Method Summary collapse

Constructor Details

#initialize(classifier, config) ⇒ Classifier

Returns a new instance of Classifier.



22
23
24
25
# File 'lib/ossert/classifiers/growing/classifier.rb', line 22

def initialize(classifier, config)
  @classifier = classifier
  @config = config
end

Instance Attribute Details

#classifierObject (readonly)

Returns the value of attribute classifier.



21
22
23
# File 'lib/ossert/classifiers/growing/classifier.rb', line 21

def classifier
  @classifier
end

#configObject (readonly)

Returns the value of attribute config.



21
22
23
# File 'lib/ossert/classifiers/growing/classifier.rb', line 21

def config
  @config
end

Instance Method Details

#reversed_metricsObject



156
157
158
# File 'lib/ossert/classifiers/growing/classifier.rb', line 156

def reversed_metrics
  @reversed_metrics ||= config['reversed']
end

#run_aggregationObject



36
37
38
39
40
41
42
43
44
45
46
47
# File 'lib/ossert/classifiers/growing/classifier.rb', line 36

def run_aggregation
  GRADES.each_with_index do |grade, idx|
    classifier[grade].each_pair do |metric, values|
      sibling_class_values = []
      sibling_class_values = classifier[GRADES[idx + 1]][metric] if (idx + 1) < GRADES.count

      all_values = sibling_class_values + values
      (classifier[grade][metric] = (values.max || 0)) && next if all_values.count <= 2
      classifier[grade][metric] = (all_values.sum / all_values.count).round(2)
    end
  end
end

#run_reverseObject



160
161
162
163
164
165
166
167
168
169
170
171
# File 'lib/ossert/classifiers/growing/classifier.rb', line 160

def run_reverse
  reversed_metrics.each do |reversed_metric|
    GRADES.first(GRADES.count / 2).each do |grade|
      grade_metrics = classifier[grade]
      next unless grade_metrics[reversed_metric].present?
      reversed_grade_metrics = classifier[REVERSED_GRADE[grade]]

      reversed_grade_metrics[reversed_metric], grade_metrics[reversed_metric] =
        grade_metrics[reversed_metric], reversed_grade_metrics[reversed_metric]
    end
  end
end

#run_synteticsObject



49
50
51
52
53
54
55
56
57
58
59
60
61
62
# File 'lib/ossert/classifiers/growing/classifier.rb', line 49

def run_syntetics
  config['syntetics'].each do |synt_metric, values_range|
    real_values = classifier.values.map { |metrics| metrics[synt_metric] }.compact
    next if real_values.empty?

    values_range = Array.wrap(values_range)
    values_range = values_range.reverse if reversed_metrics.include? synt_metric
    step_threshold = syntetic_step_threshold(values_range)

    GRADES.each_with_index do |grade, idx|
      classifier[grade][synt_metric] = step_threshold.call(idx)
    end
  end
end

#run_values_to_rangesObject



73
74
75
76
77
78
79
80
81
82
# File 'lib/ossert/classifiers/growing/classifier.rb', line 73

def run_values_to_ranges
  GRADES.each do |grade|
    classifier[grade].each_pair do |metric, value|
      classifier[grade][metric] = {
        threshold: value,
        range: ThresholdToRange.range_for(metric, value, grade)
      }
    end
  end
end

#syntetic_step_threshold(values_range) ⇒ Object



64
65
66
67
68
69
70
71
# File 'lib/ossert/classifiers/growing/classifier.rb', line 64

def syntetic_step_threshold(values_range)
  return ->(idx) { values_range[idx] } if values_range.count == GRADES.count
  max_value, min_value = values_range
  min_value = min_value.to_i
  max_value = max_value.to_i
  step = ((max_value - min_value) / GRADES.count.to_f).round(2)
  ->(idx) { max_value - (step * idx).round(2) }
end

#trainObject



27
28
29
30
31
32
33
34
# File 'lib/ossert/classifiers/growing/classifier.rb', line 27

def train
  run_aggregation
  run_syntetics
  run_values_to_ranges
  run_reverse

  classifier
end