문제258. 영화 장르를 분류하는 나이브 베이즈 모델을 파이썬으로 생성하시오.
문제 257번에서 우리가 알아낸 랜덤 스테이트 : 2, alpha값은 0.001
(선생님이 이정호님의 문제257번 답 코드 다시 정리)
import pandas as pd
from sklearn.model_selection import train_test_split # 훈련 데이터와 테스트 데이터 분류 모듈
from sklearn.naive_bayes import BernoulliNB # 나이브 베이즈 모듈 중 하나
from sklearn.metrics import confusion_matrix # 이원 교차표 생성 모듈
from sklearn.metrics import accuracy_score # 정확도 확인 모듈
import numpy as np
## 1. 데이터 로드
movie = pd.read_csv("d:\\data\\movie2.csv", encoding = 'EUCKR')
# movie.head()
## 2. 결측치 확인
# movie.isnull().sum()
## 3. 데이터 유형 변경
x = movie.iloc[:, :5]
y = movie.iloc[:, 5]
## 4. 숫자로 변경
movie2 = pd.get_dummies(x) # 파이썬은 R과 다르게 숫자로 변경해주는 작업 필요
정답컬럼인 y는 numpy로 변환하지 않고 Series로 그대로 두겠음.
# 5. 훈련 데이터와 테스트 데이터 분리
x_train, x_test, y_train, y_test = train_test_split(movie2, y, test_size = 0.2, random_state = 2)
# y가 Series인데도 오류 안남
# 6.나이브 베이즈 모델 생성
model = BernoulliNB(alpha = 0.001) # alpha(laplace) 값 입력(default = 1)
#7. 모델 훈련
model.fit(x_train, y_train)
#8. 모델 예측
result = model.predict(x_test)
result
#9. 모델 성능 평가
# 방법1.
# accuracy = sum(result == y_test) / len(y_test) * 100
# 방법2.
accuracy = accuracy_score(y_test, result) * 100 # accuracy_score(실제정답, 예측정답)
accuracy
문제259. 나이 20대, 성별 여자, 직업 IT, 결혼 미혼, 이성친구가 없는 사람이 선택할 확률이 높은 영화장르는 무엇인가
## 1.데이터 로드
import pandas as pd
movie = pd.read_csv("c:\\data\\movie2.csv", encoding = 'EUCKR')
## 2.테스트 데이터 추가
test_data = movie.append({'나이':'20대','성별':'여','직업':'IT','결혼여부':'NO','이성친구':'NO'},ignore_index=True)
test_data.iloc[[-1],:]
test_data.iloc[[-1], : ] > test_data의 맨 마지막 행만 가져오기
## 3. test_data에서 정답만 빼고 x라는 변수에 넣으시오
x = test_data.iloc[:,:5]
x
## 4. 데이터 프레임의 데이터를 전부 숫자로 변경해서 x2에 담으시오
x2 = pd.get_dummies(x)
x2
## 5. x2에서 마지막에 추가한 39번째 행만 출력하시오
x2.iloc[[-1],:]
## 6. 나이브 베이즈 모델에 위의 데이터를 넣고 어떤 영화장르가 출력되는지 예측하시오
result = model.predict(x2.iloc[[-1],:])
result
위 결과를 확률로 출력하려며 어떻게 해야할까?
나이브 베이즈 확률로 분류했으니가 확률이 어떻게 되는지 확인하고 싶은 것
문제261. 문제260번의 결과를 확률로 출력하시오.
result_prob = model.predict_proba(x2.iloc[[-1],:])
result_prob
## 확률 출력
result_prob = model.predict_proba(x2.iloc[[-1],:])
genre = y_train.unique()
genre.sort()
for i,k in zip(genre,result_prob.tolist()[0]): #numpy array를 list형식으로
print(i,'%f' %k)
%f : 실수형 포맷팅
%06f = 소수점 6자리를 나타내라
a = 123.123
print('%d'%a)
print('%5d'%a)
print('%f'%a)
print('%0.5f'%a)
123
123
123.123000
123.12300
123.12300
문제262. 나이 20대, 성별 여자, 직업 IT, 결혼 미혼, 이성친구가 없는 사람이 선택할 확률이 높은 영화 장르는 무엇인지 확률로 출력하시오.
## 1.데이터 로드
import pandas as pd
movie = pd.read_csv("c:\\data\\movie2.csv", encoding = 'EUCKR')
## 2.테스트 데이터 추가
test_data = movie.append({'나이':'20대','성별':'여','직업':'IT','결혼여부':'NO','이성친구':'NO'},ignore_index=True)
x = test_data.iloc[[-1],:]
## 3. test_data에서 정답만 빼고 x라는 변수에 넣으시오
x = test_data.iloc[:,:5]
## 4. 데이터 프레임의 데이터를 전부 숫자로 변경해서 x2에 담으시오
x2 = pd.get_dummies(x)
## 5. x2에서 마지막에 추가한 39번째 행만 출력하시오
x2.iloc[[-1],:]
## 6. 나이브 베이즈 모델에 위의 데이터를 넣고 어떤 영화장르가 출력되는지 예측하시오
result = model.predict(x2.iloc[[-1],:])
## 확률 출력
result_prob = model.predict_proba(x2.iloc[[-1],:])
genre = y_train.unique()
genre.sort()
for i,k in zip(genre,result_prob[0]):
print(i,'%f' %k)
SF 0.000283
공포 0.000000
로맨틱 0.999716
무협 0.000000
스릴러 0.000000
액션 0.000000
코미디 0.000000
+) model.predict_proba는 model.classes_ 의 순서대로 예측결과가 출력된다.
result_prob = model.predict_proba(x2.iloc[[-1],:])
for i,k in zip(model.classes_ , result_prob[0]):
print(i,'%f' %k)
문제263. 파이썬 데이터 분석 자동화 코드 18번에 문제 258번 답코드를 추가하시오.
nb = '''import pandas as pd
from sklearn.model_selection import train_test_split # 훈련 데이터와 테스트 데이터 분류 모듈
from sklearn.naive_bayes import BernoulliNB # 나이브 베이즈 모듈 중 하나
from sklearn.metrics import confusion_matrix # 이원 교차표 생성 모듈
from sklearn.metrics import accuracy_score # 정확도 확인 모듈
import numpy as np
## 1. 데이터 로드
movie = pd.read_csv("d:\\data\\movie2.csv", encoding = 'EUCKR')
# movie.head()
## 2. 결측치 확인
# movie.isnull().sum()
## 3. 데이터 유형 변경
x = movie.iloc[:, :5]
y = movie.iloc[:, 5]
## 4. 숫자로 변경
movie2 = pd.get_dummies(x) # 파이썬은 R과 다르게 숫자로 변경해주는 작업 필요
# 5. 훈련 데이터와 테스트 데이터 분리
x_train, x_test, y_train, y_test = train_test_split(movie2, y, test_size = 0.2, random_state = 2)
# y가 Series인데도 오류 안남
# 6.나이브 베이즈 모델 생성
model = BernoulliNB(alpha = 0.001) # alpha(laplace) 값 입력(default = 1)
#7. 모델 훈련
model.fit(x_train, y_train)
#8. 모델 예측
result = model.predict(x_test)
result
#9. 모델 성능 평가
# 방법1.
# accuracy = sum(result == y_test) / len(y_test) * 100
# 방법2.
accuracy = accuracy_score(y_test, result) * 100 # accuracy_score(실제정답, 예측정답)
accuracy
#10. 확률 출력
result_prob = model.predict_proba(x2.iloc[[-1],:])
genre = y_train.unique()
genre.sort()
for i,k in zip(genre,result_prob[0]):
print(i,'%f' %k)'''
독버섯의 경우는 정확도가 100% 나오지 않았음. 특히 FN값이 1개가 나옴.
FN값을 0로 만들려면 다른 머신러닝 알고리즘을 사용해야함
ㅇ 지금까지 배운 알고리즘 2개 정리
1. knn : 유클리드 거리공식을 이용해서 데이터를 분류 (데이터가 모두 숫자여야 함)
> 유방암 데이터
2. 나이브 베이즈 : 나이브 베이즈 확률 공식을 이용해서 데이터를 분류(데이터가 모두 문자여야함. 문자여야 빈도표를 구할 수 있고 빈도표를 가지고 우도표를 만들어 나이브 베이즈 확률 공식에 넣을 수 있음)
> 독버섯 데이터
> 영화 장르 데이터
'Study > class note' 카테고리의 다른 글
| 머신러닝 / R로 의사결정트리 모델 구현하기 (0) | 2022.02.08 |
|---|---|
| 머신러닝 / 의사결정트리 알고리즘 (0) | 2022.02.07 |
| 머신러닝 / 파이썬으로 나이브 베이즈 모델 생성하기 (0) | 2022.02.04 |
| 머신러닝 / 나이브베이즈 예제 연습 (0) | 2022.02.04 |
| 머신러닝 / 나이브 베이즈 알고리즘 (0) | 2022.02.03 |