project:eve
23.02.11 Naive Bayes ๋์ด๋ธ ๋ฒ ์ด์ฆ ๋ณธ๋ฌธ
Studying here๐ ์คํ๋ฒ ์ค ๋์ข ๋กR์
๋์ด๋ธ๋ฒ ์ด์ฆ(naive-bayes)
๋์ด๋ธ ๋ฒ ์ด์ฆ๋ ๋ฒ ์ด์ฆ ์ ๋ฆฌ๋ฅผ ๊ธฐ๋ฐ์ผ๋ก ํ๋ ๋ถ์ ๋ชจ๋ธ. ์ ์ฒด์ ํ๋ฅ ๋ถํฌ ๋๋น ํน์ ํด๋์ค์ ์ํ ํ๋ฅ ์ ์ ๋ฆฌํจ.
์๋ฅผ ๋ค์ด ๋ฉ์ผ์ ์คํธ ๊ธฐ์ค์ ํ์ ํ๋ค๋ฉด, ์คํธ๋ฉ์ผ์ ๋ณต๊ถ์ด๋ผ๋ ๋จ์ด๊ฐ ๋ค์ด์์ ํ๋ฅ ์ ์๋ค๋ฉด ์คํธ๋ฉ์ผ์ ๋ณต๊ถ์ด๋ผ๋ ๋จ์ด๊ฐ ๋ค์ด์์ ๋ ์คํธ๋ฉ์ผ์ผ ํ๋ฅ ์ ๊ตฌํ ์ ์๋ ๊ฒ์ด๋ค.
๊ฐ๋จํ๊ณ ๋น ๋ฅด๊ธฐ ๋๋ฌธ์ ์ถ์ ํ๋ฅ ์ ์ฝ๊ฒ ๊ตฌํ ์ ์๋ค.
๋จ์ ์ ๋ชจ๋ ๋ ๋ฆฝ๋ณ์์ ์๊ด์ฑ์ ๋ฌด์ํ๊ธฐ ๋๋ฌธ์ ๊ฒฐ๊ณผ๊ฐ ์๊ณก๋ ์ ์๋ค.
๋ฐ์ดํฐ๊ฐ ์ ์ ๋๋ ๋ฏธ๋๋ฅผ ์์ธกํ ๋ ์์ฃผ ์ฌ์ฉํ๋ค.
1) ๋ฒ ์ด์ฆ ์ ๋ฆฌ
์ฌ๊ฑด A, B๊ฐ ์์ ๋, B๊ฐ ์ผ์ด๋ ๋ค์ A๊ฐ ์ผ์ด๋ ํ๋ฅ ์ ๊ตฌํ๋ค.
๊ทธ๋ฐ๋ฐ ์ง๊ธ ์๊ณ ์๋ ๊ฒ์ A, B๊ฐ ๊ฐ๊ฐ ์ผ์ด๋ ํ๋ฅ , A๊ฐ ์ผ์ด๋ฌ์ ๋ B๊ฐ ์ผ์ด๋ ํ๋ฅ ์ด๋ค. ์ด ๋ฐ์ดํฐ๋ฅผ ๊ฐ์ง๊ณ ๊ตฌํ๊ณ ์ ํ๋ ๊ฒ์ ๊ณ์ฐํ๋ ๊ณต์์ ๋งํ๋ค.

์ด๋ฐ ๊ฐ์ ์ด ์๋ค๊ณ ํด๋ณด์

