보스톤 주택가격: 머신러닝 회귀 분석

챗GPT가 프로그램 코드를 작성하여 사용자에게 제공하는 걸 넘어서서, 이제는 스스로 파이썬 코드를 실행하고 결과를 알려 주고 있습니다. 데이터 분석 관련해서는 전처리, 탐색적 데이터 분석(EDA), 시각화, 머신러닝과 딥러닝을 포괄합니다.

이러한 챗GPT의 코드 실행 기능은 유용하지만, 계산 능력의 제한으로 인해 1분 이내에 완료될 수 있는 실험에 적합합니다. 실행 시간이 1분을 초과하면 자동 중단되고 에러가 발생하기 때문입니다. 이는 사용자가 복잡한 모델이나 큰 데이터셋을 다룰 때 고려해야 할 중요한 제약사항이 됩니다.

대부분의 딥러닝 모델의 경우, 제한된 시간 내에 충분한 학습을 달성하기 어려울 가능성이 높고, 머신러닝 모델 역시 복잡도와 데이터셋 크기에 따라 어려움이 있을 수 있습니다. 따라서, 간단한 실험과 초기 모델 평가에 주로 활용하는 것이 바람직합니다.

이번 글에서는 머신러닝의 기본이 되는 회귀를 선택하여 모델을 학습시켜 보았습니다. 알고리즘은 챗GPT의 추천을 받아서 인기 있는 머신러닝 알고리즘인 랜덤 포레스트(random forest)와 XGBoost를 선택했습니다. 이들로 모델을 학습시키면서 어디까지 가능한지 확인해 보았습니다.

데이터셋은 보스턴 주택 가격(Boston Housing) 데이터셋을 사용했습니다. 506개 행, 14개 열로 이루어진 소규모 데이터셋으로, 1970년대 보스턴 지역의 주택 가격에 영향을 미칠 만한 변수 13개를 선정해 놓았습니다.

이번 글의 결과는 정밀한 조건에서 여러 번의 반복 실험을 한 것은 아니니 참고로 보아주세요.

대화 링크: https://chat.openai.com/share/8c996bc5-6149-4341-87d6-c737ada08269



랜덤 포레스트 회귀 분석


챗GPT의 GPTs에서 Data Analyst를 선택합니다. 따라서 별도의 페르소나(“너는 유능한 데이터 분석가야”)나 Custom Instructions는 설정하지 않습니다.

다음 보스턴 주택 가격 데이터셋을 업로드합니다. 링크는 읽어들이지 못하기 때문에 파일을 다운로드해서 업로드해 주어야 합니다.

내용 요약부터 시작합니다.


열 이름이 알아보기 어려워서 쉬운 표현으로 바꿉니다.


마법의 작업인 탐색적 데이터 분석(EDA)부터 진행합니다. 기술 통계 요약, 주요 변수 분포 시각화 및 분석, 변수들의 상관관계 시각화 및 관찰을 합니다. 답변 내용이 꽤 알찹니다.


주택 가격을 예측하는 회귀분석을 하려는데, 실행 제한 시간 1분을 고려하여 알고리즘을 추천해 달라고 하니 ① 선형 회귀 ② 릿지와 라쏘 회귀 ③ 결정 트리 기반 알고리즘 가운데 ③번, 그중에서도 LightGBM과 XGBoost를 추천합니다.


하지만 LightGBM은 챗GPT가 기본으로 제공하는 라이브러리 339개에 포함되지 않습니다. 약간의 시행착오를 거치고 챗GPT에게 추천을 받아서 랜덤 포레스트(random forest)로 결정합니다. 빠른 실행 시간, 중소 규모의 데이터셋에서 안정적인 성능을 낸다는 점이 마음에 듭니다. (링크의 실제 대화 순서와 이 글의 설명 순서가 다릅니다. 설명의 흐름에 어울리게 편집했습니다.)

[참고] ChatGPT 내부 라이브러리 목록: https://code-interpreter-search.netlify.app

