-
머신러닝 심화 과제 (3개)카테고리 없음 2022. 1. 24. 18:41
차원축소로 머신러닝 성능 향상시키기
앙상블 분류기 (Ensemble Classifier)
SVM을 이용한 Spam Filter 만들기
1. 문제
from sklearn.datasets import load_digits
from sklearn.decomposition import PCA
import numpy as np
import matplotlib.pyplot as plt
from elice_utils import EliceUtils
elice_utils = EliceUtils()
"""
1. digits 데이터를 불러오는
load_data() 함수를 구현합니다.
"""
def load_data():
X, y = load_digits(return_X_y = True)
return X, y
"""
2. PCA 알고리즘을 활용하여 차원을 축소하고,
다시 이미지로 복원한 결과를 확인하기 위한
train_PCA_and_restore_image() 함수를 구현합니다.
Step01. dim_reduction_number개의 차원으로 축소하는
PCA 모델을 생성합니다.
Step02. 생성한 PCA 모델을 이용하여 차원 축소를 진행합니다.
Step03. 축소된 데이터를 다시 이미지 데이터로 복원합니다.
Step04. 축소된 이미지의 log-likelihood를 통해 점수를 확인합니다.
"""
def train_PCA_and_restore_image(dim_reduction_number, images):
pca = PCA(n_components=dim_reduction_number)
pca_data = pca.fit_transform(images)
approxOriginal = pca.inverse_transform(pca_data)
score = pca.score(approxOriginal, )
return approxOriginal, score
"""
digit 이미지를 시각화합니다.
"""
def visualize(X, x_label, title):
plt.figure(figsize=(5,4));
n_data = 100
plt.imshow(X[n_data].reshape(8, 8),
cmap = plt.cm.gray, interpolation='nearest')
plt.xlabel(x_label, fontsize = 12)
plt.title(title, fontsize = 14)
plt.savefig('PCA.png')
elice_utils.send_image('PCA.png')
"""
3. 구현한 함수를 활용하여 차원 축소를 진행하고
시각화해주는 main() 함수를 완성합니다.
"""
def main():
X,y = load_data()
# 차원 축소와 이미지 복원 진행하기
reduced_image_32, score_32 = train_PCA_and_restore_image(32,X)
reduced_image_16, score_16 = train_PCA_and_restore_image(16,X)
reduced_image_8, score_8 = train_PCA_and_restore_image(8,X)
reduced_image_4, score_4 = train_PCA_and_restore_image(4,X)
# 시각화 함수 호출하기
visualize(X, '64', 'Original_data')
visualize(reduced_image_32, '32', '32 dim')
visualize(reduced_image_16, '16', '16 dim')
visualize(reduced_image_32, '8', '8 dim')
visualize(reduced_image_32, '4', '4 dim')
if __name__ == '__main__':
main()
2. 문제
import pandas as pd
import numpy as np
import warnings
warnings.filterwarnings("ignore")
from sklearn.ensemble import RandomForestClassifier, VotingClassifier
from sklearn.naive_bayes import GaussianNB
from sklearn.tree import DecisionTreeClassifier
from sklearn.svm import SVC
from sklearn.model_selection import GridSearchCV, cross_val_score, StratifiedKFold
from preprocessor import preprocessor
# Gaussian Naive Bayes 모델을 리턴하는 함수를 만들어 봅니다.
def get_nvc(X_train, Y_train):
# TODO: Gaussian Naive Bayes 모델을 정의합니다.
nvc = None
# TODO: Gaussian Naive Bayes 모델을 학습합니다.
pass
# TODO: 모델의 학습 데이터 성능(score)을 계산합니다.
score = None
return nvc, score
# SVM classifier에 대해 grid search를 실행해 최적의 모델을 리턴하는 함수를 만들어 봅니다.
def get_svc(X_train, Y_train, kfold):
svc = SVC(probability=True)
# TODO: Grid Search를 위한 파라미터를 정해봅니다. (파라미터를 바꾸어 가며 성능을 향상시킵니다. 파라미터는 사이킷런 웹문서를 참고)
svc_param_grid = {'kernel': ['rbf'],
'gamma': [0.01, 0.1, 1],
'C': [1, 10, 50, 100]}
# kfold set에 대해 Grid Search를 정의합니다.(cv인자 값을 참고)
gs_svc = GridSearchCV(svc, param_grid=svc_param_grid, cv=kfold, scoring="accuracy", n_jobs=4)
# Grid Search를 진행합니다.
gs_svc.fit(X_train, Y_train)
# 가장 좋은 결과를 보여준 모델을 가져옵니다.(Grid Search에 관한 사이킷런 웹 문서를 참고)
svc_best = gs_svc.best_estimator_
# 가장 좋은 결과의 성능을 기록합니다.(Grid Search에 관한 사이킷런 웹 문서를 참고)
score = gs_svc.best_score_
return svc_best, score
# Random Forest Classifier에 대해 Grid Search를 실행해 최적의 모델을 리턴합니다.
def get_rfc(X_train, Y_train, kfold):
rfc = RandomForestClassifier()
# TODO: Grid Search를 위한 파라미터를 정해봅니다.(Grid Search 객체의 인자 값들을 파라미터로 설정)
rf_param_grid = {"max_depth": [None],
"max_features": [3, 10],
"min_samples_split": [3, 10],
"min_samples_leaf": [1, 3, 10],
"bootstrap": [False],
"n_estimators": [100, 300],
"criterion": ["gini"]}
# kfold set에 대해 Grid Search를 정의합니다.(scoring='accuracy', n_jops=4)
gs_rfc = GridSearchCV(rfc, param_grid=rf_param_grid, cv=kfold, scoring="accuracy", n_jobs=4)
# Grid Search를 진행합니다.
gs_rfc.fit(X_train, Y_train)
# 가장 좋은 결과를 보여준 모델을 가져옵니다.
rfc_best = gs_rfc.best_estimator_
# 가장 좋은 결과의 성능을 기록합니다.
score = gs_rfc.best_score_
return rfc_best, score
# nvc, svc, rfc 세 가지의 바탕으로 Ensemble Classifier 모델을 리턴하는 함수를 정의합니다.
def ensemble_voting(X_train, Y_train, nvc, svc, rfc):
# TODO: nvc, svc, rfc를 사용하는 Voting Classifier를 정의합니다.
votingC = VotingClassifier(estimators=[('nvc', nvc), ('svc', svc), ('rfc', rfc)],
voting='soft', n_jobs=4)
# TODO: Voting Classifier를 학습합니다.
votingC = None
# TODO: Voting Classifier의 성능(score)을 기록합니다.
score = None
return votingC, score
def main():
# 데이터를 불러옵니다.
train = pd.read_csv("./data/train.csv")
subfile = pd.read_csv("./data/sub.csv")
# 데이터를 전처리합니다.
X_train, Y_train = preprocessor(train, subfile)
# Stratified k-fold validation을 합니다.(상단에 import 된 라이브러리를 참고.)
kfold = StratifiedKFold(n_splits=5)
# Gaussian Naive Bayes를 학습합니다.
nvc, score = get_nvc(X_train, Y_train)
print("가우시안 나이브 베이즈의 k-fold 정확도는 %0.3f %%입니다.\n---------------------" % (score * 100))
svc, score = get_svc(X_train, Y_train, kfold)
print("최적의 SVM Classifier의 k-fold 정확도는 %0.3f %%입니다.\n---------------------" % (score * 100))
rfc, score = get_rfc(X_train, Y_train, kfold)
print("최적의 Randomforest Classifier의 k-fold 정확도는 %0.3f %%입니다.\n---------------------" % (score * 100))
votingC, score = ensemble_voting(X_train, Y_train, nvc, svc, rfc)
print("학습된 Ensemble Classifier의 train set정확도는 %0.3f %%입니다." % (score * 100))
if __name__ == "__main__":
import warnings
with warnings.catch_warnings():
warnings.simplefilter("ignore")
main()
#실행 시간이 길어질 수도 있으니, 이 점 참고해주세요.
3. 문제
from elice_utils import EliceUtils
import numpy as np
from sklearn import svm
from scipy.io import loadmat
import warnings
warnings.filterwarnings('ignore', 'Solver terminated early.*')
elice_utils = EliceUtils()
def svm_filter(X, y):
'''
데이터 X와 label y를 받아서 학습된 SVM classifier를 리턴합니다.
'''
# 지시사항 1번을 참고하여 코드를 작성하세요.
svc = svm.SVC(kernel = 'linear', max_iter = 1000, gamma = 10)
# 지시사항 2번을 참고하여 코드를 작성하세요.
svc = svc.fit(X, y)
# 지시사항 3번을 참고하여 코드를 작성하세요.
score = svc.score(X, y)
return score, svc
def main():
# data를 불러옵니다.
spam_train = loadmat('data/spamTrain.mat')
X = spam_train['X']
y = spam_train['y'].ravel()
# X 데이터와 y 데이터의 shape을 출력합니다.
print('X shape: ', X.shape)
print('Y shape: ', y.shape)
# 상위 5개의 X 데이터와 y 데이터를 출력합니다.
print('\nX: \n', X[:5])
print('\nY: \n', y[:5])
score, svc = svm_filter(X, y)
# 정의된 SVM 모델을 출력합니다.
print('\nSVM Model: ', svc)
if score is not None:
print('\nTraining Accuracy = {}%'.format(round(score * 100, 3)))
else:
print('\n학습 성능이 계산되지 않았습니다.')
if __name__ == "__main__":
main()