Naive Bayes 모델 작성에 대한 예

이 예는 이산화 알고리즘 및 구간 수를 정의하는 방법을 보여줍니다.

Naive Bayes 분류자의 적용은 고객 이탈 데이터 세트에 속한다고 가정합니다. 입력 데이터는 연속 속성 유형 및 명목 속성 유형을 포함할 수 있습니다. 모든 유형은 자동으로 또는 사용자 지정 수단을 통해 발견될 수 있습니다. 유형을 수동으로 정의하려면 incolumncoldeftype 매개변수를 사용하십시오.

고객 이탈 데이터 세트는 숫자 컬럼만 포함할 수 있습니다. 그러나 Naive Bayes 모델을 작성하려면 VARCHAR 컬럼이 필요합니다. 다음 호출은 고객 이탈 데이터 세트를 기반으로 하며 VARCHAR 컬럼을 포함하는 보기를 작성하는 방법을 보여줍니다. 또한, 이 보기는 예측에 필요한 컬럼도 포함합니다.

CREATE VIEW CUSTOMER_CHURN AS SELECT (CASE WHEN SAMPLES.CUSTOMER_CHURN."CENSOR" = '1' THEN 'YES' ELSE 'NO' END) CHURN, IN_B2B_INDUSTRY, TOTAL_BUY, ANNUAL_REVENUE_MIL, CUST_ID AS ID from SAMPLES.CUSTOMER_CHURN;
Naive Bayes 예측을 위해서는 훈련 데이터를 포함하는 테이블이 필요합니다. 다음 호출은 CUSTOMER_CHURN 보기로부터 이 테이블을 작성하는 방법을 보여줍니다.
CALL IDAX.SPLIT_DATA('intable=customer_churn, traintable=customer_churn_training, testtable=customer_churn_testing, id=id, fraction=0.65');
다음 예는 이산화 알고리즘 및 구간 수를 정의하는 방법을 보여줍니다.
CALL IDAX.NAIVEBAYES('intable=customer_churn_training, disc=ew, bins=20, id=id, target=churn, model=cc_nb_ewd'); 

CALL IDAX.NAIVEBAYES('intable=customer_churn_training, disc=ef, bins=20, id=id, target=churn, model=cc_nb_efd'); 

CALL IDAX.NAIVEBAYES('intable=customer_churn_training, disc=ewn, id=id, target=churn, model=cc_nb_ewnd'); 

작성된 모델은 각 속성-값-클래스 조합에 대한 하나의 행과 다음 컬럼을 포함하는 테이블로 표현됩니다.

attribute
속성입니다.
val
값입니다.
class
클래스입니다.
classvalcount
훈련 세트의 클래스 내 해당 속성의 해당 값 어커런스의 수입니다.
classcount
훈련 세트 내 클래스 어커런스의 수입니다.
attrclasscount
훈련 세트 내 클래스의 널(NULL)이 아닌 어커런스의 수입니다.
totalcount
훈련 세트 내 모든 인스턴스의 수입니다.

이러한 매개변수만 있으면 Naive Bayes 예측에 사용할 수 있는 사전 클래스 확률 및 조건부 속성 값 확률을 계산할 수 있습니다.

테스트 세트 예측을 생성하려는 경우에는 결과 모델을 다음과 같이 사용할 수 있습니다.

CALL IDAX.PREDICT_NAIVEBAYES('model=cc_nb_ewd, intable=customer_churn_testing, outtable=customer_churn_nb_ewd, outtableprob = customer_churn_nb_ewd_prob'); 

CALL IDAX.PREDICT_NAIVEBAYES('model=cc_nb_efd, intable=customer_churn_testing, outtable=customer_churn_nb_efd, outtableprob = customer_churn_nb_efd_prob');

CALL IDAX.PREDICT_NAIVEBAYES('model=cc_nb_ewnd, intable=customer_churn_testing, outtable=customer_churn_nb_ewnd,outtableprob = customer_churn_nb_ewnd_prob');
참고: 테스트 데이터의 예측 프로시저에 대한 ID가 훈련 데이터의 예측 프로시저에 대한 ID와 동일한 경우에는 이를 정의할 필요가 없습니다.

각 모델 적용을 위한 테스트 세트는 해당 훈련 세트와 동일한 간격을 사용하여 이산화됩니다. 지정된 출력 테이블은 생성된 예측을 포함합니다. 이는 id 컬럼 및 class 컬럼을 포함합니다.

또한, 이름에 _prob 접미부가 추가된 다른 출력 테이블이 작성됩니다. 이 출력 테이블은 각 인스턴스 및 가능한 클래스에 대한 하나의 행과 다음 컬럼을 포함합니다.

id
인스턴스 ID입니다.
class
클래스입니다.
prob
인스턴스 클래스의 Bayesian 분자입니다.

이 분자는 클래스 확률 및 조건부 인스턴스 속성 값 확률로부터 산출된 것입니다.

lnprob
prob의 자연로그입니다.

