ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • 머신러닝 심화 과제 (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()

Designed by Tistory.