์ธ๋ป ๋ณด๋ฉด ๋ง๋ ์๋ฆฌ ๊ฐ์ง๋ง, ๋ ์ง๋จ์ ๋ชจ์งํฉ์ด ๋ค๋ฅด๋ค๋ ๊ฒ์ ์๊ฐํด ๋ณด๋ฉด ๊ธ๋ฐฉ ์ค๋ฅ๋ฅผ ์ ์ ์๋ค. ์ฌ๊ณ ๋ก ์ฌ๋งํ ์ฌ๋์ 100๋ช ์ด๋ผ๊ณ ์น๋ฉด, 40๋ช ์ ์์ ๋ ๋ฅผ ๋งค์ง ์์ ์ฃฝ์ ๊ฒ์ด๋ค. ๊ทธ๋ผ 60๋ช ์ ์์ ๋ ๋ฅผ ๋งค๊ณ ์๋ ์ฃฝ์ ๊ฒ์ด๋ค. ๊ทธ๋ฐ๋ฐ ์ ์ฒด ์ด์ ์ ์ค์ ์์ ๋ ๋ฅผ ๋งค์ง ์์ ์ฌ๋์ ๋ช๋ช ์ผ๊น? ๊ทธ๋ฆฌ๊ณ ์์ ๋ ๋ฅผ ๋งจ ์ฌ๋์? ์ด ๋น์จ์ ์๋ฉด ํ์คํ๊ฒ ์ค๋ฅ๋ฅผ ์ง์ ํ ์ ์๋ค.
์์ ๋ฒ ์ด์ฆ ์ ๋ฆฌ์ ์ฐ๊ฒฐ์ง์ด ์๊ฐํ์ ๋ ์์ ๋ ๋ฅผ ๋งค๋ ์์ ๋ ๋ฅผ ๋งค๋ ์ฌ๊ฑด์ P(A)๋ผ๊ณ ํ๊ณ ์ฌ๊ณ ๋ฅผ ๋นํ ํ๋ฅ ์ P(B)๋ผ๊ณ ์๊ฐํด ๋ณด์.
๊ทธ๋ฌ๋ฉด P(A|B)๋ 0.6์ด ๋๋ค. ์ด๋ ์ง๋ฌธ๋๋ก ์ฐ๋ฆฌ๊ฐ ๊ถ๊ธํ ๊ฒ์ ์์ ๋ ๋ฅผ ๋งธ์ ๋ ์ฃฝ์ ํ๋ฅ P(B|A) ์ด๋ค. ์ด๊ฒ์ ๋ฒ ์ด์ฆ ์ ๋ฆฌ๋ก ๊ตฌํ ์ ์๋ค. ๋ ์ ์ฒด ์ด์ ์ ์ค 95%๊ฐ ์์ ๋ ๋ฅผ ๋งธ๊ณ 5%๊ฐ ์์ ๋ ๋ฅผ ๋งค์ง ์์๋ค๊ณ ๊ฐ์ ํ๋ฉด, 40๋ช ์ 5%์ 40๋ช ์ด๊ณ 60๋ช ์ 95%์ 60๋ช ์ธ ๊ฒ์ด๋ค. ๋ ์ ์ฒด ์ด์ ์ 1๋ง๋ช ์ค 1๋ช ๊ผด๋ก ์ฌ๊ณ ๋ฅผ ๋นํ๋ค๊ณ ๊ฐ์ ํ๋ฉด ์ ์๋ 5000๋ช ์ค 40๋ช ์ด ์ฃฝ๋ ๊ฒ์ด๊ณ ํ์๋ 95000๋ช ์ค 60๋ช ์ด ์ฃฝ๋ ๊ฒ์ด๋ค. ๊ทธ๋ผ ํ๋ฅ ๋ ์์ฒญ ์ฐจ์ด๊ฐ ๋๊ฒ ์ง???
๊ทธ๋ฆฌ๊ณ P(A)๋ 0.95, P(B)๋ 0.0001์ด ๋๋ค.
์ด์ ์์ ๊ณต์์ ์ฌ์ฉํด์ ๊ณ์ฐํด๋ณด์.
์์ ๋ ๋ฅผ ๋งธ์ ๋ ์ฌ๊ณ ๋ฅผ ๋นํ ํ๋ฅ P(B|A)๋ '(์ฌ๊ณ ๋ฅผ ๋นํ์ ๋ ์์ ๋ ๋ฅผ ๋งธ์ ํ๋ฅ *์ฌ๊ณ ๋ฅผ ๋นํ ํ๋ฅ )/ ์์ ๋ ๋ฅผ ๋งฌ ํ๋ฅ ' ์ด๋ผ๊ณ ํ ์ ์๋ค. ์ฆ 0.6*0.0001/0.95=0.000063์ด ๋๋ค.(์ฝ 16000๋ช ๋น 1๋ช )
๋ฐ๋๋ก ์์ ๋ ๋ฅผ ์ ๋งธ์ ๋ ์ฌ๊ณ ๋ฅผ ๋นํ ํ๋ฅ ์ P(A)=0.5๋ก ๊ณ์ฐํ๋ฉด ๋๋ค. ๊ณ์ฐํ๋ฉด 0.0008(1250๋ช ๋น 1๋ช )
๊ทธ๋ฌ๋ฏ๋ก ์์ ๋ ๋ฅผ ๋งธ์ ๋ ์์ ํ ํ๋ฅ ์ ์์ ๋ ๋ฅผ ๋งค์ง ์์์ ๋์ ๋นํด 10๋ฐฐ ์ด์ ๋๋ค๊ณ ํ ์ ์๋ค.
์ด ์๋ฆฌ๋ฅผ ์ฌ์ฉํด์, ๋ ์ฌ๊ฑด์ด ๋ ๋ฆฝ์ ์ผ๋ก ๋ฐ์ํ๋ค๊ณ ๊ฐ์ ํ์ ๋ ์ฌ์ ํ๋ฅ ๊ณผ ๊ฐ ์ฌ๊ฑด์ ํ๋ฅ ๋ก ์ฌํ ํ๋ฅ ์ ์ถ์ ํด ๋ถ๋ฅํ๋ ๊ฒ์ด๋ค.
2) ๋ผํ๋ผ์ค ์ค๋ฌด๋ฉ
๋์ด๋ธ ๋ฒ ์ด์ฆ ๋ถ๋ฅ๋ฅผ ๋ณด์ ํ๋ ๊ธฐ๋ฒ. ํน์ ์ฌ๊ฑด์ด ์์ ๋ฐ๊ฒฌ๋์ง ์์ ๊ฒฝ์ฐ ๊ฐ์ด 0์ผ๋ก ๊ฒฐ๊ณผ๊ฐ์ด ์๋ฌ๊ฐ ๋ฐ์ํ ์ ์๊ธฐ ๋๋ฌธ์ ๋ชจ๋ ๋ฐ์ดํฐ์์ ์ฌ๊ฑด์ ๋ฐ์ ํ์์ ๊ธฐ๋ณธ๊ฐ์ ์ ๋ ฅํด ๋ณด์ ํด์ค๋ค.
3) ์ข ๋ฅ : ์ข ์๋ณ์ ํด๋์ค์ ํ์์ด๋ ๊ฐ ๋ถํฌ์ ๋ฐ๋ผ ๋๋๋ค.
์๋ ๋ฒ ๋ฅด๋์ด/๋คํญ๋ถํฌ/๊ฐ์ฐ์์์ ํ์์ ๋งํ๋๊ฒ ๋ ๋ฆฝ๋ณ์์ผ, ์ข ์๋ณ์์ผ?
์ฑ ์์๋ ๊ฐ์ฐ์์ ๋งํ ๋ ๋ ๋ฆฝ๋ณ์์ ์ฐ์ํ, ์ข ์๋ณ์์ ๋ฒ์ฃผํ์ ๋ฃ์์. ๊ฐ์ฐ์์์ ใ ๋ ์ํ๋ฐใ ฃ์ดใ ์ด๊ธฐ๋๋ฌธ์
๋๊ฐ์ด ๋ฐ์ง๋ฉด ๋ฒ ๋ฅด๋์ด๋ ๋ ๋ฆฝ๋ณ์๊ฐ ์ด์ฐํ์ด๊ณ ์ข ์๋ณ์๊ฐ ๋ฒ์ฃผํ์ด๋ผ๋ ๋ง์.
๊ทผ๋ฐ ๋ฒ ๋ฅด๋์ด์ ์ฌ์ฉํ๋ ๋ฐ์ดํฐ์ ์ ๋ ๋ฆฝ๋ณ์์ ๋ฒ์ฃผํ๋ฐ์ดํฐ ๋ฃ๊ณ ์ข ์๋ณ์์ ์ด์ฐํ์ ๋ฃ์. ๋ญ์?
์ฌ์ดํธ๋ฅผ ๋ณด๋ ๋ฒ ๋ฅด๋์ด๋ ์ํํ๊ฐ๋ฐ์ดํฐ๋ฅผ ์ฐ๋ฉด x์ ํ, y์ ๊ธ/๋ถ์ ์ด์ฐํ ๋ฐ์ดํฐ๊ฐ ๋ค์ด๊ฐ.
1-Bernouli
์ข ์๋ณ์๊ฐ ๋ฒ์ฃผํ(์ด์ฐํ)์ธ ๊ฒฝ์ฐ(0, 1๋ก ๋ถ๋ฅ)
์คํธ๋ฉ์ผ ๊ตฌ๋ถ : ํน์ ๋ฐ์ดํฐ์ ์ถํ ์ฌ๋ถ์ ๋ฐ๋ผ ์คํธ๋ฉ์ผ์ธ์ง ์ ์์ธ์ง ๋ถ๋ฅ
2-Multinomial
์ข ์๋ณ์๊ฐ ๋ฒ์ฃผํ์ธ ๊ฒฝ์ฐ. ๋ฐ์ดํฐ์ ์ถํ ํ์์ ๋ฐ๋ผ ๊ฐ์ ๋ฌ๋ฆฌํ๋ ๊ฒฝ์ฐ.
์ํ๋ฆฌ๋ทฐ : ํน์ ๋ฐ์ดํฐ๋ค์ ์ถํ ํ์์ ๋ฐ๋ผ ๊ธ์ , ๋ถ์ ๋ถ๋ฅ
3-Gussian
๋ ๋ฆฝ๋ณ์๊ฐ ์ฐ์ํ์ธ ๊ฒฝ์ฐ. ๋ ๋ฆฝ๋ณ์์ ๋ถํฌ๊ฐ ์ ๊ท๋ถํฌ์ธ ๊ฒ์ ๊ฐ์ ํ๊ณ ๋ถ์
4) ์ฝ๋
1- Bernouli
๋ฐ์ดํฐ๋ ์คํธ ๋ฉ์ผ ๋ถ๋ฅ ๋ฐ์ดํฐ๋ฅผ ์ฌ์ฉํ๋ค.
import pandas as pd
spam = pd.read_csv('/Users/eve/Downloads/jupyter notebook/files/spam.csv', encoding='latin1')
spam.head()
spam.info()


