Что передать в качестве порога для наивного Байесовского классификатора в Pyspark?

#apache-spark #pyspark #naivebayes #roc

Вопрос:

Я пытаюсь построить кривую ROC для своей модели, используя наивный байесовский классификатор. Для этого мне нужно изменить значение порога для моего классификатора. Как я это интерпретировал, список должен быть передан со значением порога для каждой категории. Итак, если бы у меня было две категории, и t-это порог, который я хочу установить (0 <= t

В любом случае, когда я попытался сделать кривую ROC, я получил это:

Кривая 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 будет разделена на соответствующий порог и сравниваться с другими скорректированными вероятностями для других классов.