TOP
본문 바로가기
📚 목차
자격증/빅데이터분석기사

[빅분기 실기] 작업형 2유형 : 다중 분류 실습

by 기록자_Recordian 2025. 5. 26.
728x90
반응형
이전 내용
 

[빅분기 실기] 작업형 2유형 : 이진 분류 실습 (feat. 가짜데이터)

이전 내용 [빅분기 실기] 작업형 2유형 : 머신러닝이전 내용 [빅분기 실기] 작업형 1유형 : 판다스 주요 문법 3이전 내용 [빅분기 실기] 작업형 1유형 : 판다스 주요 문법 2이전 내용 [빅분기 실기]

puppy-foot-it.tistory.com


[머신러닝 프로세스]
문제 정의 → 라이브러리/데이터 로드 → EDA → 데이터 전처리 → 데이터 분할 → 머신러닝 학습 및 평가 → 예측

 

다중 분류 실습

 

개인의 신용 정보 데이터를 통해 신용 등급을 예측해 본다.

  • label(target)은 신용 등급('Credit_Score'): 1, 2, 3
  • 머신러닝 모델은 RandomForest와 LightGBM 사용

◆ 라이브러리, 데이터셋 불러오기

import pandas as pd

train = pd.read_csv(train_url)
test = pd.read_csv(test_url)

다중 분류 실습: 탐색적 데이터 분석(EDA)

 

- 데이터 크기(shape) 확인: 행과 열 수

print(f"훈련 데이터: {train.shape}")
print(f"테스트 데이터: {test.shape}")

 

- 데이터 샘플 확인

train.head()

 

- 데이터 타입 확인

train.info()

▶ 10000 non-null 로 되어 있는 걸로 봐선 결측치는 없어 보인다.

또한, object 컬럼의 경우 인코딩이 필요하다 (원-핫 인코딩 또는 레이블 인코딩)

 

- object 컬럼의 unique 개수 확인

describe() 함수의 매개변수 include에 'O(또는 object)'를 전달해 주면 object 타입의 컬럼만 확인 가능하다.

train.describe(include='O')
test.describe(include='O')

 

- 결측치 확인

앞서 결측치가 없다는 것을 확인했으나, 다시 한 번 확인

print("결측치 확인")
print(f"훈련 데이터: {train.isnull().sum().sum()}")
print(f"테스트 데이터: {test.isnull().sum().sum()}")

 

- target인 'Credit_Score'의 값과 빈도수 확인

train['Credit_Score'].value_counts()

 

 


다중 분류 실습: 데이터 전처리 및 데이터 분할

 

target 컬럼을 target 이라는 변수에 옮겨두고, 자로형이 object인 컬럼명 확인

target = train.pop('Credit_Score')
cols = train.columns[train.dtypes == object] # 자료형이 object인 컬럼 확인
cols

 

- 원-핫 인코딩

앞서 언급했듯, target 데이터의 경우 자료형이 object 이므로, 인코딩을 해줘야 한다.

원-핫 인코딩을 진행한다.

data = pd.concat([train, test], axis=0)
data_oh = pd.get_dummies(data)
train_oh = data_oh.iloc[:len(train)].copy()
test_oh = data_oh.iloc[len(train):].copy()
print(train_oh.shape, test_oh.shape)

train과 test를 concat으로 위 아래로 붙인 다음, 원핫 인코딩을 진행

인코딩된 데이터 중 훈련 데이터를 iloc로 슬라이싱하여 train_oh 라는 변수에 대입하고, 테스트 데이터 역시 슬라이싱하여 test_oh라는 변수에 넣어준다.

 

★ 머신러닝을 통해 학습하고 예측할 때에는 train 컬럼과 test 컬럼이 반드시 일치해야 하므로, 매우 중요하다.

 

- 데이터 분할 (훈련, 검증)

훈련 데이터를 훈련 데이터와 검증 데이터로 분할(8:2) 한다.

from sklearn.model_selection import train_test_split
X_train, X_val, y_train, y_val = train_test_split(
    train_oh,
    target,
    test_size = 0.2,
    random_state = 42)

data_list = [X_train, X_val, y_train, y_val]

for data in data_list:
  print(data.shape)


머신러닝 학습 및 평가: 1. 랜덤포레스트 분류

 

- 머신러닝 학습

랜덤포레스트 분류를 통해 훈련 데이터를 훈련하고, 검증 데이터를 통해 예측해 본다.

from sklearn.ensemble import RandomForestClassifier

rf = RandomForestClassifier(random_state=42)
rf.fit(X_train, y_train) # 훈련
pred = rf.predict(X_val) # 예측

pred[:10]

 

- 예측 평가

※ 이진 분류와 다중 분류 모델 평가 차이 ※

