program story

Naive Bayes 분류기의 정확도를 향상시키는 방법은 무엇입니까?

inputbox 2020. 11. 18. 09:01
반응형

Naive Bayes 분류기의 정확도를 향상시키는 방법은 무엇입니까?


Naive Bayes 분류기를 사용하여 수천 개의 문서를 30 개의 다른 범주로 분류하고 있습니다. Naive Bayes Classifier를 구현했으며 일부 기능 선택 (대부분 쓸모없는 단어 필터링)을 통해 약 30 %의 테스트 정확도와 45 %의 훈련 정확도를 얻었습니다. 이것은 무작위보다 훨씬 낫지 만 더 좋기를 바랍니다.

나는 NB와 함께 AdaBoost를 구현해 보았지만 현저하게 더 나은 결과를 제공하지 않는 것 같습니다 (문헌은 이것에 대해 분할 된 것처럼 보이며, 일부 논문에서는 NB를 사용하는 AdaBoost가 더 나은 결과를 제공하지 않는다고 말합니다.) 더 나은 정확도를 제공 할 수있는 다른 NB 확장에 대해 알고 있습니까?


내 경험상 적절하게 훈련 된 Naive Bayes 분류기는 일반적으로 놀랍도록 정확합니다 (그리고 훈련하는 데 매우 빠릅니다. 내가 사용해 본 어떤 분류기 빌더보다 눈에 띄게 빠릅니다).

따라서 분류 자 ​​예측을 개선하려면 여러 위치를 살펴볼 수 있습니다.

  • 분류기 조정 (분류기의 조정 가능한 매개 변수 조정)

  • 일종의 분류기 조합 기술 (예 : 앙상블, 부스팅, 배깅)을 적용합니다. 또는 당신은 할 수 있습니다

  • 더 많은 데이터를 추가하거나 기본 구문 분석을 개선하거나 데이터에서 선택한 기능을 구체화하는 등 분류 자 제공된 데이터를 살펴보십시오 .

순진한 베이지안 분류기를 사용하면 매개 변수 조정이 제한됩니다. 전처리 품질 및 기능 선택과 같은 데이터에 집중하는 것이 좋습니다.

I. 데이터 파싱 (전처리)

원시 데이터가 각 데이터 포인트에 대한 원시 텍스트 문자열과 같다고 가정합니다. 일련의 처리 단계에 따라 각 오프셋이 하나의 기능에 해당하도록 각 데이터 포인트에 대해 각 문자열을 구조화 된 벡터 (1D 배열)로 변환합니다 ( 일반적으로 단어) 및 해당 오프셋의 값은 주파수에 해당합니다.

  • 형태소 분석 : 수동으로 또는 형태소 라이브러리를 사용하여? 인기있는 오픈 소스는 Porter, Lancaster 및 Snowball입니다. 예를 들어 주어진 데이터 포인트에 프로그래밍프로그래머, 프로그램, 프로 게이밍 이라는 용어가있는 경우 형태소 분석기는이를 단일 어간 (아마 program )으로 축소하여 해당 데이터 포인트에 대한 용어 벡터의 값이 4가됩니다. 아마 당신이 원하는 기능 프로그램입니다.

  • 동의어 찾기 : 형태소 분석과 동일한 아이디어-관련 단어를 단일 단어로 접습니다. 따라서 동의어 찾기는 개발자, 프로그래머, 코더 및 소프트웨어 엔지니어를 식별하여 단일 용어로 롤링 할 수 있습니다.

  • 중립적 인 단어 : 수업 전반에 걸쳐 빈도가 비슷한 단어는 기능이 좋지 않습니다


II. 기능 선택

NBC에 대한 전형적인 사용 사례를 고려하십시오. 스팸 필터링; 어떻게 실패하는지 빠르게 확인할 수 있으며 개선 방법을 빠르게 확인할 수 있습니다. 예를 들어 평균 이상의 스팸 필터에는 모두 대문자로 된 단어의 빈도, 제목의 단어 빈도, 제목의 느낌표 발생과 같은 미묘한 기능이 있습니다. 또한 가장 좋은 기능은 종종 단일 단어가 아니라 단어 쌍 또는 더 큰 단어 그룹 입니다.

III. 특정 분류기 최적화

