-
[ 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를 찾는 과정이 많이 필요하다.
'About_Datascience > ML' 카테고리의 다른 글
[ Iris data를 이용한 SVM kernel 실습 ] (0) 2023.03.17 [ About _ SVM 이론 ] (0) 2023.03.17 [ 보험료 예측 모델 생성(2) _ 다양한 Regression model ] (1) 2023.03.13 [ 보험료 예측 모델 생성(1) _ 간단한 EDA 및 전처리 ] (0) 2023.03.13