๊ฒฐ์ธก์น๋ฅผ ๋ณด๋ 2,3,4์ด์ ๊ฑฐ์ ๋ฐ์ดํฐ๊ฐ ์์ผ๋ฏ๋ก ์ ์ธํ๋ค. v2๋ฅผ ๋ ๋ฆฝ๋ณ์, v1์ ์ข ์๋ณ์๋ก ํด์ ๋ถ์ํด์ผ๊ฒ ๋ค.
sklearn์ CounterVectorizer ํจ์๋ฅผ ์ฐ๋ฉด ์ฌ๋ฌ ๋จ์ด๊ฐ ๋ค์ด์๋ ๋ฐ์ดํฐ๋ฅผ ์ชผ๊ฐ์ ๊ฐ๊ฐ ๋ฒกํฐ๋ก ์ ์ฅํ ์ ์๋ค.
์ฌ์ฉํ๋ ๋ฐฉ๋ฒ์ ์ธ์ฝ๋ฉ ํจ์๋ฅผ ์ฐ๋ ๊ฒ์ฒ๋ผ ํ๋ จ ๋ฐ์ดํฐ๋ฅผ ํ์ต(fit)ํ ๋ค์ ํ๋ จ/๊ฒ์ฆ ๋ฐ์ดํฐ์ ๊ฐ๊ฐ transformํด์ฃผ๋ฉด ๋จ์ด๋ณ๋ก ์ชผ๊ฐค ์ ์๋ค. ์ด๋ ๊ฒ ํ ๋ค์๋ ๋ฐ์ดํฐ๊ฐ ์ถํ ํ์์ ๋ฐ๋ฅธ ์ซ์ํ์ผ๋ก ๋ณํ๋๋ค. ํ๋ฒ ์ถํํ์ผ๋ฉด 0, ๋๋ฒ ์ถํํ์ผ๋ฉด 1 ์ด๋ฐ ๋ฐฉ์์ด๋ค.
๊ทธ๋ฐ ๋ค์ inverse_transform์ ์ฌ์ฉํ๋ฉด ๋ณํ๋๊ธฐ ์ด์ ๋ฐ์ดํฐ๋ฅผ ํ์ธํ ์ ์๋ค.
spam_1 = spam.drop(columns=['Unnamed: 2', 'Unnamed: 3', 'Unnamed: 4'])
X = spam_1['v2']
y = spam_1['v1']
from sklearn.model_selection import train_test_split
train_x, test_x, train_y, test_y = train_test_split(X, y, train_size=0.7, random_state=1, stratify=y)
# ์ปฌ๋ผ์ ๋ฐ์ดํฐ ๋จ์ด ๊ฐ์๋งํผ ์๋ผ ๋ฒกํฐ ์์ฑ
from sklearn.feature_extraction.text import CountVectorizer
cv = CountVectorizer(binary=True)
train_xcv = cv.fit_transform(train_y)
encoded_input = train_xcv.toarray()
inv = cv.inverse_transform(encoded_input)
print(inv[0])
#์ถ๋ ฅ-> ['couple' 'down' 'give' 'me' 'minutes' 'my' 'sure' 'to' 'track' 'wallet' 'yeah']
๋ฒ ๋ฅด๋์ด ๋์ด๋ธ ๋ฒ ์ด์ฆ ํจ์๋ฅผ ์ ์ธํ๊ณ ํ์ต/์์ธกํ๊ธฐ
from sklearn.naive_bayes import BernoulliNB
bnb = BernoulliNB()
bnb.fit(train_xcv, train_y)
test_xcv = cv.transform(test_x)
pred = bnb.predict(test_xcv)
print("acc score : {0}%".format(round(bnb.score(test_xcv, test_y), 2)*100))
from sklearn.metrics import classification_report
cr = classification_report(test_y, pred)
print(cr)

