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]

은 기본적으로 내가 더 후 0.7 %의 어떤 가능성이없는 경우 분류가 비어 예측 열을 떠나고 싶어.

또한 카테고리 중 하나 이상이 매우 가까운 점수를 가질 때 불확실한 것으로 분류하는 방법 0.812, 0.800, 0.799. 최대 값 지정은 내가 원하지 않을 수도 있지만 대신 "불확실한"것으로 분류하거나 비워 두십시오. 그런 문서에 대한 추가 분석 및 처리를 수행하거나 해당 문서의 다른 모델을 교육 할 수 있습니다.

답변

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.01로 [0.42, 0.58]를 변환하는 것이었다 0.58/] = [42, 5.8], 열 1 (위의 세 번째 행)에서 열 0 (위의 마지막 행)까지 예측 ("최대 p/t")을 전환합니다. 그러나 소스에서 논리를 찾을 수 없습니다. 누군가?

뒤로 물러나서 : 나는 원하는대로 할 수있는 기본 제공 방법을 보지 못합니다. 어떤 클래스도 지배하지 않으면 불가지론 자이되어야합니다.

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 법적 확률 분포 여부를 확인하지 않은주의), 사용 : 당신은 같은 뭔가가를 추가해야합니다 예상되는 확률 및 브리 어 스코어, 로그 손실 또는 정보 이득과 같은 메트릭은 캘리브레이션과 정확도를 설명합니다.