1) KNN
- 기존 데이터 중에서 가장 속성이 비슷한 k개의 이웃을 찾음
- 가까운 이웃들이 가지고 있는 목표 값과 같은 값으로 분류하여 예측
1-1. 데이터 전처리
import pandas as pd
import seaborn as sns
df = sns.load_dataset('titanic')
pd.set_option('display.max_columns', 15)
rdf = df.drop(['deck', 'embark_town'], axis = 1)
rdf = rdf.dropna(subset = ['age'], how = 'any', axis = 0)
# age 열에 나이 데이터가 없는 모든 행 삭제
most_freq = rdf['embarked'].value_counts(dropna=True).idxmax()
# embarked 열의 NaN 값을 승선도시 중에서 가장 많이 출현한 값 도출
rdf['embarked'].fillna(most_freq, inplace = True)
# 가장 많이 출현한 값인 s로 NaN값을 대체
ndf = rdf[['survived', 'pclass', 'sex', 'age', 'sibsp', 'parch', 'embarked']]
onehot_sex = pd.get_dummies(ndf['sex'])
# sex 열 데이터인 female와 male을 더미 변수 열로 만들기
ndf = pd.concat([ndf, onehot_sex], axis = 1)
onehot_embarked = pd.get_dummies(ndf['embarked'], prefix = 'town')
# 열 이름에 접두어 'town'을 추가
# embarked 열 데이터를 더미 변수 열로 만들기
ndf = pd.concat([ndf, onehot_embarked], axis = 1)
ndf.drop(['sex', 'embarked'], axis = 1, inplace = True)
# 원래 존재했던 sex와 embarked 열을 제거
1-2. 훈련/검증 데이터 분할
X = ndf[['pclass', 'age', 'sibsp', 'parch', 'female', 'male']]
y = ndf['survived']
from sklearn import preprocessing
X = preprocessing.StandardScaler().fit(X).transform(X)
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 = 10)
1-3. 모델 학습 및 예측, 성능 측정
from sklearn.neighbors import KNeighborsClassifier
knn = KNeighborsClassifier(n_neighbors=5)
knn.fit(X_train, y_train)
# 모델 학습
y_hat = knn.predict(X_test)
# 모델 예측
from sklearn import metrics
knn_report = metrics.classification_report(y_test, y_hat)
# 모델 성능 평가 지표 확인 가능
print(knn_report)
2) SVM
- 벡터 공간에 위치한 훈련 데이터의 좌표와 각 데이터가 어떤 분류값을 가져야 하는지 정답을 입력 받아서 학습함
2-1. 데이터 전처리
import pandas as pd
import seaborn as sns
df = sns.load_dataset('titanic')
pd.set_option('display.max_columns', 15)
rdf = df.drop(['deck', 'embark_town'], axis = 1)
rdf = rdf.dropna(subset = ['age'], how = 'any', axis = 0)
# age 열에 나이 데이터가 없는 모든 행 삭제
most_freq = rdf['embarked'].value_counts(dropna=True).idxmax()
# embarked 열의 NaN 값을 승선도시 중에서 가장 많이 출현한 값 도출
rdf['embarked'].fillna(most_freq, inplace = True)
# 가장 많이 출현한 값인 s로 NaN값을 대체
ndf = rdf[['survived', 'pclass', 'sex', 'age', 'sibsp', 'parch', 'embarked']]
onehot_sex = pd.get_dummies(ndf['sex'])
# sex 열 데이터인 female와 male을 더미 변수 열로 만들기
ndf = pd.concat([ndf, onehot_sex], axis = 1)
onehot_embarked = pd.get_dummies(ndf['embarked'], prefix = 'town')
# 열 이름에 접두어 'town'을 추가
# embarked 열 데이터를 더미 변수 열로 만들기
ndf = pd.concat([ndf, onehot_embarked], axis = 1)
ndf.drop(['sex', 'embarked'], axis = 1, inplace = True)
# 원래 존재했던 sex와 embarked 열을 제거
2-2. 훈련/검증 데이터 분할
X = ndf[['pclass', 'age', 'sibsp', 'parch', 'female', 'male', 'town_C', 'town_Q', 'town_S']]
y = ndf['survived']
from sklearn import preprocessing
X = preprocessing.StandardScaler().fit(X).transform(X)
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 = 10)
2-3. 모델 학습 및 예측, 성능 측정
from sklearn import svm
svm_model = svm.SVC(kernel = 'rbf')
svm_model.fit(X_train, y_train)
# 모델 학습
y_hat = svm_model.predict(X_test)
# 모델 예측
from sklearn import metrics
svm_matrix = metrics.confusion_matrix(y_test, y_hat)
# 모형 성능 평가 지표 확인 가능 (confusion matrix)
print(svm_matrix)
print('\n')
svm_report = metrics.classification_report(y_test, y_hat)
# 모델 성능 평가 지표 확인 가능
print(svm_report)
3) Decision Tree
- 트리 구조 사용
- 각 분기점(node)에는 분석 대상의 속성들이 위치
- 각 분기점마다 목표 값을 가장 잘 분류할 수 있는 속성을 찾아서 배치
- 해당 속성이 갖는 값을 이용하여 새로운 가지를 만드는 구조
- Entropy가 일정 수준 이하로 낮아질 때까지 앞의 과정 반복
3-1. 데이터 전처리
import pandas as pd
import seaborn as sns
df = sns.load_dataset('titanic')
pd.set_option('display.max_columns', 15)
rdf = df.drop(['deck', 'embark_town'], axis = 1)
rdf = rdf.dropna(subset = ['age'], how = 'any', axis = 0)
# age 열에 나이 데이터가 없는 모든 행 삭제
most_freq = rdf['embarked'].value_counts(dropna=True).idxmax()
# embarked 열의 NaN 값을 승선도시 중에서 가장 많이 출현한 값 도출
rdf['embarked'].fillna(most_freq, inplace = True)
# 가장 많이 출현한 값인 s로 NaN값을 대체
ndf = rdf[['survived', 'pclass', 'sex', 'age', 'sibsp', 'parch', 'embarked']]
onehot_sex = pd.get_dummies(ndf['sex'])
# sex 열 데이터인 female와 male을 더미 변수 열로 만들기
ndf = pd.concat([ndf, onehot_sex], axis = 1)
onehot_embarked = pd.get_dummies(ndf['embarked'], prefix = 'town')
# 열 이름에 접두어 'town'을 추가
# embarked 열 데이터를 더미 변수 열로 만들기
ndf = pd.concat([ndf, onehot_embarked], axis = 1)
ndf.drop(['sex', 'embarked'], axis = 1, inplace = True)
# 원래 존재했던 sex와 embarked 열을 제거
3-2. 훈련/검증 데이터 분할
X = ndf[['pclass', 'age', 'sibsp', 'parch', 'female', 'male']]
y = ndf['survived']
from sklearn import preprocessing
X = preprocessing.StandardScaler().fit(X).transform(X)
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 = 10)
3-3. 모델 학습 및 예측, 성능 측정
from sklearn import tree
tree_model = tree.DecisionTreeClassifier(criterion='entropy', max_depth = 5)
tree_model.fit(X_train, y_train)
# 모델 학습
y_hat = tree_model.predict(X_test)
# 모델 예측
from sklearn import metrics
tree_report = metrics.classification_report(y_test, y_hat)
# 모델 성능 평가 지표 확인 가능
print(tree_report)