주제

1. ChatGPT를 활용한 데이터 분석
2. GitHub Copilot
3. ChatGPT의 Code Interpreter

 

1. ChatGPT를 활용한 데이터 분석

  • 데이터셋을 가지고 ChatGPT와 계속 대화를 하며 문제를 푸는 방식으로 이루어짐
  • 유료 버전을 사용한다면 :
    • Code Interpreter를 사용하여 EDA, 모델링 노트북 생성 가능
  • 주의할 점 :
    • 버전 업그레이드 시 이전의 프롬프트 테크닉들이 동작하지 않는 경우가 발생
    • 같은 버전 내에서도 행동은 확정적이지 않음. 물어볼 때마다 다른 답을 줌

 

2. GitHub Copilot

  • 소스 버전 컨트롤 : 개발자들이 개발하는 소프트웨어의 소스코드에 발생하는 변경사항들을 관리할 수 있도록 해주는 프로그램
    • 코드의 변경 사항들을 쉽게 추적 가능
    • 두 사람 이상이 공동 개발시 코드의 공유와 변경이 용이
    • 최근 시스템들은 코드리뷰도 지원
    • 코드 백업의 역할 수행
  • 버전 컨트롤 소프트웨어 : CVS, SVN, Git/GitHub
  • GitGub for Copilot : GitHub의 새로운 비전으로 AI 기반 개발 플랫폼
    • 이슈부터 배포까지 개발의 전체 수명 주기를 지원
    • 소스코드 에디터와 연동
    • 훨씬 더 완벽하고 정확한 코드를 완성해줌
    • GitHub에 직접 통합됨

GitHub Copilot

 

3. ChatGPT의 Code Interpreter

  • 프로젝트 : ChatGPT 4.0의 Code Interpreter를 이용한 대출자의 대출상환여부 예측 모델 구현
  • 유료 버전에서는 데이터셋을 제공하여 데이터 분석부터 적절한 예측 알고리즘 선정, 모델 성능 평가까지의 과정을 요구하는 프롬프트를 작성하면 된다.
  • 하지만 무료 버전은 데이터셋을 직접적으로 제공할 수 없기 때문에 어떤 필드가 있는지, 어떤 데이터셋인지 사용자가 차근하게 설명을 해주며, 코드를 받아내야한다.
  • 만족할만한 답이 나오지 않는다면 수정을 여러번 거쳐서 ChatGPT와 질의응답 과정을 거쳐야한다.
  • 나는 무료버전을 사용 중이므로, 데이터에 관한 전반적인 설명을 제공하고 분석부터 모델 훈련의 과정을 알려달라고 요구했다.
  • 내가 작성한 프롬프트는 다음과 같다 :
더보기

이건 내가 가진 데이터셋이야. 총 9581개의 행과 14개의 열이 있어. 데이터는 대출목적, 연간소득 등의 금융 정보를 담고 있고, 나의 궁극적인 목표는 not.fully.paid 라는 필드의 여부를 예측하는 모델을 구현하는 거야. 이 필드가 0이면 상환을 하지 못한 것이고, 1이면 상환을 했다는 거야. 필드의 이름은 다음과 같아 :

credit.policy purpose int.rate installment log.annual.inc dti fico days.with.cr.line revol.bal revol.util inq.last.6mths delinq.2yrs pub.rec not.fully.paid

이 데이터를 가지고 분석을 하고, 적절한 알고리즘을 선택해서 모델을 훈련시키고, 성능을 평가하는 과정을 하나씩 알려줄래? 내가 첫 10개의 데이터를 보내줄게 :