사용자는 모델 예측을 더 잘 이해하기 위해 또는 모델 작동을 수정하기 위해 이러한 확률을 사용할 수 있습니다. 사용자는 정규화를 통해 Bayesian 분자를 정규 확률로 변환할 수 있습니다. 정규화는 동일한 인스턴스 및 모든 클래스의 분자의 합에 의한 나누기를 의미합니다.

다음 쿼리는 최소 엔트로피 이산화에 의해 생성된 세 번째 모델에 대한 각 인스턴스 및 해당 예측 클래스 레이블에 클래스 확률을 더하는 예를 보여줍니다.

SELECT S.id, S.class, S.prob/S.sump as prob 
FROM (SELECT id, class, prob, sum(prob) OVER (PARTITION BY id) AS sump FROM customer_churn_nb_ewnd_prob) S, customer_churn_nb_ewnd P 
WHERE S.id=P.id AND S.class=P.class; 

획득한 예측의 품질을 평가하려는 경우에는 오분류 오류를 다음과 같이 계산할 수 있습니다.

CALL IDAX.CERROR('intable=customer_churn_nb_ewd, resulttable=customer_churn_testing, id=id, target=class, resulttarget=churn');

CALL IDAX.CERROR('intable=customer_churn_nb_efd, resulttable=customer_churn_testing, id=id, target=class, resulttarget=churn'); 

CALL IDAX.CERROR('intable=customer_churn_nb_ewnd, resulttable=customer_churn_testing, id=id, target=class, resulttarget=churn'); 

이들 모델은 유사하게 작동하지만, 동일 빈도 이산화를 기반으로 하는 첫 번째 모델은 다른 두 모델만큼 정확하지 않습니다. 또한 모든 모델에서 0.37보다 큰 오분류 오류 레벨은 Naive Bayes 분류자가 고객 이탈 데이터 세트에 대해 적합하지 않음을 나타냅니다.

예측 중에 확률을 전혀 얻지 못하는 경우를 방지하기 위해 m-추정 기술을 사용할 수 있습니다.

이 기술을 사용하려면 다음과 같이 PREDICT_NAIVEBAYES 프로시저에 대해 mestimation=TRUE 인수를 지정합니다.

CALL IDAX.PREDICT_NAIVEBAYES('model=cc_nb_ewnd, intable=customer_churn_testing, mestimation=TRUE, outtable=customer_churn_nb_ewnd_mest'); 

CALL IDAX.CERROR('pred_table=customer_churn_nb_ewnd_mest, true_table=customer_churn_testing, pred_id=id, true_id=id, pred_column=class, true_column=churn');

분석 결과는 이 기술이 customer_churn 데이터에 대해 생성된 예측의 품질에 거의 영향을 주지 못했음을 보여줍니다.

예측 품질을 더 자세히 분석하려는 경우에는 혼동 매트릭스와 산출된 품질 지표를 사용할 수 있습니다. 이는 세 번째 모델에 대해 다음과 같이 진행됩니다.

CALL IDAX.CONFUSION_MATRIX('intable=customer_churn_testing, resulttable=customer_churn_nb_ewnd, id=id, target=churn, matrixTable=cc_churn_nb_ewnd_cm'); 

CALL IDAX.CMATRIX_STATS('matrixTable=cc_churn_nb_ewnd_cm'); 

이 결과는 고객 이탈 데이터에 대한 Naive Bayes 예측의 품질에 대해 새로운 사실을 알려줍니다. 많은 오분류 오류로 인해 0.55에 가까운 거짓 긍정(false positive) 비율이 나타나지만, 동시에 고객 이탈이 긍정으로 간주된 참 긍정 비율 또한 0.77 가까이 높게 나타났다는 점입니다.

사용자는 다음 명령문에 표시되어 있는 바와 같이 모든 컬럼을 유형 및 역할별로 정의할 수 있습니다.

CALL IDAX.NAIVEBAYES('model=cc_nb1, intable=customer_churn_training, id=id, target=churn');

이 명령문은 다음 것과 동일합니다.

CALL IDAX.NAIVEBAYES('model=cc_nb2, intable=customer_churn_training, incolumn=id:id, target=churn');

명목 속성 및 연속 속성을 수동으로 정의하려는 경우에는 nom 유형 및 cont 유형을 사용할 수 있습니다.

CALL IDAX.NAIVEBAYES('model=cc_nb3, intable=customer_churn_training,incolumn=IN_B2B_INDUSTRY:nom;TOTAL_BUY:cont;CHURN:target;ID:id');

또한 1컬럼 특성 정의를 작성하고 이를 모델에 여러 번 전달할 수도 있습니다.

CALL IDAX.COLUMN_PROPERTIES('intable=customer_churn_training, outtable=cc_columns, coldeftype=cont, incolumn=IN_B2B_INDUSTRY:nom;TOTAL_BUY:cont;ANNUAL_REVENUE_MIL:cont:ignore;CHURN:nom:target;ID:id');

select * from cc_columns;

CALL IDAX.NAIVEBAYES('model=cc_nb4, intable=customer_churn_training,colPropertiesTable=cc_columns');