단순 베이즈 분류기

Similar documents
확률 및 분포

기술통계

17장 클래스와 메소드

Probability Overview Naive Bayes Classifier Director of TEAMLAB Sungchul Choi

Lecture12_Bayesian_Decision_Thoery

8장 문자열


COVER.HWP

이슈분석 2000 Vol.1

가볍게읽는-내지-1-2

kbs_thesis.hwp


untitled

한눈에-아세안 내지-1

표본재추출(resampling) 방법

통계적 학습(statistical learning)

tkinter를 이용한 계산기 구현

Resampling Methods

게시판 스팸 실시간 차단 시스템

야쿠르트2010 3월 - 최종

<443A5C4C C4B48555C B3E25C32C7D0B1E25CBCB3B0E8C7C1B7CEC1A7C6AE425CBED0C3E0C7C1B7CEB1D7B7A55C D616E2E637070>

비선형으로의 확장

< 목차 > Ⅰ. 개요 3 Ⅱ. 실시간스팸차단리스트 (RBL) ( 간편설정 ) 4 1. 메일서버 (Exchange Server 2007) 설정변경 4 2. 스팸차단테스트 10

PowerPoint 프레젠테이션

예제 1.1 ( 관계연산자 ) >> A=1:9, B=9-A A = B = >> tf = A>4 % 4 보다큰 A 의원소들을찾을경우 tf = >> tf = (A==B) % A

chap01_time_complexity.key

14장 파일

untitled

Microsoft PowerPoint Predicates and Quantifiers.ppt

10장 리스트


2017 년 6 월한국소프트웨어감정평가학회논문지제 13 권제 1 호 Abstract

Eclipse 와 Firefox 를이용한 Javascript 개발 발표자 : 문경대 11 년 10 월 26 일수요일

Secure Programming Lecture1 : Introduction

chap 5: Trees

데이터 시각화

Polly_with_Serverless_HOL_hyouk