์ฑ๋ฅ ํ๊ฐ ์งํ๋ ์ฐ์ํ ๊ฒ ๊ฐ๋ค.
2-multinomial
import pandas as pd
imdb = pd.read_csv('/Users/eve/Downloads/jupyter notebook/files/์์ฐ์ด/IMDB Dataset.csv')
print(imdb.head())

๋ ๋ฆฝ๋ณ์๊ฐ ๊ฐ์ํ, ์ข ์๋ณ์๊ฐ ๊ธ์ /๋ถ์ ์ด๋ค.
X = imdb['review']
y = imdb['sentiment']
imdb['sentiment'] = np.where(imdb['sentiment']=='positive', 1, 0)
from sklearn.model_selection import train_test_split
train_x, test_x, train_y, test_y = train_test_split(X, y, train_size=0.5, random_state=1,
stratify=y)
from sklearn.feature_extraction.text import CountVectorizer
cv = CountVectorizer(binary=False)
train_xcv = cv.fit_transform(train_x)
๋ฑ๋ง ํ๋ํ๋๋ฅผ ๋ด์ผ ํ๋ ์์ฐ์ด ์ฒ๋ฆฌ๋ ํญ์ ๋จ์ด๋ค์ ๋ค ๋ฒกํฐ๋ก ๋๋์ด์ค์ผ ํ๋ค. ๊ทธ๋ฆฌ๊ณ ์์ธก๊ฐ๊ณผ ์ค์ ๊ฐ ๋น๊ตํด๋ณด๊ณ ์ฑ๋ฅํ๊ฐํด๋ณด๊ธฐ.
from sklearn.naive_bayes import MultinomialNB
mnb = MultinomialNB()
mnb.fit(train_xcv, train_y)
test_xcv = cv.transform(test_x)
pred = mnb.predict(test_xcv)
from sklearn.metrics import classification_report, confusion_matrix
cm = confusion_matrix(test_y, pred)
cr = classification_report(test_y, pred)
print(cr)
print(cm)