LightGBM이 내장되어 있는지 확인을 하지 않고 LightGBM을 추천한 것이 사람과 비슷합니다. 컴퓨터의 완벽한 이미지를 허물고 털털한 이미지를 구축하는 데 챗GPT가 한 몫 합니다 😉



성격 급하게 전처리도 하지 않고 바로 모델 만들어서 학습 들어갈 기세라 잠깐 멈추고 결측치 처리부터 합니다. 연속형 변수는 중앙값으로, 범주형 변수는 최빈값으로 처리했습니다.


이상치 처리를 하기 위해 그래프를 확인합니다. CrimeRatePerCapita에서 유난히 높은 샘플 몇 개가 눈에 띕니다. 이 샘플들 자체가 문제가 아니라, 다른 샘플들의 값 차이를 작아 보이게 만들어서 분석하는 데 방해가 될 듯합니다.


이상치 처리 방법을 물으니 ① 제거 ② 상한 값과 하한 값으로 대체(Winsorizing)의 두 가지를 제안해 줍니다.


②의 상한 값과 하한 값으로 대체를 선택했는데, 의사소통이 정확히 되지 않아 약간의 혼란이 있었지만, 결국 CrimeRatePerCapita가 60을 넘는 샘플 3개만 제외했습니다.

챗GPT로 데이터 분석을 할 때는 챗GPT가 작업을 정확히 처리했는지 반드시 확인하며 진행해야 합니다. 사용자가 원하는 바를 챗GPT가 잘못 이해하거나, 심지어는 환각 (Hallucination)등에 의해 “요구사항 A를 처리했다”라고 말하지만 실제로는 B로 처리하는 경우가 발생합니다. 이는 다른 사용자들의 사용 사례에서도 종종 발생하는 문제입니다.


특성 선택과 엔지니어링(feature engineering)은 지금은 하지 않아도 될 듯하여 넘어가고 랜덤 포레스트로 학습을 진행합니다. 몇 번의 에러가 발생하지만, 좋은 결과가 나옵니다. 제곱근 평균 제곱 오차(RMSE) 2.87, 결정 계수(R²) 0.89입니다.


비교적 좋은 결과가 나왔지만 성능 개선을 시도합니다. 하지만 실행 시간 1분의 제약으로 인하여 성능 개선은 실패합니다.



XGBoost 회귀 분석

다음은 XGBoost를 실행해 봅니다. 1분이라는 실행 시간제한을 고려해도 '실행 시간이 상대적으로 빠르면서도 높은 예측 정확도를 제공'한다며 챗GPT가 추천한 알고리즘입니다. XGBoost는 서로 다른 창(세션)에서 세 차례 학습시켰습니다.

랜덤 포레스트가 시간 초과 에러 없이 바로 학습되었음에 비해, XGBoost는 시간 초과 에러가 발생하여 하이퍼파라미터 값을 서너 차례 줄여 겨우 학습에 성공했습니다(최종 n_estimators = 30, max_depth = 3). 아무래도 랜덤 포레스트보다 메모리가 많이 필요하고 실행 시간도 오래 걸리는 듯합니다.

분석을 진행한 과정은 랜덤 포레스트와 유사하여 생략하고, 결과만 소개 드리면 다음과 같습니다. 제곱근 평균 제곱 오차(RMSE) 3.30, 결정 계수(R²) 0.85로 랜덤 포레스트의 결과만 못합니다.


참고로 XGBoost 1차 시도에서는 제곱근 평균 제곱 오차(RMSE) 3.72, 2차 시도에서는 4.99가 나왔습니다.

1차: https://chat.openai.com/share/627cd02c-83c3-4cbd-82ad-a088889f9840

2차: https://chat.openai.com/share/ae1e559e-a766-4cce-85e4-565232c4aabd

3차: https://chat.openai.com/share/eea865a9-4843-4c4e-b7eb-e4b88d5c2e28