credit.policy purpose int.rate installment log.annual.inc dti fico days.with.cr.line revol.bal revol.util inq.last.6mths delinq.2yrs pub.rec not.fully.paid 1 debt_consolidation 0.1189 829.1 11.35040654 19.48 737 5639.958333 28854 52.1 0 0 0 0 1 credit_card 0.1071 228.22 11.08214255 14.29 707 2760 33623 76.7 0 0 0 0 1 debt_consolidation 0.1357 366.86 10.37349118 11.63 682 4710 3511 25.6 1 0 0 0 1 debt_consolidation 0.1008 162.34 11.35040654 8.1 712 2699.958333 33667 73.2 1 0 0 0 1 credit_card 0.1426 102.92 11.29973224 14.97 667 4066 4740 39.5 0 1 0 0 1 credit_card 0.0788 125.13 11.90496755 16.98 727 6120.041667 50807 51 0 0 0 0 1 debt_consolidation 0.1496 194.02 10.71441777 4 667 3180.041667 3839 76.8 0 0 1 1 1 all_other 0.1114 131.22 11.00209984 11.08 722 5116 24220 68.6 0 0 0 1 1 home_improvement 0.1134 87.19 11.40756495 17.25 682 3989 69909 51.1 1 0 0 0

  • 이에 대한 ChatGPT의 답변 :
import pandas as pd
from sklearn.model_selection import train_test_split
from sklearn.preprocessing import OneHotEncoder
from sklearn.ensemble import RandomForestClassifier
from sklearn.metrics import accuracy_score, classification_report

# 데이터 불러오기
data = pd.read_csv('your_dataset.csv')

# 데이터 전처리
X = data.drop('not.fully.paid', axis=1)
y = data['not.fully.paid']
X = pd.get_dummies(X)

# 학습 및 테스트 세트 분할
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42)

# 모델 선택 및 훈련
model = RandomForestClassifier()
model.fit(X_train, y_train)

# 모델 평가
y_pred = model.predict(X_test)
accuracy = accuracy_score(y_test, y_pred)
report = classification_report(y_test, y_pred)

print("Accuracy:", accuracy)
print("Classification Report:")
print(report)
  • 이 코드를 Google Colab에서 그대로 옮겨 실행해본 결과 :

성능 평가 결과

  • 정확도는 0.84였지만 자세히 보면 0(미상환)에 대한 성능은 좋은 편에 속하지만 반대로 1(상환)에 대한 성능은 매우 떨어지는 걸 확인할 수 있었다.
  • 왜 이렇게 차이가 나는지에 대해서 다시 질문을 해보았다.
더보기

네가 준 코드로 예측 모델을 실행해봤는데, 정확도는 0.84이지만, 1(상환)에 대한 성능은 precision이 0.38, recall은 0.02로 성능이 매우 안 좋았어. 반면 0(미상환)에 대한 성능은 precision이 0.84, recall이 0.99로 매우 좋은 편이야. 이 차이는 왜 발생한걸까?

  • ChatGPT의 답변 :
더보기

상환 여부에 대한 예측 모델에서 발생하는 이러한 차이는 데이터의 불균형 때문일 수 있습니다. 불균형한 데이터셋에서는 모델이 일반적으로 빈도가 높은 클래스에 대해 더 잘 작동하고, 드물게 발생하는 클래스에 대해서는 성능이 저하될 수 있습니다.

여기서는 '상환' 클래스(1)가 '미상환' 클래스(0)보다 훨씬 적으며, 이것이 모델이 '미상환' 클래스를 더 잘 예측하도록 편향되게 만들 수 있습니다.

Precision(정밀도)은 모델이 긍정으로 예측한 것 중에서 실제로 긍정인 비율을 나타내며, Recall(재현율)은 실제 긍정 중에서 모델이 올바르게 예측한 비율입니다. 여기서 Recall이 낮다는 것은 실제로 긍정인 케이스 대부분을 모델이 잘 포착하지 못했다는 것을 의미합니다.

이러한 문제를 해결하기 위한 몇 가지 방법이 있습니다:

  1. 데이터 샘플링: 불균형 데이터셋에서는 언더샘플링(클래스의 적은 수에 맞춰 다수 클래스 샘플을 제거) 또는 오버샘플링(적은 수의 클래스에 대해 샘플을 추가) 등의 샘플링 기법을 사용할 수 있습니다.
  2. 클래스 가중치: 일부 알고리즘(예: RandomForestClassifier)은 클래스에 대한 가중치를 지정하여 데이터의 불균형을 보상할 수 있습니다.
  3. 다른 평가 지표 사용: 정확도 외에도 F1 점수, ROC-AUC 등의 평가 지표를 고려하여 모델을 평가할 수 있습니다.