NLTK 6: 텍스트 분류 학습 (` `%%%`#`&12_`__~~~ౡ氀猀攀)

untitled

슬라이드 1

chapter4

10주차.key

OCaml


정치사적

4. #include <stdio.h> #include <stdlib.h> int main() { functiona(); } void functiona() { printf("hihi\n"); } warning: conflicting types for functiona


커널 방법론

[ 영어영문학 ] 제 55 권 4 호 (2010) ( ) ( ) ( ) 1) Kyuchul Yoon, Ji-Yeon Oh & Sang-Cheol Ahn. Teaching English prosody through English poems with clon

12-file.key

歯처리.PDF

融合先验信息到三维重建 组会报 告[2]

쉽게 풀어쓴 C 프로그래밍

ilist.add(new Integer(1))과 같이 사용하지 않고 ilist.add(1)과 같이 사용한 것은 자바 5.0에 추가된 기본 자료형과 해당 객체 자료 형과의 오토박싱/언박싱 기능을 사용한 것으로 오토박싱이란 자바 컴파일러가 객체를 요구하는 곳에 기본 자료형

전립선암발생률추정과관련요인분석 : The Korean Cancer Prevention Study-II (KCPS-II)

3장 함수

Microsoft Word - 김창환.doc

Week5

Hi-MO 애프터케어 시스템 편 5. 오비맥주 카스 카스 후레쉬 테이블 맥주는 천연식품이다 편 처음 스타일 그대로, 부탁 케어~ Hi-MO 애프터케어 시스템 지속적인 모발 관리로 끝까지 스타일이 유지되도록 독보적이다! 근데 그거 아세요? 맥주도 인공첨가물이

May 2014 BROWN Education Webzine vol.3 감사합니다. 그리고 고맙습니다. 목차 From Editor 당신에게 소중한 사람은 누구인가요? Guidance 우리 아이 좋은 점 칭찬하기 고맙다고 말해주세요 Homeschool [TIP] Famil

본교재는수업용으로제작된게시물입니다. 영리목적으로사용할경우저작권법제 30 조항에의거법적처벌을받을수있습니다. [ 실습 ] 스위치장비초기화 1. NVRAM 에저장되어있는 'startup-config' 파일이있다면, 삭제를실시한다. SWx>enable SWx#erase sta

Let G = (V, E) be a connected, undirected graph with a real-valued weight function w defined on E. Let A be a set of E, possibly empty, that is includ

DIY 챗봇 - LangCon

다중 한것은 Mahout 터 닝알 즘몇 를 현 다는것외 들을 현 Hadoop 의 MapReduce 프 워크와결 을 다는것 다. 계산 많은 닝은 컴퓨터의큰메 와연산기 을 만 Mahout 는최대한 MapReduce 기 을활용 터분 다용 졌다.. Mahout 의설 Mahou

9장. 연관규칙분석과 협업필터링

고차원에서의 유의성 검정

9장. 연관규칙분석과 협업필터링

Tcl의 문법

CMSX-C-U-F1_BES_C_ b_ k1

Chapter 1

MPLAB C18 C

A Hierarchical Approach to Interactive Motion Editing for Human-like Figures

PowerChute Personal Edition v3.1.0 에이전트 사용 설명서


서론 34 2

11장 포인터

Page 2 of 5 아니다 means to not be, and is therefore the opposite of 이다. While English simply turns words like to be or to exist negative by adding not,

untitled

B _01_M_Korea.indb

ePapyrus PDF Document

확률과통계 강의자료-1.hwp

Remote UI Guide

PowerPoint Presentation

C++-¿Ïº®Çؼ³10Àå

2016년 트렌드 책목차를 활용한 시장 예측.numbers

6자료집최종(6.8))

0. 표지에이름과학번을적으시오. (6) 1. 변수 x, y 가 integer type 이라가정하고다음빈칸에 x 와 y 의계산결과값을적으시오. (5) x = (3 + 7) * 6; x = 60 x = (12 + 6) / 2 * 3; x = 27 x = 3 * (8 / 4

rosaec_workshop_talk

Smart Power Scope Release Informations.pages

BMP 파일 처리

Page 2 of 6 Here are the rules for conjugating Whether (or not) and If when using a Descriptive Verb. The only difference here from Action Verbs is wh

***86호

林 海 彰 敎 授 指 導 碩 士 學 位 論 文 본문과 덧글의 동시출현 자질을 이용한 역 카이제곱 기반 블로그 덧글 스팸 필터 시스템 A Comment Spam Filter System based on Inverse Chi- Square Using of Co-occurr

¹Ìµå¹Ì3Â÷Àμâ

광덕산 레이더 자료를 이용한 강원중북부 내륙지방의 강수특성 연구

00_표지.indd

(2005) ,,.,..,,..,.,,,,,

Tablespace On-Offline 테이블스페이스 온라인/오프라인

adfasdfasfdasfasfadf

Transcription:

단순베이즈분류기 박창이 서울시립대학교통계학과 박창이 ( 서울시립대학교통계학과 ) 단순베이즈분류기 1 / 14

학습내용 단순베이즈분류 구현 예제 박창이 ( 서울시립대학교통계학과 ) 단순베이즈분류기 2 / 14

단순베이즈분류 I 입력변수의값이 x = (x 1,..., x p ) 로주어졌을때 Y = k일사후확률 P(Y = k X 1 = x 1,..., X p = x p ) P(X 1 = x 1,..., X p = x p Y = k)p(y = k) 단순베이즈가정 (naive Bayes assumption) p P(X 1 = x 1,..., X p = x p Y = k) = P(X j = x j Y = k) p P(Y = k X 1 = x 1,..., X p = x p ) P(Y = k) P(X j = x j Y = k) j=1 j=1 박창이 ( 서울시립대학교통계학과 ) 단순베이즈분류기 3 / 14

단순베이즈분류 II 훈련자료를이용하여모든 j 와 k 에대하여추정값 ˆP(Y = k) 와 ˆP(X j = x j Y = k) 을얻은후주어진시험자료 z = (z 1,..., z p ) 에 대하여 Y 를 arg max k K ˆP(Y = k) p ˆP(X j = z j Y = k) 로예측하며입력변수가연속형인경우에는흔히구간을나눠서범주형으로변환 특정변수에서의확률추정값이 0 이면다른변수에서의확률추정값이큰값을가지더라도그곱은항상 0 이되는문제발생 j=1 박창이 ( 서울시립대학교통계학과 ) 단순베이즈분류기 4 / 14

단순베이즈분류 III 라플라스평활 (Laplace smoothing) ( 예 ) 유, 무 : 0, 990 라플라스수정 : k, 990 + k 확률추정값 : k 990+2k, 990+k 990+2k 수정을하지않았을때와큰차이가없고추정값이정확히 0 이되어생기는문제가발생하지않음 박창이 ( 서울시립대학교통계학과 ) 단순베이즈분류기 5 / 14

구현 I 전처리 : 메시지를단어단위로자르고모두소문자화 def tokenize(message): message = message.lower() # convert to lowercase all_words = re.findall("[a-z0-9 ]+", message) # extract the words return set(all_words) # remove duplicates 스팸과스팸이아닌경우의단어의빈도수세기 def count_words(training_set): """training set consists of pairs (message, is_spam)""" counts = defaultdict(lambda: [0, 0]) for message, is_spam in training_set: for word in tokenize(message): counts[word][0 if is_spam else 1] += 1 return counts 박창이 ( 서울시립대학교통계학과 ) 단순베이즈분류기 6 / 14

구현 II 평활을이용한확률추정 def word_probabilities(counts, total_spams, total_non_spams, k=0.5): """turn the word_counts into a list of triplets w, p(w spam) and p(w ~spam)""" return [(w, (spam + k) / (total_spams + 2 * k), (non_spam + k) / (total_non_spams + 2 * k)) for w, (spam, non_spam) in counts.items()] 박창이 ( 서울시립대학교통계학과 ) 단순베이즈분류기 7 / 14

구현 III 메시지가스팸일확률예측 def spam_probability(word_probs, message): message_words = tokenize(message) log_prob_if_spam = log_prob_if_not_spam = 0.0 for word, prob_if_spam, prob_if_not_spam in word_probs: # for each word in the message, add the log probability of seeing it if word in message_words: log_prob_if_spam += math.log(prob_if_spam) log_prob_if_not_spam += math.log(prob_if_not_spam) # for each word that s not in the message, add the log probability of # _not_ seeing it else: log_prob_if_spam += math.log(1.0 - prob_if_spam) log_prob_if_not_spam += math.log(1.0 - prob_if_not_spam) prob_if_spam = math.exp(log_prob_if_spam) prob_if_not_spam = math.exp(log_prob_if_not_spam) return prob_if_spam / (prob_if_spam + prob_if_not_spam) 박창이 ( 서울시립대학교통계학과 ) 단순베이즈분류기 8 / 14

구현 IV 단순베이즈분류기 class NaiveBayesClassifier: def init (self, k=0.5): self.k = k self.word_probs = [] def train(self, training_set): # count spam and non-spam messages num_spams = len([is_spam for message, is_spam in training_set if is_spam]) num_non_spams = len(training_set) - num_spams # run training data through our "pipeline" word_counts = count_words(training_set) self.word_probs = word_probabilities(word_counts,num_spams, num_non_spams,self.k) def classify(self, message): return spam_probability(self.word_probs, message) 박창이 ( 서울시립대학교통계학과 ) 단순베이즈분류기 9 / 14

예제 I spam.zip 파일을적당한위치에압축풀고다음과같이이메일의제목추출 path = "D:\spam\*\*" data = [] # regex for stripping out the leading "Subject:" and any spaces after it subject_regex = re.compile(r"^subject:\s+") # glob.glob returns every filename that matches the wildcarded path for fn in glob.glob(path): is_spam = "ham" not in fn with open(fn, r,encoding= ISO-8859-1 ) as file: for line in file: if line.startswith("subject:"): subject = subject_regex.sub("", line).strip() data.append((subject, is_spam)) 박창이 ( 서울시립대학교통계학과 ) 단순베이즈분류기 10 / 14

예제 II 훈련과시험데이터로랜덤하게분할한후훈련 random.seed(0) # just so you get the same answers as me train_data, test_data = split_data(data, 0.75) classifier = NaiveBayesClassifier() classifier.train(train_data) 박창이 ( 서울시립대학교통계학과 ) 단순베이즈분류기 11 / 14

예제 III 결과 classified = [(subject, is_spam, classifier.classify(subject)) for subject, is_spam in test_data] counts = Counter((is_spam, spam_probability > 0.5) # (actual, predicted for _, is_spam, spam_probability in classified) print(counts) Counter({(False, False): 704, (True, True): 101, (True, False): 38, (Fa 정밀도 101/(101+33)=75%, 재현율 101/(101+38)=73% 박창이 ( 서울시립대학교통계학과 ) 단순베이즈분류기 12 / 14

예제 IV 스팸일확률이가장높은단어 def p_spam_given_word(word_prob): word, prob_if_spam, prob_if_not_spam = word_prob return prob_if_spam / (prob_if_spam + prob_if_not_spam) words = sorted(classifier.word_probs, key=p_spam_given_word) spammiest_words = words[-5:] hammiest_words = words[:5] spammiest words: year, rates, sale, systemworks, money hammiest words: spambayes, users, razor, zzzzteana, sadev 박창이 ( 서울시립대학교통계학과 ) 단순베이즈분류기 13 / 14

예제 V 기타 제목뿐만아니라메시지의내용을고려할수도... 단어의최소빈도수설정동의어를고려 : stemming Porter stemmer(http://tartarus.org/martin/porterstemmer/) 등을사용할수있음 박창이 ( 서울시립대학교통계학과 ) 단순베이즈분류기 14 / 14