오늘은
딥러닝 배운거 복습할 겸 kaggle에서 playground를 하나 선정해서 진행해 보았다.
내가 한거: https://www.kaggle.com/datasets/mchilamwar/predict-concrete-strength
데이터 구성은 다음과 같다.
- CementComponent:- 시멘트 섞인 양
- BlastFurnaceSlag:- Blast Furnace Slag 가 섞인 양
- FlyAshComponent:- FlyAsh 가 섞인 양
- WaterComponent:- water 가 섞인 양
- SuperplasticizerComponent:- Super plasticizer가 섞인 양
- CoarseAggregateComponent:- Coarse Aggregate가 섞인 양
- FineAggregateComponent:- Coarse Aggregate가 섞인 양
- AgeInDays:- 건조된 상태로 몇일동안 방치되었는지
- Strength:- (타겟) strength
운이 좋게도 이번 컴피티션은 모두 정형 데이터로 되어 있어서 초보자가 갖고 놀기 편하게 되어 있었다.
먼저 간단하게 single layer로 구성해서 학습을 진행해 보았다.
class MLRModel(nn.Module):
def __init__(self):
super().__init__()
self.linear = nn.Linear(8, 1) # linear layer 정의
# 학습 진행
def forward(self, x):
return self.linear(x)
model = MLRModel()
# optimizer 정의. Single Gradient Descent를 활용한다.
optimizer = optim.SGD(model.parameters(), lr=5e-7)
nb_epochs = 1000
for epoch in range(nb_epochs + 1):
hypothesis = model(x_train) # model을 통과시켜 y 예측값 계산.
cost = torch.sqrt(F.mse_loss(hypothesis, y_train)) # y값과 예측값의 차이를 RMSE로 계산한다.
# 경사 하강법으로 최적화
optimizer.zero_grad()
cost.backward()
optimizer.step()
if epoch % 100 == 0:
print('Epoch {:4d}/{} Cost: {:.6f}'.format(epoch, nb_epochs, cost.item()))
output
Epoch 0/1000 Cost: 458.384186
Epoch 100/1000 Cost: 373.375763
Epoch 200/1000 Cost: 288.757385
Epoch 300/1000 Cost: 205.003937
Epoch 400/1000 Cost: 123.812592
Epoch 500/1000 Cost: 55.500744
Epoch 600/1000 Cost: 36.496483
Epoch 700/1000 Cost: 35.905144
Epoch 800/1000 Cost: 35.676495
Epoch 900/1000 Cost: 35.452969
Epoch 1000/1000 Cost: 35.231491
epoch를 1000으로 했을 때 cost가 35.2가 나왔다.
그 다음 feature들을 모두 standardization시켜서 진행해 봤을 때 다음과 같이 나왔다.
Epoch 0/1000 Cost: 39.357998
Epoch 100/1000 Cost: 31.532192
Epoch 200/1000 Cost: 24.976177
Epoch 300/1000 Cost: 20.349951
Epoch 400/1000 Cost: 17.869141
Epoch 500/1000 Cost: 16.874550
Epoch 600/1000 Cost: 16.544317
Epoch 700/1000 Cost: 16.443193
Epoch 800/1000 Cost: 16.413061
Epoch 900/1000 Cost: 16.404152
Epoch 1000/1000 Cost: 16.401522
전보다는 성능이 좋아지기는 했다. 하지만 16 밑으로는 내려가지 않는 것 같다.
그 다음 변수들 간에 상관관계를 보려고 correlation matrix를 그려보았다.
여기까지 코칭스터디에서 배운건 해봤고, 그 다음부터는 kaggle notebook을 참고하면서 작성해봤다.
report = create_report(train_df)
report.show()
dataprep이라는 패키지를 처음 발견했는데, 정말 신세계였다.
코드 몇줄에 웬만한 EDA를 다 할 수 있었다.
그리고 LGBM을 활용해서 train을 시켜봤는데, optuna라는 패키지를 활용해 빠르게 hyperparameter를 optimize할 수 있었다.
def tune_parameters_lgbm(X, y, test_size):
# LGBM 모델 파라미터 설정
opt_params = {
"objective": config.OBJECTIVE, # 최소화하고자 하는 손실 함수 설정
"metric": config.METRIC # 모델 성능 평가 지표 설정
}
# train, validation 데이터셋 분할
x_train, x_val, y_train, y_val = train_test_split(X, y, test_size=test_size)
# LGBM용 데이터셋 생성
reg_train = lgb.Dataset(x_train, y_train)
reg_eval = lgb.Dataset(x_val, y_val, reference=reg_train)
# 파라미터 튜닝 수행
opt = lgbo.train(
opt_params, # 최적화하고자 하는 파라미터 설정
reg_train, # 학습 데이터셋
valid_sets = reg_eval, # 검증 데이터셋
verbose_eval = False, # 학습 결과 출력 여부
num_boost_round=200, # 부스팅 라운스 수 설정
early_stopping_rounds=100) # 조기 종료 설정
return opt
# 하이퍼파라미터 튜닝 진행
if config.OPTUNA_SWITCH == "on":
opt = tune_parameters_lgbm(X, y, config.TEST_SIZE)
optuna
- Optuna는 머신 러닝 작업을 위한 자동 하이퍼파라미터 최적화를 위해 특별히 설계된 소프트웨어 프레임워크
- 옵투나는 다양한 최적화 알고리즘을 사용해 탐색 공간을 탐색함으로써 최적의 하이퍼파라미터를 찾는 과정을 자동화한다.
- 사용자는 하이퍼파라미터의 값 범위 또는 가능한 값 목록을 정의할 수 있으며, Optuna는 머신러닝 모델의 최고 성능을 이끌어내는 최적의 하이퍼파라미터 조합을 찾아낸다.
- Optuna는 명령형, 실행별 정의 스타일 API를 제공하므로 다양한 머신 러닝 프레임워크와 쉽게 통합할 수 있다.
- Optuna는 병렬화된 하이퍼파라미터 최적화를 지원하므로 최적화 프로세스의 속도를 크게 높일 수 있다.
출처: chatGPT
위 과정을 거치면, 최적의 hyperparameter를 찾을 수 있다.
print("Best Parameter For LGBM is")
print(opt.params)
## output
# Best Parameter For LGBM is
# {'objective': 'regression', 'metric': 'rmse', 'feature_pre_filter': False,
# 'lambda_l1': 3.258824953125905, 'lambda_l2': 9.988612204463507, 'num_leaves': 4,
# 'feature_fraction': 1.0, 'bagging_fraction': 0.861516743828745, 'bagging_freq': 6, 'min_child_samples': 50, 'num_iterations': 200, 'early_stopping_round': 100}
이렇게 해서 찾아낸 hyperparameter로 찾아낸 cost는 다음과 같다.
Did not meet early stopping. Best iteration is:
[200] train's rmse: 11.6356 valid's rmse: 12.0822
성능이 점점 좋아지는 걸 볼 수 있다.
내일은
- XGBoost를 활용한 학습을 진행하고, prediction 및 submission까지 진행하고, 정리를 해보도록 하겠다.
- 시간이 남으면 다른 노트와 discussion까지 확인해 보도록 할 예정이다.
요즘 내가 하고 있는 것이 chatGPT로 글 작성 해보는 것이다.
- AIPRM: chatGPT 프롬프트 모음
- 라이너 AI: 구글 검색에 chatGPT 적용 + 페이지에 하이라이트를 넣어줄 수 있는 좋은 확장 프로그램
'진행중' 카테고리의 다른 글
[TID] 2023-03-08 - kaggle (1) | 2023.03.08 |
---|---|
[TIL+TID]2023-03-07 kaggle playground s3e9 + Stable Diffusion과 chatGPT 세미나 (0) | 2023.03.08 |
[TID] 2023-03-04 GAI, LLM에 대한 커피챗 (0) | 2023.03.04 |
[TIL] 2023-03-03 (0) | 2023.03.03 |
[TID] 2023-03-02 (0) | 2023.03.02 |