(*๊ทผ๋ฐ ์ด ๋ฐ์ดํฐ๊ฐ ๋คํญ๋ถํฌ๋ก ๋ถ์ํ๋๊ฒ ๋ง๋์ง ๋ชจ๋ฅด๊ฒ ๋ค. ์คํธ์ธ์ง ์๋์ง๋ ์๋ฅผ ๋ค์ด ๋ณต๊ถ์ด๋ผ๋ ๋จ์ด๊ฐ ์๋์ง ์๋์ง๋ก ํ๋จํ๋ค ์น๋ฉด ๋ชจ๋ธ์ ๋ฐ์ดํฐ๋ฅผ ๋ฃ๊ธฐ๋ง ํ๋ฉด ๋ณต๊ถ์ด๋ผ๋ ๋จ์ด๊ฐ ์งํ๋ผ๊ณ ํํธ๋ฅผ ์ ์ค๋ ๊ทธ๋ ๊ฒ ๋ถ์์ ํ ์ ์๋ ๊ฑด๊ฐ? ๋คํญ๋ถํฌ๋ ๋จ์ด์ ํ์๋ฅผ ์ธก์ ํด์ ํ๋ค๋ฉด... ์คํธ ์ฒ๋ฆฌํ๋๊ฑด ๋ชจ๋ฅด๊ฒ ๊ณ ๋ฐ๋๋ก ๋ฒ ๋ฅด๋์ด๋ก ๊ฐ์ํ ์์ธกํ ์ ์์ง ์๋? ๊ธ์ ์ธ ํ์๋ ๊ฒน์น๋ ๋จ์ด๋ค์ด ๋ง์ ํ ๋๊น. ๋คํญ๋ถํฌ์ ๋ํด์ ์กฐ๊ธ ๋ ๊ณต๋ถํ ํ์์ฑ์ด ์๊ฒ ๋ค. ๋จ์ด ๋ฐ๋ณต ํ์ ์ธก์ ํด์ ์์ธกํ๋ค๋๊ฑฐ ๋ง๊ณค ์๋ฆฌ๋ฅผ ๋ชจ๋ฅด๋๊น ์ดํด๊ฐ ์ ๋๋ ๊ฒ ๊ฐ๋ค)
3- Gussian
์ฐ์ฃผ ๊ด์ธก๊ฒฐ๊ณผ์ ๋ฐ๋ผ ์ํ์ธ์ง ๋ณ์ธ์ง ๋ถ๋ฅํ ๋ฐ์ดํฐ๋ฅผ ์ฌ์ฉํ๋ค. ํ์ตํ ๋ ๋ณ์ด๋ ์ํ๊ฐ ์ด๋ค ํน์ฑ์ ๊ฐ์ง๊ณ ์๋์ง ํ์ตํ๋ฉด ์์ธก ์ ์ด๋ฐ ํน์ฑ์ผ ๋ ๋ณ์ธ์ง ์ํ์ธ์ง ์ ์ ์๋ ๊ฒ.
import pandas as pd
import matplotlib.pyplot as plt
import seaborn as sns
sky = pd.read_csv('/Users/eve/Downloads/jupyter notebook/files/classification/Skyserver.csv')
sky.head()

