1

Я использую NB для классификации документов и пытаюсь понять пороговый параметр, чтобы увидеть, как он может помочь оптимизировать алгоритм.spark ml 2.0 - Naive Bayes - как определить пороговые значения для каждого класса

Спарк ML 2,0 thresholds док говорит:

Param for Thresholds in multi-class classification to adjust the probability of predicting each class. Array must have length equal to the number of classes, with values >= 0. The class with largest value p/t is predicted, where p is the original probability of that class and t is the class' threshold.

0) Может ли кто-нибудь объяснить это лучше? Какую цель он может достичь? Моя общая идея заключается в том, что если у вас есть порог 0,7, то, по крайней мере, вероятность предсказания одного класса должна быть больше 0,7, если нет, тогда предсказание должно быть пустым. Средство классифицирует его как «неопределенное» или просто оставляет пустым для столбца прогноза. Как может p/t-функция достичь этого, когда вы все равно выбираете категорию с максимальной вероятностью?

1) Какую вероятность он регулирует? «Вероятность» столбца по умолчанию - условная вероятность, а «rawPrediction» - уверенность в соответствии с документом. Я считаю, что порог будет корректировать столбец «rawPrediction», а не «вероятность». Я прав?

2) Вот как выглядят некоторые из моих вероятностей и вектор rawPrediction. Как установить пороговые значения на основе этого, чтобы я мог удалить определенную неопределенную классификацию? probability находится между 0 и 1, но rawPrediction, по-видимому, находится на шкале журнала здесь.

Вероятность: [2.233368649314982E-15,1.6429456680945863E-9,1.4377313514127723E-15,7.858651849363202E-15]

rawPrediction: [-496.9606736723107,-483.452183395287,-497.40111830218746]

В основном я хочу классификатор, чтобы оставить столбец Prediction пустым, если он не имеет какой-либо вероятность того, что является более чем 0,7 процента.

Также, как классифицировать что-то как неопределенное, когда более чем одна категория имеет очень близкие оценки, например. 0,812, 0,800, 0,799. Выбор max - это то, что я, возможно, не хочу здесь, но вместо этого классифицирую как «неопределенное» или оставляю пустое, и я могу продолжить анализ и обработку этих документов или подготовить другую модель для этих документов.

ответ

2

Я не играл с ним, но цель состоит в том, чтобы поставить разные пороговые значения для каждого класса. Я извлек этот пример из: строки документации

model = nb.fit(df) 
>>> result.prediction 
1.0 
>>> result.probability 
DenseVector([0.42..., 0.57...]) 
>>> result.rawPrediction 
DenseVector([-1.60..., -1.32...]) 
>>> nb = nb.setThresholds([0.01, 10.00]) 
>>> model3 = nb.fit(df) 
>>> result = model3.transform(test0).head() 
>>> result.prediction 
0.0 

Если я правильно понимаю, эффект был превратить [0.42, 0.58] в [.42/ .01, 0,58/] = [42, 5.8], переключение предсказания («наибольший p/t») из столбца 1 (третья строка выше) в столбец 0 (последняя строка выше). Однако я не мог найти логику в источнике. Кто угодно?

Отступ: я не вижу встроенного способа делать то, что вы хотите: быть агностиком, если класс не доминирует. Вы должны добавить, что-то вроде:

def weak(probs, threshold=.7, epsilon=.01): 
    return np.all(probs < threshold) or np.max(np.diff(probs)) < epsilon 

>>> cases = [[.5,.5],[.5,.7],[.7,.705],[.6,.1]] 
>>> for case in cases: 
... print '{:15s} - {}'.format(case, weak(case)) 

[0.5, 0.5]  - True 
[0.5, 0.7]  - False 
[0.7, 0.705] - True 
[0.6, 0.1]  - True 

(. Заметьте, что я не проверил probs является ли юридическое распределение вероятностей)

В качестве альтернативы, если вы на самом деле не делает трудное решение, использование прогнозируемые вероятности и метрики, такие как оценка Brier, логарифмическая потеря или информация, которая учитывает калибровку, а также точность.