Today's Goals
1. 선형회귀 베이스라인 완성하기
2. XGBoost 베이스라인 완성하기
생각도 못한 선형회귀의 비정상적인 결과를 해결하는 과정에서 배운 것이 많았다.
머신러닝 과정에서 이렇게 고려해야 하는게 많다는게 너무 어려우면서도 재밌었다!
1. 선형회귀 베이스라인
[사용 데이터]
- 중고차 가격 예측을 위해 영국 중고차 매물 데이터를 사용함
- 다른 전처리를 하지 않고 중복행만 제거한 원본 데이터임
[모델 학습 CASE1 : 범주형 컬럼 원-핫 인코딩, 독립변수 스케일링 적용]
- 해당 데이터의 범주형 컬럼은 특별한 순서나 크기의 차이가 있는 것이 아니기 때문에 원-핫 인코딩 적용
- 수치형 컬럼들 간의 스케일 차이가 커서 스케일링 적용
- 말도 안되는 모델 성능이 나와버렸다? 종속변수(price)의 스케일이 너무 차이가 나서 성능이 말이 안되게 나온건가?
[모델 학습 CASE2 : 범주형 컬럼 원-핫 인코딩, 독립변수 스케일링, 종속변수 로그 변환 적용]
- CASE1의 방법에 추가로 종속변수의 로그 변환 진행
- 여전히 말도 안되는 성능의 모델 도출
[모델 학습 CASE3 : 범주형 컬럼 원-핫 인코딩]
- 독립변수와 종속변수에 어떠한 조작도 하지 않은 데이터로 학습 진행
- 결과는 정상적임
- 하지만 변수간 스케일 차이가 클 때는 스케일링이 필요하다고 이해하고 있었는데, 무엇이 문제인지 이해되지 않음
[튜터님 질문 후 해결 방향]
- 범주형 컬럼을 원-핫 인코딩으로 처리하는 과정에서, model과 brand 값의 종류가 아주 많아서 변수도 과도하게 증가하게 된 것이 오류의 원인일 수 있음(model 종류만 195개)
- 종류가 많은 model과 brand는 라벨인코딩으로, 나머지 범주형 컬럼만 원-핫 인코딩으로 변경(원칙적으로는 순서나 크기가 있는 범주형 변수에 라벨인코딩을 적용하는 것이 맞지만 해당 모델의 경우 변수가 너무 많아져서 문제가 발생한 것을 해결해봐야 하므로)
- 종속변수 로그 변환 적용 여부는 두 케이스의 성능 지표 비교 후 결정 (종속변수에 이상치가 많다면 이론상 로그변환의 성능이 더 좋을 것임)
[문제 해결 CASE1 : 모델과 브랜드는 라벨인코딩, 나머지 원-핫인코딩, 독립변수 스케일링]
- 인코딩 방법을 바꾸었더니 정상적인 결과가 나왔음
[문제 해결 CASE2 : 모델과 브랜드는 라벨인코딩, 나머지 원-핫인코딩, 독립변수 스케일링, 종속변수 로그 변환]
- 종속변수를 로그변환한 상태로 성능지표를 뽑으면 해석이 어려움(단위가 달라지므로)
- 지수함수를 이용하여 원래 값으로 복원하는 과정이 필요함
[선형회귀 모델 베이스라인 결론]
- 범주형 변수의 특성에 맞춰 라벨인코딩과 원-핫 인코딩을 적용하는 것이 원칙이지만, 인코딩을 통해 변수가 과도하게 증가하는 것을 막는 것도 중요함
- 따라서 해당 데이터에서는 model과 brand를 원-핫인코딩이 아닌 라벨인코딩을 적용하여 변수 증가를 막음
- 독립변수들 간의 스케일 차이가 크기 때문에 스케일링 필요(엔진 사이즈와 주행거리 같은)
- 종속변수 로그 변환 여부는 성능 지표 비교 결과 로그 변환 후 학습한 모델의 성능이 더 높게 나타남
- 최종적으로 '모델과 브랜드는 라벨인코딩, 나머지 원-핫인코딩, 독립변수 스케일링, 종속변수 로그 변환' 케이스를 베이스 라인으로 채택
2. XGBoost 베이스라인
[사용 데이터]
- 사용 데이터는 선형회귀 모델과 같음
[XGBoost 란 무엇일까]
- Gradient Boosting 알고리즘의 확장판(성능,효율 개선)
- 단순한 모델들을 순차적으로 학습하면서, 이전 모델의 오차를 줄이는 방향으로 학습 진행
- 즉, 이전 단순 모델(약한 학습기)을 보완하면서 학습
- 보통은 depth가 얕은 결정트리(decision tree)를 약한 학습기라고 함
- Gradient Boosting과 달리 병렬 처리를 지원하여 학습 속도가 빠르다
, 무슨 말인지 모르겠고 그냥 그렇구나 외움ㅎ
[XGBoost에서 스케일링이 필요하지 않은 이유?]
- 트리기반모델은 트리의 분할 과정에서 값의 크기보다 변수의 순서나 분포에 의존하기 때문
- 반대로 선형모델의 경우 변수의 크기에 민감하여 크기가 큰 변수에 지나치게 의존해버릴 수 있기 때문에 스케일링을 진행함
[CASE : 범주형 변수 원핫 인코딩 적용]
- 정상적인 모델 성능이 나왔으며, 성능 또한 꽤 높음
[모든 범주형 변수에 원-핫 인코딩을 적용했는데 선형회귀와 결과가 다른 이유?]
- 간단히 말하자면 XGBoost 자체가 뛰어난 모델이라 ㅎ
- 선형회귀는 각 변수에 모두 영향을 받는 모델로, 다중공선성과 차우너의 저주에 취약하지만 XGBoost는 트리 기반로 이러한 특성에 의존하지 않음
- 트리기반 모델은 차우너이 증가해도 효율적으로 데이터를 분할하는 특성을 찾아냄
[원-핫 인코딩으로 과도하게 많아진 변수, XGBoost 모델의 과적합을 의심해야하나?]
- 과적합을 판단하기 위해서는 train 데이터 셋에 대한 성능지표와 test 데이터셋에 대한 성능지표를 비교해봐야 함(train보다 test의 성능이 떨어졌는지 확인)
- train에 비해 test의 성능지표가 낮아지긴 했지만 아주 미미한 수준이므로 과적합을 의심할 정도는 아니라고 판단
'데이터 부트캠프 - Today I Learned' 카테고리의 다른 글
[스파르타 내일배움캠프 / 데이터 분석 트랙] TIL(Today I Learned)_11주차_25.02.07 (0) | 2025.02.07 |
---|---|
[스파르타 내일배움캠프 / 데이터 분석 트랙] TIL(Today I Learned)_11주차_25.02.03 (0) | 2025.02.03 |
[스파르타 내일배움캠프 / 데이터 분석 트랙] TIL(Today I Learned)_9주차_25.01.24 (0) | 2025.01.24 |
[스파르타 내일배움캠프 / 데이터 분석 트랙] TIL(Today I Learned)_9주차_25.01.23 (0) | 2025.01.23 |
[스파르타 내일배움캠프 / 데이터 분석 트랙] TIL(Today I Learned)_9주차_25.01.22 (0) | 2025.01.22 |