구글 코랩에서 추가 학습

학습에 사용된 데이터와 모델을 다운로드할 수 있습니다. XGBoost 3차에서 데이터셋과 학습된 모델을 다운로드고, 구글 코랩(Colab)에서 읽어 들여 하이퍼파라미터를 조절해 봤습니다. 방법은 챗GPT에게 물었고, 막히는 부분이 생기면 다시 물었는데, 쉽게 결과를 얻을 수 있었습니다.




코랩에서 학습시킨 최종 결과로서 제곱근 평균 제곱 오차(RMSE) 2.46, 결정 계수(R²) 0.92입니다. 챗GPT에서 실행한 랜덤 포레스트, XGBoost 보다 우수합니다. 코랩에서의 실행은 채 5분이 걸리지 않았습니다.

(코랩 링크: https://colab.research.google.com/drive/1jOP1LqI5dUbAE72xIopS9JORiTN3x_8n?usp=sharing )



계산량이 적은 알고리즘들로 앙상블 학습

기본 알고리즘 3개를 학습시켜 앙상블 모델을 만들어 보았습니다. 앙상블은 여러 개별 모델의 예측을 결합하여 전체적인 예측 성능을 향상시키는 기법입니다. 한 모델이 특정 유형의 패턴을 잘 감지하고, 다른 모델이 다른 유형의 패턴을 잘 감지할 수 있다는 사실에 기반한 방법입니다.

챗GPT에게 추천을 받아서, 선형 회귀, 릿지 회귀, SVR(support vector regression)을 선정하였습니다. 일반적으로 랜덤 포레스트나 XGBoost 보다 계산량이 적다고 알려진 알고리즘들입니다.

이들을 개별 학습시킨 뒤 앙상블 모델을 만들었는데, 결과는 좋지 않습니다. RMSE 4.62, R² 0.708로 많이 부족합니다. 하이퍼파라미터 튜닝은 선형 회귀에 대해서는 하지 않았고, 릿지 회귀와 SVR에 대해 시도했으나 시간 초과로 실패했습니다.

https://chat.openai.com/share/031d8838-b24a-477a-9558-712b56f996f5




총정리 및 시사점

  1. 머신러닝의 랜덤 포레스트, XGBoost 알고리즘을 사용하여 모델을 만들고 약식 회귀 분석을 할 수 있습니다.
    - 랜덤 포레스트는 학습에 어려움이 없으나, XGBoost는 알고리즘 돌리기가 버겁습니다. 학습된 모델의 성능 개선은 양쪽 모두 챗GPT 내에서는 시간 초과로 실패하였습니다. 성능 개선은 학습된 모델을 다운로드하여 별도로 수행해야 합니다.
    - 분석 결과는 전문적인 데이터 과학자가 직접 코딩하여 실행한 수준에 이르지는 못하지만, 기본적인 데이터 분석과 모델링 작업은 가능합니다.

    - 일반적으로 랜덤 포레스트나 XGBoost 대비 계산량이 적다고 알려진 SVR, 릿지 회귀에서도 하이퍼 파라미터 튜닝이 실패했습니다. 이들과 선형회귀를 결합하여 앙상블 모델을 만들었으나 결과는 많이 부족한 수준입니다.

  2. 기본 수준의 파이썬 코딩이 가능한 사용자라면 챗GPT에서 1차로 데이터 전처리, EDA, 시각화, 모델링을 진행하고, 데이터와 모델을 다운로드하여 외부 환경에서 추가 성능 개선하는 방법도 효율적일 듯합니다. 다만, 작업 과정 중간중간에서 챗GPT가 작업을 정확히 수행하고 있는지 실행 결과의 정확성과 적절성을 지속 확인해야 합니다. [끝]

3
4개의 답글

(채용) 크리에이터, 마케터, AI 엔지니어

지피터스: 콘텐츠를 AI로 재가공 해 원소스 멀티유즈하는 스타트업

👉 이 게시글도 읽어보세요