항목 이진 분류 (Binary Classification) 다중 분류 (Multiclass Classification)
클래스 수 2개 (예: 스팸 vs 정상) 3개 이상 (예: 고양이, 개, 토끼)
정확도 (Accuracy) 사용 가능 사용 가능
정밀도 (Precision) 클래스 1 (양성) 기준으로 계산 각 클래스별로 계산 → 평균 필요
재현율 (Recall) 클래스 1 기준 각 클래스별로 계산 → 평균 필요
F1 점수 한 개의 F1 score 계산 클래스별 F1 계산 → 평균 필요
ROC AUC Score 단일 ROC 커브 사용 클래스별로 계산 (One-vs-One 또는 One-vs-Rest)
Confusion Matrix (혼동 행렬) 2x2 매트릭스 NxN 매트릭스 (N = 클래스 개수)
평균 방식 없음 또는 average='binary' average='macro', 'micro', 'weighted' 등 선택 필요
대표 평가 함수 precision_score(y_true, y_pred)recall_score()roc_auc_score() precision_score(..., average='macro') 등 average 인자 꼭 필요

 

from sklearn.metrics import accuracy_score, f1_score, precision_score, recall_score, roc_auc_score

# 평가하기
accuracy = accuracy_score(y_val, pred)
precision = precision_score(y_val, pred, average='macro')
recall = recall_score(y_val, pred, average='macro')
roc_auc = roc_auc_score(y_val, rf.predict_proba(X_val), multi_class='ovo')

metrics_list = [accuracy, precision, recall, roc_auc]

for metric in metrics_list:
  print(round(metric, 2))

 


머신러닝 학습 및 평가: 2. LightGBM

 

LightGBM 분류 모델의 경우 인코딩 없이 범주형 변수를 category 형으로만 변경해 주면 되며,

결측치 처리를 변환하지 않고 그대로 사용해도 LightGBM은 결측값 그 자체를 입력값으로 받는다.

import lightgbm as lgb

# 데이터 불러오기
train = pd.read_csv(train_url)
test = pd.read_csv(test_url)

# target 변수 생성
target = train.pop('Credit_Score')
cols = train.columns[train.dtypes == object]

# 데이터 전처리 (형변환)
train['Payment_of_Min_Amount'] = train['Payment_of_Min_Amount'].astype('category')
train['Credit_Mix'] = train['Credit_Mix'].astype('category')
train['Payment_Behaviour'] = train['Payment_Behaviour'].astype('category')

test['Payment_of_Min_Amount'] = test['Payment_of_Min_Amount'].astype('category')
test['Credit_Mix'] = test['Credit_Mix'].astype('category')
test['Payment_Behaviour'] = test['Payment_Behaviour'].astype('category')

 

- 데이터 분할 및 훈련

'verbose=-1' 은 로그가 출력되지 않게 설정하기 위한 값이다.

# 데이터 분할(검증, 훈련)
X_train, X_val, y_train, y_val = train_test_split(
    train,
    target,
    test_size = 0.2,
    random_state=42)

# 머신러닝 훈련(LightGBM)
lgbmc = lgb.LGBMClassifier(random_state=42, verbose=-1) # verbose=-1: 로그 미출력
lgbmc.fit(X_train, y_train)
pred = lgbmc.predict(X_val)
pred

 

- 평가하기

# 평가하기
accuracy = accuracy_score(y_val, pred)
precision = precision_score(y_val, pred, average='macro')
recall = recall_score(y_val, pred, average='macro')

metrics_list = [accuracy, precision, recall, roc_auc]

for metric in metrics_list:
  print(round(metric, 2))

 

랜덤포레스트분류와 성능은 비슷한 편으로 보인다.


테스트 데이터 예측

 

predict_proba: 확률 예측 (x일 확률: 0.x)

predict: 클래스 예측 (1, 2, 3)

 

- LightGBM 예측

pred = lgbmc.predict(test)
pred

 

- 랜덤포레스트 분류 예측

rf_pred = rf.predict(test_oh)
rf_pred

 

 

- 예측을 데이터프레임으로 만들기

lgb_result = pd.DataFrame({'pred':pred})
lgb_result

rf_result = pd.DataFrame({'rf_pred': rf_pred})
rf_result

 

 


다음 내용

 

[빅분기 실기] 작업형 2유형 : 회귀 실습

이전 내용 [빅분기 실기] 작업형 2유형 : 다중 분류 실습이전 내용 [빅분기 실기] 작업형 2유형 : 이진 분류 실습 (feat. 가짜데이터)이전 내용 [빅분기 실기] 작업형 2유형 : 머신러닝이전 내용 [빅분

puppy-foot-it.tistory.com

728x90
반응형