04_KNeiahborsClassifier 타이타닉 생존자 예측.ipynb
# 한글폰트 패치
import matplotlib as mpl
import matplotlib.pyplot as plt
%config InlineBackend.figure_format = 'retina'
!apt -qq -y install fonts-nanum
import matplotlib.font_manager as fm
fontpath = '/usr/share/fonts/truetype/nanum/NanumBarunGothic.ttf'
font = fm.FontProperties(fname=fontpath, size=9)
plt.rc('font', family='NanumBarunGothic')
mpl.font_manager._rebuild()
import pandas as pd
import seaborn as sns # 차트 그리는 라이브러리, 데이터셋도 제공
df = sns.load_dataset('titanic')
df
# 891 rows x 15 columns
df.info()
# 1) NaN 값이 많은 deck(객실 데크 위치), embark_town(승선 도시) 열 삭제
rdf = df.drop(['deck', 'embark_town'], axis=1) #콜럼 삭제
rdf.info()
# age 컬럼에 나이가 없는(NaN) 모든 행(rows)을 삭제 -> 891 -> 714건으로 전처리(177건 삭제)
rdf = rdf.dropna(subset=['age'], how='any', axis=0) #row가 714건으로 맞춰진 것을 확인할 수 있다.
rdf.info()
rdf
# 생존여부(survived), 객실등급(pclass), 성별(sex), 나이(age), 같이 탑승한 형제/자매수(sibsp), 부모자녀수(parch)
rdf = rdf[['survived', 'pclass', 'sex', 'age', 'sibsp', 'parch']]
rdf.head()
# 성별 컬럼의 값(범주형)을 모델이 인식 할 수 있도록 숫자형으로 변경
# 남성 -> 0, 여성 -> 1
# 원핫인코딩 -> male[1,0], female[0,1]
onehot_sex = pd.get_dummies(rdf['sex']) # 컬럼 형태로 제공
onehot_sex
onehot_sex = pd.get_dummies(rdf['sex'])
ndf = pd.concat([rdf, onehot_sex], axis = 1)
ndf.head()
# 필요없는 기존의 컬럼 삭제
ndf.drop(['sex'], axis=1, inplace =True)
ndf.head()
#1) ndf -> 정답지(target, label, 종속변수 ) y, 문제집(data, feature, 독립변수) X 데이터 분리
X = ndf[['pclass', 'age', 'sibsp', 'parch', 'female', 'male']]
y= ndf['survived']
X.shape
y.shape
#2) train, test 셋으로 분리(70:30)
from sklearn.model_selection import train_test_split
X_train, X_test, y_train, y_test = train_test_split(X,y, test_size=0.3, random_state=7)
X_train.shape
from sklearn.neighbors import KNeighborsClassifier
# 이웃의 수에 따른 정확도를 저장할 리스트 변수
train_scores = []
test_scores = []
n_neighbors_settings = range(1,21)
#1~10까지 n_neighbors의 수를 증가 시켜서 학습 후 정확도 저장
for n_neighbor in n_neighbors_settings:
#모델 생성 및 학습
clf = KNeighborsClassifier(n_neighbors=n_neighbor)
clf.fit(X_train, y_train)
# 훈련 세트 정확도 저장
train_scores.append(clf.score(X_train, y_train))
# 테스트 세트 정확도 저장
test_scores.append(clf.score(X_test, y_test))
# 예측 정확도 비교 그래프 그리기
plt.figure(dpi=100)
plt.plot(n_neighbors_settings, train_scores, label='훈련 정확도')
plt.plot(n_neighbors_settings, test_scores, label='테스트 정확도')
plt.ylabel('정확도')
plt.xlabel('이웃의 수')
plt.legend()
plt.show()
# 그래서 최적점은 3이라는 것을 확인할수 있다.
# 모델 설정 후 학습하기
clf = KNeighborsClassifier(n_neighbors=7)
clf.fit(X_train, y_train)
# 예측하기
y_pred = clf.predict(X_test)
y_pred
from sklearn import metrics
# 모델의 성능평가 지표 계산 accuracy, precision, recall, f1
print('테스트 성능평가 n_neighbors=7')
print('accuracy:', metrics.accuracy_score(y_test, y_pred))
print('precision:', metrics.precision_score(y_test, y_pred))
print('recall:', metrics.recall_score(y_test, y_pred))
print('f1:', metrics.f1_score(y_test, y_pred))