일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | ||||
4 | 5 | 6 | 7 | 8 | 9 | 10 |
11 | 12 | 13 | 14 | 15 | 16 | 17 |
18 | 19 | 20 | 21 | 22 | 23 | 24 |
25 | 26 | 27 | 28 | 29 | 30 | 31 |
- MaxPooling2D
- 모델평가
- explained AI
- bias
- fashion mnist
- CNN
- AI
- 키워드 기반 뉴스 조회
- Convolution Neural Network
- 뉴스웨일
- 머신러닝
- Pooling Layer
- pandas
- learning_rate
- CNN 실습
- OneHotEncoding
- plot_model
- 데이터크롤링
- 딥러닝
- AWS 입문자를 위한 강의
- 데이터
- 데이터분석
- kt에이블스쿨
- CRISP-DM
- 데이터처리
- NewsWhale
- 크롤링
- Neural Network
- CIFAR-10
- 인공지능
- Today
- Total
jjinyeok 성장일지
머신 러닝 #4 - 성능 튜닝 2022/08/22~2022/08/29 본문
1. 선형 모델 : 변수 선택법
Linear Regression, Logistic Regression과 같은 선형 모델은 어떤 feature를 선택했느냐에 따라 성능에 차이가 발생한다. Data Understanding 과정에서 EDA & CDA 과정을 통해 target과 관련이 높은 feature를 알 수 있었다. 선형 모델의 성능을 튜닝할 때 이러한상관도가 높은 feature들만을 사용하며 성능을 높일 수 있다. 이때 단순히 관련도가 아닌 AIC(Akaike Information Criterion)라는 지표를사용해 feature를 선택하는 방법이 존재한다.
2. AIC(Akaike Information Criterion)
모델은 Train Set을 잘 설명하면서도 Overfitting이 되지 않도록 주의해야 한다. 따라서 선형 모델에서의 적합도와, feature가 과도하게 늘어나 모델이 Overfitting되는 것을 방지하도록 설계된 통계량이 AIC이다. AIC는 간단히 말하면 -모델의 적합도 + feature의 개수와 같다. AIC는 다음과 같은 그래프를 그린다.
feature가 많아지면 적합도가 증가되는 양이 feature가 증가된 수보다 올라가 AIC 값이 줄어들다가 어느 순간 적합도가 증가되는 양보다 feature가 많아져 값이 늘어나게 된다. 따라서 AIC 값이 가장 작을 때 선택된 feature들을 사용해 모델을 만들 수 있다.
3. 선형 모델 : 변수 선택법 구현하기
전진선택법을 사용해 선형 모델의 변수를 선택하는 과정은 다음과 같다.
'전진 선택법 함수'
import statsmodels.api as sm
def forward_stepwise_logistic(x_train, y_train):
# 변수목록, 선택된 변수 목록, 단계별 모델과 AIC 저장소 정의
features = list(x_train)
selected = []
step_df = pd.DataFrame({ 'step':[], 'feature':[],'aic':[]})
for s in range(0, len(features)) :
result = { 'step':[], 'feature':[],'aic':[]}
# 변수 목록에서 변수 한개씩 뽑아서 모델에 추가
for f in features :
vars = selected + [f]
x_tr = x_train[vars]
model = sm.Logit(y_train, x_tr).fit()
result['step'].append(s+1)
result['feature'].append(vars)
result['aic'].append(model.aic)
# 모델별 aic 집계
temp = pd.DataFrame(result).sort_values('aic').reset_index(drop = True)
# 만약 이전 aic보다 새로운 aic 가 크다면 멈추기
if step_df['aic'].min() < temp['aic'].min() :
break
step_df = pd.concat([step_df, temp], axis = 0).reset_index(drop = True)
# 선택된 변수 제거
v = temp.loc[0,'feature'][s]
features.remove(v)
selected.append(v)
# 선택된 변수와 step_df 결과 반환
return selected, step_df
4. Hyperparameter Tuning
Hyperparameter는 모델을 최적화하기 위한 파라미터로 Hyperparameter Tuning을 통해 성능을 조절할 수 있다. 대표적으로 KNN 모델의 n_neigbors, Decision Tree 모델의 max_depth, min_samples_leaf, SVM 모델의 C, gamma 등이 있다. Hyperparameter를 Tuning하는 방법은 정답이 없다. 오직 다양한 시도를 통해서 적절한 값을 찾을 수 있다. 이때 다양한 시도 방법으로 Grid Search와 Random Search를 사용한다.
5. Grid Search & Random Search
Grid Search와 Random Search 모두 절차가 동일하다. 값의 범위를 지정하고 값의 조합을 시도해 가장 성능이 좋은 값을 선정한다. 그러나 한가지 차이점은 Grid Search는 값의 조합을 모두 시도하는 반면 Random Search는 시도 횟수를 지정해 값의 범위 내에서 시도 횟수만큼 랜덤하게 선택해서 시도한다는 차이가 있다. Random Search는 sklearn.model_selection의 RandomizedSearchCV 모델을 통해 Grid Search는 sklearn.model_selection의 GridSearchCV 모델을 통해 구현이 가능하다. 두 모델의 구현 과정은 똑같으나 RandomizedSearchCV는 n_iter parameter를 통해 시도횟수를 지정한다는 것만 다르다. Random Search의 구현은 다음과 같다.
'data: 핸드폰 가입 이탈 여부 데이터'
from sklearn.tree import DecisionTreeClassifier
from sklearn.model_selection import RandomizedSearchCV, GridSearchCV
model_dt = DecisionTreeClassifier() # 모델 선언 (DecisionTree)
params = {'max_depth': range(1, 11), 'min_samples_leaf': range(1, 11)} # 모델의 hyperparameter를 찾을 범위 지정
model_dt_rs = RandomizedSearchCV(model_dt, # random search를 수행하는 모델 선언
params,
n_iter=5, # 시도 횟수 (GridSearch는 사용하지 않음)
cv=5, # cv는 아래 정리 예정!
scoring='accuracy' # Classification 모델 default : accuracy
# Regressinon 모델 default : r2
)
model_dt_rs.fit(x_train, y_train) # 기본 모델이 아닌 Random Search 모델로 학습
'성능 튜닝을 통한 최적 모델 확인 '
print(model_dt_rs.best_estimator_) # DecisionTreeClassifier(max_depth=5, min_samples_leaf=8)
print(model_dt_rs.best_params_) # {'min_samples_leaf': 8, 'max_depth': 5}
print(model_dt_rs.best_score_) # 0.6862857142857143
이때 hyperparameter를 세밀하게 조정해서 최적화된 성능을 얻더라도 그 성능은 운영환경에서 보장되지 않는다. 따라서 최적화된 hyperparameter를 찾기 위해 범위를 너무 좁혀가며 혹은 너무 다양하게 시도하는 것보다 적절한 값을 찾는 것이 중요하다. 우리의 목표는 완벽한 모델이 아닌 적절한 모델을 찾는 것이다.
6. 일반화 성능
모델링의 목표는 Training Set과 같은 부분집합을 학습해서 모집단(혹은 모집단의 다른 부분집합)을 적절히 예측하는 것이다. 이때 적절하다는 것은 적절한 성능을 얻는 것이고 우리는 성능향상을 위해 노력을 해야한다.
성능은 Variance(편차)와 Bias(오차)로 나타낼 수 있다. 만일 Variance가 높다면 모델의 성능이 들쑥날쑥하여 신뢰성이 떨어진다. 또는 Bias가 높다면 그만큼의 오차를 의미해 성능이 떨어진다. 우리의 목적은 Variance와 Bias 모두 낮은 모델을 만드는 것이다. target에 대한 Variance와 Bias의 의미는 다음 그림과 같다.
7. Variance(편차)와 Bias(오차) 줄이기
Variance는 두가지 방법으로 줄일 수 있다. 먼저 성능을 평균으로 계산해서 들쑥날쑥한 성능을 평균을 통해 평균치로 만들어 비교하는 방법이다. 두번째로 데이터를 늘려 outlier를 줄여 Variance를 감소시키는 방법이 있다. Bias 또한 두가지 방법으로 줄일 수 있다. 먼저 데이터를 늘려 모델의 오차 자체를 줄이는 방법이다. 두번째로는 모델 튜닝을 통해 overfitting을 패해 Bias를 감소시키는 방법이 있다. 모델 튜닝은 이전에 다루었으므로 성능의 평균으로 평가하는 방법과 데이터를 늘이는 방법을 정리하겠다.
8. Variance 줄이기
성능의 평균으로 평가하는 방법은 train 데이터를 여러번 train 데이터와 validation 데이터로 분리해 여러번 모델을 평가하고 모델의 평가를 평균 내어 평균 성능으로 모델을 평가하는 방법이다. train 데이터와 validation 데이터를 나누는 과정에서 성능이 들쑥날쑥할 수 있는 경우를 여러번 반복 실행하고 각각의 성능 결과를 평균으로 계산하는 방법을 통해 줄이는 것이다.
무작위로 샘플링하는 방법과 계획적으로 샘플링하는 두가지 방법이 존재한다. 현장에서는 대부분 계획적으로 샘플링하는 K-Fold Cross Validation을 사용한다. 데이터를 k 등분하여 k번 수행하고 평균 성능으로 평가하는 방법으로 다음과 같다.
K-Fold Cross Validation을 사용하는 방법으로 sklearn.model_selection의 cross_val_score() 함수를 통해 모델을의 학습, 예측, 평가를 한번에 하는 방법과 튜닝 시 옵션으로 cv값을 지정해 Cross Validation을 하는 방법이 있다. 코드는 다음과 같다.
'1. cross_val_score를 사용하여 Cross Validation 성능 측정'
'data: 핸드폰 가입 이탈 여부 데이터'
from sklearn.tree import DecisionTreeClassifier
from sklearn.model_selection import cross_val_score
model = DecisionTreeClassifier() # 모델 선언
scores = cross_val_score(model, x_train, y_train) # cross_val_score() 함수는 학습, 예측, 평가를 동시에 진행
print(scores)
# [0.59571429 0.61428571 0.61857143 0.61857143 0.62571429]
print(scores.mean())
# 0.6145714285714285
'2. 튜닝 옵션으로 cv값 지정하여 Cross Validation 성능 측정'
'data: 핸드폰 가입 이탈 여부 데이터'
from sklearn.tree import DecisionTreeClassifier
from sklearn.model_selection import GridSearchCV
from sklearn.metrics import accuracy_score
model = DecisionTreeClassifier() # 모델 선언
params = {'max_depth': range(1, 6)}
model_gs = GridSearchCV(model, params, cv=5) # 튜닝시 옵션으로 cv 횟수 지정
model_gs.fit(x_train, y_train)
pred = model_gs.predict(x_val)
print(accuracy_score(y_val, pred))
일반적으로 k 값은 현업에서 보통 5에서 10 사이에서 많이 사용되고 데이터가 충분한 경우 10, 부족한 경우 5를 사용한다는 것도 유의하자.
9. Bias 줄이기
데이터를 늘리면 Variance와 Bias 모두 개선되며 Training Set의 크기가 커질수록 모델 성능은 향상된다. 그러나 데이터가 많을수록 성능이 개선되다가 어느 지점부터 성능 향상도가 꺾이게 된다. 꺾인 이후부터는 데이터 증가에 따른 성능 개선 효과는 급격히 줄어들지만 데이터가 많은 만큼 모델의 학습 속도는 느려진다. 따라서 적절한 양의 데이터를 사용해야 한다. 이를 찾는 방법으로 Elbow Method가 있다. Elbow Method란 적절히 성능이 꺾이는 지점을 찾아 선택하는 휴리스틱 방법이다. 즉 데이터 건수에 따른 정확도를 측정하고 꺾이는 지점을 직접 선택해 데이터 개수를 조절하는 것이다.
10. Overfitting(과적합)
Train Set에 너무 적합되어 Train Set에 대한 성능은 매우 좋지만 다른 데이터에서의 성능은 오히려 떨어지는 범용적이지 못한 모델을 Overfitting(과적합)되었다고 한다. 반대로 성능이 낮은 모델을 Underfitting(과소적합)되었다고 한다. 이전까지 정리에서 모든 모델들의 복잡도를 얘기했다. 단순한 모델일수록 Underfitting될 가능성이 높고, 복잡한 모델일수록 Overfitting될 가능성이 높다. 따라서 모델은 attribute의 개수를 조절하거나 hyperparameter를 조절하는 과정을 통해 적절한 복잡도를 가져야한다.
선형모델에서는 attribute를 많을수록, 트리모델에서는 트리의 크기가 클수록, SVM에서는 Cost와 gamma가 클수록 모델은 복잡해진다. Overfitting을 방지하기 위해 적합도 그래프(Fitting Graph)를 확인하여 Train Set에 대한 성능과 Validation Set에 대한 성능이 급격히 벌어지는 지점을 찾아 적용하도록 하자.
'[KT AIVLE School]' 카테고리의 다른 글
딥러닝 #1 - 딥러닝 개요 Tensorflow & Keras 2022/09/13~2022/09/16 (0) | 2022.09.13 |
---|---|
머신 러닝 #5 - Ensemble 기법 2022/08/22~2022/08/29 (0) | 2022.09.12 |
머신 러닝 #3 - Decision Tree & SVM 2022/08/22~2022/08/29 (0) | 2022.08.30 |
머신 러닝 #2 - KNN & Logistic Regression 2022/08/22~2022/08/29 (0) | 2022.08.29 |
머신러닝 #1 - 모델링 개요 & Linear Regression 2022/08/22~2022/08/29 (0) | 2022.08.22 |