1. 따릉이 수요예측
데이터 분리 시, random_state에 따른 학습 성능 차이가 크다는걸 확인하게 되었습니다. 왜그런지 추측을 해본다면
현재 갖고 있는 train data만 1300건 정도 밖에 없습니다. 게다가 Feature 중 Categorical 형식의 컬럼이 4개가 있습니다. 예를 들어서 비가 왔을때와 오지 않았을때, 미세먼지가 심했을때, 보통일때, 나쁠때 등 각 상황별로 충분한 데이터가 주어지지 않아서 train에 어떤 data가 학습 되었느냐에 따라 성능차이가 있을거라는 제 개인적인 생각입니다. 그래서 random_state 별로 LGB 모델을 199번까지 돌려봤습니다.
X_train, X_test, Y_train, Y_test = train_test_split(x_train, y_train, test_size=0.1, random_state=43,stratify=x_train['hour_bef_precipitation'])
# print('X_train:',X_train.shape, 'X_test:',X_test.shape, 'Y_train:',Y_train.shape, 'Y_test:',Y_test.shape)
#그리드 서치
models = [
('lgb', lgb.LGBMRegressor(random_state=2021)),
]
params = {
'lgb': {
"max_depth": range(3, 20),
"learning_rate" : [0.001,0.01,0.1],
"n_estimators": [80,100,120,140,160]
}
}
best_model, best_score = None, float('inf')
kfold = KFold(n_splits=10, shuffle=True, random_state=2021)
for model_name, model in models:
for num in range(54,200):
X_train, X_test, Y_train, Y_test = train_test_split(x_train, y_train, test_size=0.1, random_state=num,stratify=x_train['hour_bef_precipitation'])
param_grid = params[model_name]
grid = GridSearchCV(model, cv=kfold, n_jobs=-1, param_grid=param_grid, scoring = 'neg_mean_squared_error')
grid = grid.fit(X_train[x_columns], Y_train)
model = grid.best_estimator_
predictions = model.predict(X_test[x_columns])
score = evaluate(Y_test, predictions)['mse'][0]
print("{0},score:{1},best_params_:{2}, random_State:{3} ".format(model_name, score, grid.best_params_, num))
if score < best_score:
best_score=score
best_model = model
몇 군데에서 1000이하의 성능을 보였습니다. 특히 54번의 score가 가장 좋은 성능을 보이고 있습니다. 과적합의 가능성도 있어서 이는 내일 한번 데이콘에 제출해 봐야 알수 있을 것같습니다.
+2021-10-08 추가
54번 random_state 제출한 결과, 기존의 성능보다 2정도 낮은 수치를 보이며 과적합임을 확인했습니다. 다음 시간에는 최적의 random_State를 찾기 위한 지속적인 제출을 하거나, 과적합을 줄일 스태킹 등 여러 시도를 해보겠습니다.
1. CNN_배치정규화
각 층을 통과 할때마다 입력 데이터가 달라지는 현상을 막고자 BN이 활용된다. 또한 입력데이터가 큰 가중치는 딥러닝 수학 강의에서 배웠듯이 혼자 지배적으로 학습이 이뤄진다. 이를 막고자 BN을 활용할수 있다.
각 layer를 거치면서 기존의 데이터 분포가 갈수록 넓어지는 현상이 생긴다. 이렇게 되면 성능은 당연히 떨어질수밖에 없다. 갈수록 확장하는 분포를 제약을 두고자 할때 BN을 사용한다.
batch_size 끼리 평균,분산을 구하여 normalize를 진행한다. 이때 엡실론은 분모가 0이 되는 것을 방지한다. 이미지 맨 아래의 감마는 Scaling factor, 베타는 shift factor라고 한다. Scaling factor는 표준편차와 유사한 개념이며 shift factor는 평균을 이동시키는 역할을 한다.
정규화한 데이터를 그대로 사용하면 너무 타이트하게 제약을 걸어버리기 때문에 이슈가 발생한다. normalize를 하게 되면 0과 같거나 가까운 데이터가 많이 생기게 된다. 이 값을 sigmoid에 넣게 되면 0.5가 많이 생길 것이고, Relu에 넣으면 0을 많이 출력할것이다.
이를 해결하기 위해서 scaling / shift factor를 이용하여 재조정 시킨다. shift를 평균이라고 봐도 될것같다. 예를들어 x=0.5일때 감마가 0.1, 베타가 2라고 하면 y= 0.1*0.5+2 즉, 2.05의 값을 얻게 된다. 이 두개의 파라미터는 동적으로 계속 바뀐다.
BN은 activation 전에 들어간다.
위 설명처럼 test 시 데이터가 1건 or 배치보다 작은 데이터를 BN으로 적용할수가 없는 문제가 있다. 그래서 train 학습 시 계산된 평균 과 표준 편차들을 가지고 지수 가중 이동 평균(최근 데이터에 많은 가중치를 둔다)을 적용한다. 실제로 사용할때는 추가 코드 없이 model이 알아서 적용한다.
아래 링크에서 실습파일을 확인해 볼수 있습니다.
2021.10.05 - [실습 note] - CNN_Fundamental 실습 모음
'Data Diary' 카테고리의 다른 글
202-10-12,13(CNN_Pretained & Keras Generator의 이해) (0) | 2021.10.12 |
---|---|
2021-10-08(CNN_Global AG, 가중치 규제, Augmentation) (0) | 2021.10.08 |
2021-10-6(따릉이 프로젝트 완성하기 11) (0) | 2021.10.06 |
2021-10-5(따릉이 프로젝트 완성하기 10) (0) | 2021.10.06 |
2021-10-04,05(딥러닝 CNN_기본 특징 설명) (0) | 2021.10.04 |