4

Я использую аромат ScikitLearn пакета DecisionTree.jl для создания случайной модели леса для задачи двоичной классификации одного из наборов данных RDatasets (см. Нижнюю часть главной страницы DecisionTree.jl для что я имею в виду под ароматом ScikitLearn). Я также использую пакет MLBase для оценки модели.Случайные леса и кривые ROC в Julia

Я построил случайную модель леса моих данных и хотел бы создать кривую ROC для этой модели. Читая документацию, я понимаю, что кривая ROC теоретически. Я просто не могу понять, как создать его для конкретной модели.

В последней части первого предложения, выделенной жирным курсивом ниже, находится тот, который вызывает мое замешательство: «В статистике рабочая характеристика приемника (ROC) или кривая ROC является графическим график, который иллюстрирует работу системы двоичного классификатора , поскольку порог его дискриминации варьируется. " На протяжении всей статьи на пороговом значении больше, но это все еще путает меня по проблемам двоичной классификации. Каково пороговое значение и как его изменить?

Также в сообщении MLBase documentation on ROC Curves говорится: «Вычислить экземпляр ROC или кривую ROC (вектор экземпляров ROC) на основе заданных оценок и порогового значения». Но это нигде не упоминает об этом пороге.

Пример кода для моего проекта приведен ниже. В принципе, я хочу создать кривую ROC для случайного леса, но я не уверен, как это сделать или если это даже подходит.

using DecisionTree 
using RDatasets 
using MLBase 

quakes_data = dataset("datasets", "quakes"); 

# Add in a binary column as feature column for classification 
quakes_data[:MagGT5] = convert(Array{Int32,1}, quakes_data[:Mag] .> 5.0) 

# Getting features and labels where label = 1 is mag > 1 and label = 2 is mag <= 5 
features = convert(Array, quakes_data[:, [1:3;5]]); 
labels = convert(Array, quakes_data[:, 6]); 
labels[labels.==0] = 2 

# Create a random forest model with the tuning parameters I want 
r_f_model = RandomForestClassifier(nsubfeatures = 3, ntrees = 50, partialsampling=0.7, maxdepth = 4) 

# Train the model in-place on the dataset (there isn't a fit function without the in-place functionality) 
DecisionTree.fit!(r_f_model, features, labels) 

# Apply the trained model to the test features data set (here I haven't partitioned into training and test) 
r_f_prediction = convert(Array{Int64,1}, DecisionTree.predict(r_f_model, features)) 

# Applying the model to the training set and looking at model stats 
TrainingROC = roc(labels, r_f_prediction) #getting the stats around the model applied to the train set 
#  p::T # positive in ground-truth 
#  n::T # negative in ground-truth 
#  tp::T # correct positive prediction 
#  tn::T # correct negative prediction 
#  fp::T # (incorrect) positive prediction when ground-truth is negative 
#  fn::T # (incorrect) negative prediction when ground-truth is positive 

Я также прочитал this вопрос и не находил полезным на самом деле.

ответ

4

Задача в двоичной системе классификации, чтобы дать метку 0/1 (или true/false, red/blue) на новые, немеченые, данные точки. Большинство алгоритмов классификации предназначены для вывода непрерывного действительного значения. Это значение оптимизировано для того, чтобы быть выше для точек с известной или предсказанной меткой 1 и ниже для точек с известной или предсказанной меткой 0. Для использования этого значения для генерации предсказания 0/1 используется дополнительный порог. Предполагается, что точки со значением, превышающим порог, будут помечены как 1 (а для нижнего порога - 0).

Почему эта настройка полезна? Потому что иногда ошибочное предсказание 0 вместо 1 является более дорогостоящим, а затем вы можете установить пороговое значение с низким, делая выход алгоритма прогнозирования 1 s чаще.

В крайнем случае, при прогнозировании 0 вместо 1 ничего не стоит для приложения, вы можете установить порог на бесконечности, что делает его всегда выходная 0 (который, очевидно, является лучшим решением, так как она не несет никаких затрат).

Порог-трюк не может устранить ошибки из классификатора - никакой классификатор в реальных проблемах не является идеальным или свободным от шума. То, что он может сделать, это изменить соотношение между ошибками -when-really-1 и ошибками 1 -when-really- 0 для окончательной классификации.

По мере увеличения порога большее количество очков классифицируется с помощью метки 0. Рассмотрим диаграмму с долей точек, классифицированных по 0 по оси x, и долю точек с ошибкой 0 -when-really-1 по оси y. Для каждого значения порога нарисуйте точку для полученного классификатора на этой диаграмме. Вычисляя точку для всех порогов, вы получаете кривую. Это (некоторый вариант) кривой ROC, которая суммирует возможности классификатора. Часто используемым показателем качества классификации является AUC или область под кривой этой диаграммы, но на самом деле вся кривая может представлять интерес для приложений.

Краткое описание, подобное этому, представлено во многих текстах, посвященных компьютерному обучению, которые относятся к запросу Google.

Надеюсь, что это разъясняет роль порога и его связи с кривыми ROC.

+1

Спасибо, я прочитал много текстов, и они не дали мне ясного понимания, как вы только что. – lara

+0

Спасибо. Что касается вашего кода, последняя строка 'roc (labels ...)' дает единственную точку кривой ROC для конкретных предсказаний DecisionTree 'r_f_model'. Этот алгоритм DecisionTree является примером классификатора, который не выводит действительное число, а представляет собой фактическое предсказание. Возможно, некоторые параметры в функции подгонки могут генерировать больше точек для определения кривой ROC. –