ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • [ SVM을 이용한 얼굴 사진 분류모델 ]
    About_Datascience/ML 2023. 3. 17. 21:38

    이번엔 SVM을 이용한 얼굴 사진 분류모델을 생성 후

    Hyper Parameter Tuning 전과 후를 비교해서 Evaluation 해보고자 한다. 

     


    1. 필요한 Library Import 

    import pandas as pd
    import numpy as np
    import matplotlib.pyplot as plt
    
    from sklearn.svm import SVC
    
    from sklearn.model_selection import train_test_split
    from sklearn.preprocessing import StandardScaler
    from sklearn.model_selection import GridSearchCV
    
    
    from sklearn.metrics import accuracy_score
    
    np.random.seed(2021)

     

     

     

    2. Load data

    from sklearn.datasets import fetch_lfw_people
    
    faces = fetch_lfw_people(min_faces_per_person=70, resize=0.4)
    
    data, target = faces['data'] , faces['target']

     

     

     

    3.  데이터 확인

     

    3-1 .이미지의 height , width 확인

    # 이미지의 height 와 width 확인 
    n_samples , h , w = faces.images.shape

     

     

     

    3-2. 얼굴 주인들의 이름 확인 (target)

    # 얼굴 주인들의 이름 
    target_names = faces.target_names
    n_classes = target_names.shape[0]

     

    얼굴 주인들의 이름 확인

     

     

     

    3-3.  이미지 실제로 확인

    samples = data[:10].reshape(10,h,w)
    
    fig,axes = plt.subplots(nrows=2, ncols=5, figsize=(20,10))
    
    for idx , sample in enumerate(samples):
        ax = axes[idx//5 , idx%5]
        ax.imshow(sample, cmap = 'gray')
        ax.set_title(target_names[target[idx]])

     

     

     

     

     

    4. Data Split 

    train_data , test_data , train_target , test_target = train_test_split(
        data , target , train_size=0.7, random_state=2021)

     

     

     

     

    5. Data Scaling (SVM 역시 거리를 기반으로 모델을 학습하기 때문에 데이터의 범위를 줄여줘야 한다. )

     

    # StandardScaler 사용
    scaler = StandardScaler()
    
    scaler.fit(train_data)
    
    scaled_train_data = scaler.transform(train_data)
    scaled_test_data = scaler.transform(test_data)

     


    SVM 모델 생성 

    <Hyper Parameter Tuning 전과 후 비교>

     

     

    1. Baseline (Tuning X)

    svm = SVC()
    svm.fit(scaled_train_data, train_target)
    # 예측
    train_pred = svm.predict(scaled_train_data)
    test_pred = svm.predict(scaled_test_data)
    # accuracy score 를 통해 Evaluation
    train_acc = accuracy_score(train_target, train_pred)
    test_acc = accuracy_score(test_target, test_pred)

     

    결과

    결과를 보면 Train data 에 대해 Overfitting 이 일어난 것 같은데 ? 라는 판단을 할 수가 있다. 

     

     

     

    2. Hyper Parameter Tuning (Grid Search CV 사용)

     

    2-1. 탐색 범위 설정

    params = [
        {"kernel" : ["linear"], "C" : [10,30,100,300,1000,3000,10000,30000]},
        {
            "kernel" : ["rbf"] ,"C" : [1,3,10,30,100,300,1000],
            "gamma" : [0.01, 0.03, 0.1, 1.0, 3.0]
        },
    ]

     

     

    2-2. 탐색

    grid_cv = GridSearchCV(svm, params, cv =3, n_jobs=-1)
    grid_cv.fit(scaled_train_data, train_target)

     

    결과

     

    결과를 보면 Penalty 가 10이고 , Kernel 이 linear일 때 성능이 0.8191로 가장 좋았다. 

     

     

    Tuning 된 Parameter로 예측

    train_pred = grid_cv.best_estimator_.predict(scaled_train_data)
    test_pred = grid_cv.best_estimator_.predict(scaled_test_data)

     

     

    Evaluation 

    best_train_acc = accuracy_score(train_target, train_pred)
    best_test_acc = accuracy_score(test_target, test_pred)

     

    결과를 보면 Train data 에 대해서는 100 퍼센트 예측을 했고

    Test data에 대해서도 0.8605로 score가 높아진 것을 확인할 수 있다. 

     

     


    마무리

     

     

     

    이처럼 SVM 모델은 어떤 argument를 주느냐에 따라 성능이 크게 바뀌기 때문에

    Baseline 모델 보다는 Tuning을 하여 최적의 parameter를 찾는 과정이 많이 필요하다.

Designed by Tistory.