728x90

빨간색 부분이 오늘 진행한 내용입니다.

태양열 프로젝트

1차 시도. 랜덤 포레스트 log 상태에서 스케일링에 따른 변화
-> 변화 없음

2차 시도. log 아닌 상태에서 스케일링에 따른 변화
->Normalizer

3차 시도. 변수의 차분 변화에 따른 성능 측정
->변수 2개 이상 동시 사용 시 성능 저하 발생

4차 시도. extracted_features 활용
-> 모든 변수 사용시 성능 저하 발생하여 VIF 및 RFECV 실행

 extracted_features 함수를 통해 얻은 변수들 중 의미 있어 보이는 120여 개 피처들로 예측한 그래프입니다.

성능값이 23점을 기록했습니다;;

120여개의 피처들을 vif를 통해 추리고, 추린 값을 refecv를 통해 또 추려봤습니다. 120개의 피처를 refecv를 돌리면 에러가 발생해서 vif 통해 1차적으로 걸렀습니다. 그래서 vif을 통해 얻은 피처 VS vif+refecv을 통해 얻은 피처들을 각각 랜덤 포레스트에 돌렸고 결과는 아래와 같습니다. 기존 변수 활용 시 성능은 7.801이었습니다.

* VIF : 7.98 (성능다운)
* refecv: 7.98(성능다운)

ㅎㅎㅎㅎㅎㅎㅎㅎㅎㅎㅎㅎㅎㅎㅎㅎㅎㅎㅎㅎㅎㅎㅎㅎㅎㅎㅎㅎㅎㅎㅎㅎㅎㅎㅎㅎㅎㅎㅎㅎㅎㅎㅎㅎㅎㅎㅎㅎㅎㅎㅎㅎㅎㅎㅎㅎㅎㅎㅎㅎㅎㅎㅎㅎㅎㅎㅎㅎ


5차 시도. 랜덤 포레스트 그리드 서치

-> 랜덤포레스트 그리드 서치를 실행했습니다. 
{'criterion': 'mse',
 'max_depth': None,
 'max_features': 'auto',
 'min_samples_leaf': 2,
 'min_samples_split': 8,
 'n_estimators': 300}

 

앞서 구한 결과를 토대로 적용한 결과
* 7.96 (성능다운)

6차 시도. 계절성 분해 적용

-> target값을 분해한 후 validation data인 2021년 01월 추세&계절 값은 2020년도 01월 값을 사용했습니다.
랜덤 포레스트: 13.98 (추세+계절)
랜덤포레스트: 7.78(계절), 약 0.02 개선

 

7차 시도. Cloud lag값 제거

-> 7.73으로 성능 개선됨

 

8차 시도['Temperature','WindSpeed','Humidity'] 차분 횟수에 따른 성능변화

-> 차분 6일 때 가장 좋은 성능을 보임

1. diff -> 3 : 7.580
2. diff -> 4 : 7.510
3. diff -> 5 : 7.599
4. diff -> 6 : 7.435
5. diff -> 7 : 7.589 (차분 7회 이상부터 과적합)
6. diff -> 8 : 7.645
7. diff -> 9 : 7.702
8. diff -> 10 : 7.753

 

9차 시도. 랜덤 포레스트 estimator 변경에 따른 성능변화

300 : 7.369
400: 7.363
500: 7.326
600: 7.314
700: 7.331
800: 7.350
900: 7.340
1000: 7.360

 

10차 시도. 수정된 피처를 적용한 그리드 재검토

*그리드 결과

'max_depth': None, 
'min_samples_leaf': 6, 
'min_samples_split': 14, 
'n_estimators': 600

-> 정확도 83%, Score : 7.51
기존 7.31 보다 0.2 낮아짐. min_samples_leaf & min_samples_split는 과적합 방지로 사용한다. 기존에 사용하던 값은 디폴트 값을 이용했으므로 과적합에 취약한 모델일 가능성이 있다. 하지만 validation 값은 앞서 언급했듯이 0.2가 낮아진 상태이다. 어떤 파라미터가 옳은지는 사실 잘 모르겠다. 일단 val값을 가장 낮추는 방향으로 진행할 예정이다.

 

11차 시도. Cloud의 더미 변수화

-> 7.526으로 개선 효과 없음

 

12차 시도. day 데이터의 lag 적용

day lag값 -> 24,48 인 경우 7.249 성능개선day lag값 -> 24,48,72 인 경우 7.26 성능감소 
day lag값 -> 24,48,72,96 인 경우 7.35 성능감소 

 

13차 시도. seasonal 1월 값을 예측