30 개의 클래스 대신 '일대 다'체계 를 사용합니다. 즉, 두 클래스 분류 자 ​​(Class A 및 'all else')로 시작한 다음 'all else'클래스의 결과가 다음으로 반환됩니다. 클래스 B 및 '기타'등으로 분류하는 알고리즘

Fisher 방법 (아마도 Naive Bayes 분류기를 최적화하는 가장 일반적인 방법입니다.) 저는 Fisher 가 입력 확률 정규화 (더 정확하게는 표준화 )하는 것으로 생각 합니다 . NBC는 기능 확률을 사용하여 '전체 문서'확률을 구성합니다. . Fisher 방법 은 문서의 기능에 대한 범주의 확률을 계산 한 다음 이러한 기능 확률을 결합하고 조합 된 확률을 임의의 특징 집합의 확률과 비교합니다.


내가 사용하는 것이 좋습니다 것 SGDClassifier 에서와 같이 정규화 강도의 측면에서와 조정을.

또한 TFIFVectorizer 의 매개 변수를 조정하여 사용중인 TFIDF에서 공식을 조정 해보 십시오 .

  • 나는 일반적으로 텍스트 분류 문제의 경우 SVM 또는 로지스틱 회귀 분석에서 일대일 훈련이 NB를 능가합니다. 더 긴 문서에 대한 Stanford 사람들의이 멋진 기사 에서 볼 수 있듯이 SVM은 NB를 능가합니다. SVM과 NB ( NBSVM ) 의 조합을 사용하는 논문의 코드 여기에 있습니다 .

  • 둘째, TFIDF 공식 (예 : 부 선형 tf, smooth_idf)을 조정합니다.

  • 다른 문서 길이를 보상하므로 l2 또는 l1 정규화 (Tfidfvectorization의 기본값)로 샘플을 정규화 합니다.

  • Multilayer Perceptron 은 일반적으로 많은 텍스트 분류 문제에 내재 된 비선형 성이 도입되어 NB 또는 SVM보다 더 나은 결과를 얻습니다. 사용하기 쉽고 여기에서 다운로드 할 수있는 Theano / Lasagne를 사용하여 고도로 병렬화 된 것을 구현했습니다 .

  • l1 / l2 / elasticnet 정규화조정하십시오 . SGDClassifier / SVM / Logistic Regression에서 큰 차이를 만듭니다.

  • tfidfvectorizer에서 구성 할 수있는 n-gram사용해보십시오 .

  • 문서에 구조가있는 경우 (예 : 제목이있는 경우 ) 부분마다 다른 기능을 사용하는 것이 좋습니다. 예를 들어 문서 제목에 word1이있는 경우 title_word1을 문서에 추가합니다.

  • 문서길이를 기능으로 사용하는 것이 좋습니다 (예 : 단어 또는 문자 수).

  • 사용을 고려 메타 정보 문서에 대한 (창조의 예를 들면 시간, 작성자 이름, 문서의 URL 등).

  • 최근 Facebook 은 여러 작업에서 매우 잘 수행되는 FastText 분류 코드게시 했습니다. 꼭 시도해보십시오.


AdaBoost와 함께 Laplacian 수정 사용.

AdaBoost에서는 먼저 훈련 데이터 세트의 각 데이터 튜플에 가중치가 할당됩니다. intial 가중치가 설정되어 사용 init_weights되도록 각각의 가중치를 초기화하는 방법 1/d, d트레이닝 데이터 세트의 크기이다.

그런 다음 generate_classifiers메서드가 호출되어 k시간 이 실행 k되어 Naïve Bayes 분류기의 인스턴스가 생성 됩니다. 그런 다음 이러한 분류기에 가중치가 부여되고 테스트 데이터가 각 분류 자에서 실행됩니다. 분류기의 가중치 "투표"합계가 최종 분류를 구성합니다.


n 크기를 작게 유지하면 NB가 만들어져 높은 정확도의 결과를 얻을 수 있습니다. 핵심은 n 크기가 증가함에 따라 정확도가 떨어집니다.


상관 관계가 적은 기능을 선택하십시오. 한 번에 다양한 기능 조합을 사용해보십시오.

참고 URL : https://stackoverflow.com/questions/3473612/ways-to-improve-the-accuracy-of-a-naive-bayes-classifier

반응형