Class: Rumale::EvaluationMeasure::ROCAUC
- Inherits:
-
Object
- Object
- Rumale::EvaluationMeasure::ROCAUC
- Includes:
- Base::Evaluator
- Defined in:
- rumale-evaluation_measure/lib/rumale/evaluation_measure/roc_auc.rb
Overview
ROCAUC is a class that calculate area under the receiver operation characteristic curve from predicted scores.
Instance Method Summary collapse
-
#auc(x, y) ⇒ Float
Calculate area under the curve using the trapezoidal rule.
-
#roc_curve(y_true, y_score, pos_label = nil) ⇒ Array
Calculate receiver operation characteristic curve.
-
#score(y_true, y_score) ⇒ Float
Calculate area under the receiver operation characteristic curve (ROC AUC).
Instance Method Details
#auc(x, y) ⇒ Float
Calculate area under the curve using the trapezoidal rule.
99 100 101 102 103 104 |
# File 'rumale-evaluation_measure/lib/rumale/evaluation_measure/roc_auc.rb', line 99 def auc(x, y) n_samples = [x.shape[0], y.shape[0]].min raise ArgumentError, 'At least two points are required to calculate area under curve.' if n_samples < 2 (0...n_samples).to_a.each_cons(2).sum { |i, j| 0.5 * (x[i] - x[j]).abs * (y[i] + y[j]) } end |
#roc_curve(y_true, y_score, pos_label = nil) ⇒ Array
Calculate receiver operation characteristic curve.
62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 |
# File 'rumale-evaluation_measure/lib/rumale/evaluation_measure/roc_auc.rb', line 62 def roc_curve(y_true, y_score, pos_label = nil) labels = y_true.to_a.uniq if pos_label.nil? unless labels.size == 2 raise ArgumentError, 'y_true must be binary labels or pos_label must be specified if y_true is multi-label' end else unless y_true.to_a.uniq.include?(pos_label) raise ArgumentError, 'y_true must have elements whose values are pos_label.' end end false_pos, true_pos, thresholds = binary_roc_curve(y_true, y_score, pos_label) if true_pos.empty? || false_pos[0] != 0 || true_pos[0] != 0 # NOTE: Numo::NArray#insert is not a destructive method. # rubocop:disable Style/RedundantSelfAssignment true_pos = true_pos.insert(0, 0) false_pos = false_pos.insert(0, 0) thresholds = thresholds.insert(0, thresholds[0] + 1) # rubocop:enable Style/RedundantSelfAssignment end tpr = true_pos / true_pos[-1].to_f fpr = false_pos / false_pos[-1].to_f [fpr, tpr, thresholds] end |
#score(y_true, y_score) ⇒ Float
Calculate area under the receiver operation characteristic curve (ROC AUC).
39 40 41 42 43 44 45 46 47 48 49 50 51 52 |
# File 'rumale-evaluation_measure/lib/rumale/evaluation_measure/roc_auc.rb', line 39 def score(y_true, y_score) n_classes = y_score.shape[1] if n_classes.nil? fpr, tpr, = roc_curve(y_true, y_score) return auc(fpr, tpr) end scores = Array.new(n_classes) do |c| fpr, tpr, = roc_curve(y_true[true, c], y_score[true, c]) auc(fpr, tpr) end scores.sum.fdiv(n_classes) end |