기존에는 시계열 분해한 계절성 데이터를 2020/01 ->2021/01(validation) 그대로 복사했습니다.

그래서 이번 시도는 랜덤포레스트로 예측하여 2021/01 계절성 데이터를 채웠습니다. 그리고 스케일링 전/후 성능비교까지 포함하여 진행했습니다.

 

스케일링 전: 7.248
스케일링 후 7.248

 

진행한 결과 변화가 거의 없었습니다. 또한 스케일링 전후 차이도 없었습니다.

타켓값의 계절성 데이터는 랜덤포레스트 변수 중요도에서 70% 정도를 차지하는 변수입니다. 그래서 

나름 기대하면서 진행했는데 결과는 조금 아쉬웠습니다. 

 

14차 시도. 계절성 데이터를 차분

랜덤포레스트 후 잔차 진단 결과 자기상관 그래프입니다.

편자기상관은 튀는 값이 있긴 하지만 상당히 진정된 상태를 보입니다. 반면 자기상관은 패턴이 보입니다.

어떻게 랜덤포레스트 모델에서 자기상관을 없앨수 있을까 고민을 했습니다. 일단 가지고 있는 데이터 중 계절성 데이터가 있으므로 이를 차분하여 어떤 효과가 있는지 변화를 보고자 했습니다. 

주기는 24이고, 결과는 아래와 같습니다.

 

target 변수 차분 24: 11.535
target 변수 차분 24,48: 12.555
-> 오히려 자기 상관성 튀는 값과 패턴이 뚜렷해짐

랜덤과 사리마모델을 혼합해 볼까 생각도 해봤지만 사리마 모델도 현재 성능이 썩 좋지는 않고 정상성도 확보를 못하고 있었던 터라 ..;; 부랴부랴 다시 파라미터 점검에 나섰습니다. 그런데 전과는 다르게 이번엔 전체 데이터로 (파라미터 실험했을땐 2020년도만 데이터 쪼개서 실행했었음) 실행하니까 중간에 오류가 걸립니다. 원인도 나오지 않은 채 그냥 터진 것 같습니다. 사리마로 진행하는 건 시간 낭비 일거란 판단하에 내일은 lgb모델의 파라미터 최적화를 해볼 생각입니다.

 

15차 시도. lgb 파라미터 최적화 

'boosting': 'gbdt',
'learning_rate': 0.01,
'min_child_samples': 10,
'n_estimators': 700, 'num_leaves': 36
-> CV SCORE: 8.7685

그리드 서치 적용 결과 성능이 8.4에서 8.7로 나빠 졌는데, 제 생각엔 과적합 현상이 줄어서 그런게 아닌가 싶습니다.

결과적으로는 랜덤 포레스트가 더나은 성능을 보이기 때문에 lgb는 이제 생각치 않도록 하려 합니다.

 

16차 시도. PCA를 통한 변수 축소

전체 변수를 사용하면 랜덤 포레스트는 7.28정도가 나옵니다. 이 성능을 가진 모델을 2월달 predict 하니까 패턴이 사라지고 뒤죽박죽으로 되어 있었습니다. 15시 태양열 에너지가 보통 400~600 정도 나오는데, 갑자기 50or 0 이 나오는패턴이었습니다. 패턴을 설명하는 seasonal 데이터에 다른 변수가 영향을 끼친게 아닌가 의심이 들어서 VIF로 걸러낸 column으로 재시도 했습니다. 그 결과, 랜덤 포레스트 성능은 7.5로 성능이 다운이 되었지만 2월달 predict 에서는 패턴을 제대로 감지 했습니다.

 

 

방해되던 변수는 차분을 6차까지 했던 변수들이 대부분이였습니다. 이 컬럼들은 따로 모아서 PCA로 차원 축소를 하여 성능을 조금 더 끌어 올렸습니다. 차원축소를 1~3개 각각 했을 경우 결과는 아래와 같습니다.

 

PCA 1개로 축소할때 랜덤 포레스트 성능: 7.420

pca 1

 

PCA 2개로 축소할때 랜덤 포레스트 성능: 7.429

pca 2

PCA 3개로 축소할때 랜덤 포레스트 성능: 7.249

pca 3

PCA 4개로 축소할때 랜덤 포레스트 성능: 7.437

결론

PCA 3개로 했을때가 가장 좋은 성능을 보였습니다. 그치만 PCA 전 과적합 현상이 있었던 모델 성능도 7.2점대 이라서 이 모델도 과적합이 아닐까 의심이 듭니다. 일단 패턴을 보존하면서 predict도 잘 되었으니까 pca3개로 고정하겠습니다.

 

 

728x90

+ Recent posts