#apache-spark #pyspark #naivebayes #roc
Вопрос:
Я пытаюсь построить кривую ROC для своей модели, используя наивный байесовский классификатор. Для этого мне нужно изменить значение порога для моего классификатора. Как я это интерпретировал, список должен быть передан со значением порога для каждой категории. Итак, если бы у меня было две категории, и t-это порог, который я хочу установить (0 <= t
В любом случае, когда я попытался сделать кривую ROC, я получил это:
Учитывая результат, моя идея заключалась в том, что идея, которую я имел для theshold, могла быть неправильной, поэтому я пошел проверить документацию для Наивного классификатора Байеса. Но когда я наконец нашел пример, я не понял, каковы критерии для параметра:
nb = nb.setThresholds([0.01, 10.00])
Кто-нибудь знает, что должно быть передано на порог? Предположим, я хочу, чтобы значение было равно 0,7 (если вероятность превышает 0,7, я хочу, чтобы прогноз был равен 1), что я должен передать параметру порога?
Комментарии:
1. Я не понимаю вашего вопроса. Кривая ROC показывает все пороговые значения. Вы не хотите устанавливать их сами. И на самом деле ваша кривая ROC выглядит нормально.
2. @Calimo Я знаю, что кривая roc показывает все пороговые значения. Вопрос заключается в том, какой параметр следует передать классификатору наивности Pyspark. Что касается других вопросов, считаете ли вы, что это приемлемая кривая ROC. Мне кажется, что точки (кроме первой и последней) выглядят как прямая сжатая линия, и я на самом деле не получаю ту кривую, которую должен был получить.
3. Итак, ваш вопрос о кривой ROC или о фиксированных значениях? Пожалуйста, задавайте только один четкий вопрос за пост. meta.stackexchange.com/a/39224/147320
Ответ №1:
Как сказано в pyspark.ml
документации NaiveBayes
по thresholds
параметру:
Прогнозируется класс с наибольшим значением p/t, где p-исходная вероятность этого класса, а t-пороговое значение класса.
Следовательно, пороговые значения можно рассматривать как ограничения на вероятности. Чтобы все было просто, в случае двоичной классификации вы можете установить пороговые значения в качестве значения в диапазоне [0, 1]
, чтобы они суммировались 1
. Это даст вам желаемое правило «Классифицировать как истинное, если вероятность превышает пороговое значение T, в противном случае классифицировать как ложное».
Для вашего конкретного запроса о пороге вероятности 0,7 это будет выглядеть так:
nb = nb.setThresholds([0.3, 0.7])
предполагая, что первая запись является пороговым False
значением, а второе значение является пороговым значением True
. Используя эти пороговые значения, модель классифицировала бы класс с False
True
вероятностями p_false
и p_true
с учетом большего значения [p_false/0.3, p_true/0.7]
.
Технически вы можете установить пороговые значения на любое значение. Просто помните, что вероятность для класса X будет разделена на соответствующий порог и сравниваться с другими скорректированными вероятностями для других классов.