이러한 접근 방식 중 하나 또는 여러 가지를 시도하여 모델의 성능을 향상시킬 수 있습니다.

  • ChatGPT의 추측으로는, 클래스 불균형 때문에 이러한 성능 차이가 발생했을 수 있다는 것이다. 따라서 실제로 클래스 간의 빈도수 차이가 존재하는지 확인해본 결과, 0이 1보다 훨씬 많다는 것을 확인할 수 있었다.

불균형 확인

  • 확실히 데이터가 많은 0 클래스에 대해서는 성능이 좋고, 적은 1 클래스에 대해서는 성능이 좋지 않다는 것을 입증했다.
  • ChatGPT의 조언대로 언더샘플링이나 오버샘플링을 한 후에 다시 시도한다면 조금 더 나은 성능이 나오지 않을까 생각하여 해당 과정에 대한 코드를 요구했다.
  • 나의 프롬프트 :
더보기

아 확인해보니 실제로 0은 8045개이고, 1은 1533개 뿐이네. 그러면 데이터 불균형을 해결하고 다시 시도해보고 싶은데, 이에 대한 코드도 줄 수 있을까?

  • 이에 대한 ChatGPT의 답변 :
더보기

데이터 불균형을 해결하기 위해 오버샘플링 기법 중 하나인 SMOTE(Synthetic Minority Over-sampling Technique)를 사용하여 데이터를 증가시키는 방법을 사용할 수 있습니다. SMOTE는 소수 클래스 데이터를 샘플링하여 합성하여 두 클래스의 균형을 맞춥니다.

다음은 SMOTE를 사용하여 데이터를 증가시키고 RandomForestClassifier 모델을 다시 학습하는 코드입니다:

from imblearn.over_sampling import SMOTE
from sklearn.ensemble import RandomForestClassifier
from sklearn.metrics import accuracy_score, classification_report

# SMOTE를 사용하여 데이터 오버샘플링
smote = SMOTE(random_state=42)
X_resampled, y_resampled = smote.fit_resample(X_train, y_train)

# 모델 훈련
model = RandomForestClassifier()
model.fit(X_resampled, y_resampled)

# 모델 평가
y_pred = model.predict(X_test)
accuracy = accuracy_score(y_test, y_pred)
report = classification_report(y_test, y_pred)

print("Accuracy:", accuracy)
print("Classification Report:")
print(report)
  • 해당 코드로 다시 모델을 훈련한 결과는 다음과 같았다 :

SMOTE를 적용한 결과

  • 전체적인 정확도는 조금 떨어졌으나, 1(상환) 클래스에 대한 성능은 좋아진 모습을 확인할 수 있었다. 아직도 높은 성능은 아니지만 recall점수가 0.02 → 0.15로 증가했다.
  • 따라서 ChatGPT를 이용하여 수정 과정을 몇 번 거치면 첫 시도보다 더 좋은 질의 코드를 생성해낼 수 있다는 것을 직접 실습해볼 수 있었다. 유료버전의 편의성은 없지만 강사님이 유료버전으로 받으신 코드의 성능과 크게 다르지 않는 것 같다.

 


느낀점

이제는 미래에 No Code, Low Code의 시대가 올 것이고 무엇보다 이렇게 GenAI를 통하여 어느 정도 머신 러닝 모델링의 구색을 갖추는 것까지는 이미 가능한 일임을 직접 겪어보니 기분이 묘했다. 더 높은 성능은 당연히 사람이 수정을 해가며 피처 엔지니어링을 진행해야 하겠지만, 무료 버전으로도 저 정도의 성능을 이끌어낼 수 있다니 신기하기도 했다. GenAI를 꺼려하는게 아니라 오히려 더 친해져야만 업무에도 일상에서도 도움이 되겠구나란 생각이 든다.

+ Recent posts