์ข ์๋ณ์๊ฐ class์ด๊ณ ๋ฒ์ฃผ๋ STAR, GALAXY, Q50์ด๋ค. ๋๋จธ์ง๋ ๋ ๋ฆฝ๋ณ์์ด๊ณ ๋ชจ๋ ์ฐ์ํ์ด๋ฏ๋ก ๊ฐ์ฐ์์ ๋์ด๋ธ ๋ฒ ์ด์ฆ๋ฅผ ์ ์ฉํด์ผ ํ๋ค.
from sklearn.model_selection import train_test_split
X = sky.drop(columns=['class'])
y = sky['class']
train_x, test_x, train_y, test_y = train_test_split(X, y, train_size=0.7,
random_state=1)
from sklearn.naive_bayes import GaussianNB
gnb = GaussianNB()
pred = gnb.fit(train_x, train_y).predict(test_x)
print('acc score :\t{0}%'.format(round(gnb.score(test_x, test_y), 2)))
์ ํ๋๋ 0.8์ด๋ค.
'Daily' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
| 23.02.14 ํต๊ณ ๋ถ์ ํ๋ก์ธ์ค์ t-test (0) | 2023.02.15 |
|---|---|
| 23.02.05 ์์๋ธ (0) | 2023.02.05 |
| 23.02.04 ์์ฌ๊ฒฐ์ ๋๋ฌด (0) | 2023.02.04 |
| 23.01.31 KNN ์ต๊ทผ์ ์ด์ (0) | 2023.01.31 |
| 23.01.28 SVM ์ํฌํธ ๋ฒกํฐ ๋จธ์ (0) | 2023.01.29 |