KT AIVLE/데이터 분석, ML, DL

[KT AIVLE DX 트랙 7기] 회귀학습 & 분류학습

Dori1998 2025. 4. 13. 14:27

KT 에이블스쿨 7기 DX 트랙에 기자단으로 신청하기도 하였고, 복습을 통한 역량을 강화, 습득을 목적으로 작성되었음을 알려드립니다.

 

그럼, 복습 Let's go

 


회귀 학습

- 종속 변수가 연속형 데이터일 때 사용하는 지도 학습 방법

- 즉, 숫자로 된 값을 예측하는 모델을 만들 때 활용합니다.

 

회귀 학습의 특징

- 출력값(정답, 목표 변수)이 연속형 데이터

- 예측값이 숫자로 표현됨

- 데이터의 패턴을 분석하여 연속적인 값을 예측

 

회귀의 예시

문제 입력 데이터
(X)
출력 데이터
(Y, 예측값)
집값 예측 면적, 위치, 방 개수 집값 (원)
키 예측 부모 키, 영양 상태 키(cm)
기온 예측 날짜, 습도, 기압 기온

 

대표적인 회귀 모델

선형 회귀(Linear Regression)
결정 트리 회귀(Decision Tree Regression)
랜덤 포레스트 회귀(Random Forest Regression)

 

회귀 모델의 종류

- 회귀 모델은 연속적인 숫자 값 (예 : 집값, 온도, 매출 등)을 에측하는 모델

- 회귀 모델은 입력 변수와 출력 변수 간의 관계를 수학적으로 모델링하는 방식에 따라 다양한 유형이 존재

 

① 선형 회귀 (Linear Regression)

 - 가장 기본적인 회귀 모델로, 입력 변수와 출력 변수 간의 선형 관계를 가정합니다.

 - 출력값 Y는 입력 변수 X와 가중치 W, 절편 b 의 조합으로 표현됨

 - Y = WX + b

 

② 릿지 회귀 (Ridge Regression, L2 Regularization)

 - L2 정규화(Regularzation)를 적용하여 가중치를 작게 만들어 과적합 방지

 - 예시 : 고차원 데이터에서 회귀 모델 적용

 

③ 라쏘 회귀 (Lasso Regression, L1 Regularization)

 - L1 정규화를 사용하여 불필요한 특성의 가중치를 만듦

 - 예시 : 특성 선택이 중요한 데이터 셋에서 사용합니다.

 

회귀 모델의 성능 평가지표

회귀 모델의 성능 평가 종류 정의 장점 단점
MAE (Mean Absolute Error) - 실제 값과 예측값의 차이를 절댓값으로 변환해 평균한 것
- 이상치가 많은 경우에 주로 사용
- 직관적
- 정답 및 예측 값과 같은 단위를 가짐
- 실제 정답보다 낮게 예측했는지, 높게 했는지를 파악하기 힘듦
- 스케일 의존적임 : 모델마다 에러 크기가 동일해도 에러율은 동일하지 않음
MSE (Mean Squared Error) - 실제값과 예측값의 차이를 제곱해 평균한 것 - 직관적 - 제곱하기 때문에 1미만의 에러는 작아지고, 그 이상의 에러는 커짐
- 실제 정답보다 낮게 예측했는지, 높게 했는지를 파악하기 힘듦
- 스케일 의존적임 : 모델마다 에러크기가 동일해도 에러율은 동일하지 않음
RSME (Root Mean Squared Error) - MSE값은 오류의 제곱을 구하므로, 실제 오류의 평균보다 값이 더 커지는 특성이 있음
- 단점 보완을 위해 MSE에 루트를 씌운 것
→ sklearn에서 제공하지 않았지만, 1.4 이상 버전부터 지원
- 직관적 - 제곱하지 때문에 1미만의 에러는 작아지고, 그 이상의 에러는 커짐
- 실제 정답보다 낮게 예측했는지, 높게 했는지를 파악하기 힘듦
- 스케일 의존적임 : 모델마다 에러 크기가 동일해도 에러율은 동일하지 않는다.

hippo's data의 회귀 모델 정리

머신러닝 학습 프로세스

데이터 수집
(Data Collection)
- 분석에 필요한 원천 데이터를 확보하는 단계
- 파일(CSV, Excel), 데이터베이스, API, 웹 크롤링 등 다양한 경로에서 수집
- 머신러닝의 성능은 데이터의 질과 양에 크게 좌우됨
데이터 탐색 및 전처리
(EDA & Preprocessing)
- 데이터의 구조, 타입, 분포, 이상치, 결측값 등을 파악
- 필요 없는 컬럼 제거, 결측값 처리, 인코딩, 스케일링 등 데이터 정제 수행
- 모델 학습에 적합한 형식으로 데이터를 준비하는 핵심 단계
데이터 분할
(Train / Test Split)
- 전체 데이터를 학습용(Train)과 테스트용(Test)으로 나눔
- 모델이 훈련 데이터에 과적합되지 않고, 일반화되었는지 확인하는 데 필수
- 일반적으로 7:3 또는 8:2 비율 사용
모델 선택 및 학습
(Model Training)
- 문제 유형(회귀, 분류 등)에 맞는 알고리즘 선택
- 학습 데이터를 기반으로 모델이 입력과 출력 간의 패턴을 학습
- 선형 회귀, 결정 트리, SVM, 랜덤 포레스트 등 다양한 모델 사용 가능
예측 및 평가
(Prediction & Evaluation)
- 테스트 데이터로 모델의 성능을 검증
- 회귀 문제 : MAE, MSE, RMSE, R²
- 분류 문제 : Accurary, Precision, Recall, F1-score 등 평가 지표 활용

 

순서가 매우 헷갈렸으므로 자세히 풀겠습니다.

display(df[df.duplicated(keep = False])
df = df.drop_duplicates()

회귀문제

데이터 전처리 중복된 데이터를 확인하고 삭제 display(      df[df.duplicated(keep = False)]       )
df = df.drop_duplicates()
결측치 여부 확인 # bmi 결측치 평균값으로 채우기

df['bmi'].fillna(  df['bmi'].mean(),   inplace = True)
df.isnull().sum()
범주형 데이터 수치화 : Label Encoder
- 모든 범주형 컬럼의 이름을 시퀀스 구성하여 반복하여 수치화 진행
# 범주형 데이터를 sklearn.preprocessing import LabelEncoder 이용해서 수치화

from sklearn.preprocessing import LabelEncoder
col_lst = ['sex', 'smoker', 'region']

for col in col_lst :
    encoder = LabelEncoder()
    df[col] = encoder.fit_transform (df[col])
MinMaxScaler를 적용하여 정규화 from sklearn.preprocessing import MinMaxScaler

scaler = MinMaxScaler()
df_scaled = scaler.fit_transform(df)

 

bmi 결측치 평균값으로 채우기

모델 선택 설명 코드
LinearRegression() - 회귀 모델 중에서 LinearRegression 모델을 선택합니다.
- LinearRegression 모델은 sklearn.linear_model에 있습니다.
from sklearn.linear_model import LinearRegression

model = LinearRegression()
model.fit(x_train, y_train)
- 학습된 회귀 모델의 성능 평가하기 위해 테스트 데이터로 예측합니다.
- 회귀 모델의 성능을 평가합니다.
- 성능 평가 지표는 mae, mse를 활용하여 비교합니다.
# 예측하기
pred = model.predict(x_test)

# 필요한 모듈을 import 하고 성능 평가지표 적용하기
from sklearn.metrics import mean_squared_error,
mean_absolute_error

mae = mean_absolute_error(y_test, pred)
mse = mean_squared_error(y_test, pred)

print('mae : ', mae)
print('mse : ', mse)
RandomForestRegressor() - 회귀 모델 중에서 RandomForestRegressor 모델을 선택한다.
- RandomForestRegressor 모델은 sklearn.ensemble에 있습니다.
from sklearn.ensemble import RandomForestRegressor

model = RandomForestRegressor()

model.fit(x_train, y_train)
- 학습된 회귀 모델의 성능 평가하기 위해 테스트 데이터로 예측한다.
- 성능 평가 지표는 mae, mse를 활용하여 비교한다.
# 예측하기
pred = model.predict(x_test)

# 필요한 모듈을 import 하고, 성능 평가지표 적용하기
from sklearn.metrics import mean_squared_error,
mean_absolute_error

mae = mean_absolute_error(y_test, pred)
mse = mean_squared_error(y_test, pred)

print('mae : ', mae)
print('mse : ', mse)
Ridge() - 회귀 모델 중에서 Ridge 모델을 선택합니다.
- Ridge 모델은 sklearn.linear_model에 있습니다.
from sklearn.linear_model import LinearRegression

model = LinearRegression()
model.fit(x_train, y_train)
- 학습된 회귀 모델의 성능 평가하기 위해 테스트 데이터로 예측합니다.
- 회귀 모델의 성능을 평가합니다.
- 성능 평가 지표는 mae, mse를 활용하여 비교합니다.
# 예측하기
pred = model.predict(x_test)

# 필요한 모듈을 import하고 성능 평가지표 적용하기
from sklearn.metrics import mean_squared_error,
mean_absolute_error

mae = mean_absolute_error(y_test, pred)
mse = mean_squared_error(y_test, pred)

print('mae : ', mae)
print('mse : ', mse)
Lasso() - 회귀 모델 중에서 Lasso 모델을 선택합니다.
- Lasso 모델은 sklearn.linear_model에 있습니다.
from sklearn.linear_model import LinearRegression

model = LinearRegression()
model.fit(x_train, y_train)
- 학습된 회귀 모델의 성능 평가하기 위해 테스트 데이터로 예측합니다.
- 회귀 모델의 성능을 평가합니다.
- 성능 평가 지표는 mae, mse를 활용하여 비교하겠습니다.
# 예측하기
pred = model.predict(x_test)

# 필요한 모듈을 import 하고 성능 평가지표 적용하기
from sklearn.metrics import mean_squared_error,
mean_absolute_error

mae = mean_absolute_error(y_test, pred)
mse = mean_squared_error(y_test, pred)

print('mae : ', mae)
print('mse : ', mse)

 

정리하자면?

회귀 모델이란?

 - 회귀(Regression) : 입력 데이터를 기반으로 숫자(연속형 값)를 예측하는 모델

 - 예시 : 집값 예측, 보험료 예측, 수요량 예측 등

 - 대표 모델 : 선형 회귀 (Linear Regression)

 

회귀 모델의 성능 평가 지표

 - MAE(Mean Absolute Error) : 평균 절대 오차

 - MSE(Mean Squared Error) : 평균 제곱 오차

 - RMSE(Root Mean Squared Error) : 제곱 오차의 제곱근

 

분류(Classification) 학습

특징

 - 출력값(정답, 목표 변수)이 범주형 데이터

 - 입력 데이터가 어느 그룹(클래스)에 속하는지 예측

 - 다중 클래스 문제(여러 개의 카테고리)도 가능

 

분류의 예시

문제 입력 데이터
(x)
출력 데이터
(y, 예측값)
스팸 이메일 분류 이메일 제목, 본문 스팸 / 정상
암 진단 환자의 건강 데이터 암 / 정상
고객 유형 분류 나이, 소비 패턴 VIP / 일반 / 신규 고객

 

대표적인 분류 모델

로지스틱 회귀 (Logistic Regression) - 출력값이 0 또는 1 (이진 분류) 혹은 여러 개의 클래스 (다중 분류)로 나뉜다.
- 시그모이드 함수 (Sigmoid Function)를 사용하여 확률 값으로 변환
의사결정 트리 (Decision Tree) - 데이터를 여러 개의 규칙을 기반으로 나누어 예측한다.
- 과적합 위험이 높음
랜덤 포레스트 (Random Forest) - 여러 개의 의사결정트리를 조합하여 예측
- 과적합 방지 기능
XGboost - 여러 개의 약간 분류 모델을 조합하여 강력한 모델을 만든다.
- XGBoost, LightGBM, CatBoost 등의 알고리즘 포함

 

분류 모델의 성능 평가

 - 분류 모델의 성능 평가 지표

혼동 행렬, 오차 행렬 (Confusion Matrix) - 분류의 예측 범주와 실제 데이터의 분류 범주를 교차 표 (Cross Table) 형태로 정리한 행렬이진 분류의 예측 오류가 얼마인지와 더불어 어떠한 유형의 예측 오류가 발생하고 있는지를 함께 나타냄



- TP : 모델이 True 라고 예측했는데, 실제로 정답이 True 인 경우
- TN : 모델이 거짓이라고 예측했는데, 실제로 정답이 거짓인 경우
- FN : 모델이 거짓이라고 예측했는데, 실제로 정답이 참인 경우
- FP : 모델이 참이라고 예측했는데, 실제로 정답이 거짓인 경우
정확도 (Accuracy)

Accurary
= TP + TN / TP + TN + FP + FN
- 모델이 전체 모델 중에서 정답을 맞춘 피율
- 0과 1사이의 값을 가지며, 1에 가까울수록 좋음
- 하지만 정확도를 분류 모델의 평가 지표로 사용할 때는 주의해야 한다. 특히, 불균형한 데이터의 경우에 정확도는 적합한 평가지표가 아님

재현율 (Recall) = 민감도 (Recall)

Recall
= TP / TP + TN
- 실제로 정답이 positive 인 것들 중에서 모델이 positive라고 예측한 경우
- 실제 정답이 positive인 데이터를 negative라고 잘못 예측하면 안 되는 경우에 중요한 지표가 될 수 있음
- Recall를 높이기 위해선 FN(모델이 negative라고 예측했는데, 정답이 positive인 경우)을 낮추는 것이 중요하다.
정밀도 (Precision) - 모델이 positive 라고 예측한 것들 중에서 실제로 정답이 positive인 비율
- 실제 정답이 negative인 데이터를 positive라고 잘못 예측하면 안 되는 경우에 중요한 지표가 될 수 있음
- Precision을 높이기 위해선 FP(모델이 positive라고 예측했는데 정답은 negative인 경우)를 낮추는 것이 중요하다.

 

머신러닝 분류 학습 프로세스

데이터 수집 분석에 필요한 원천 데이터를 확보하는 단계
파일 (CSV, Excel), 데이터베이스, API, 웹 크롤링 등 다양한 경로에서 수집
머신러닝의 성능은 데이터의 질과 양에 크게 좌우된다.
데이터 탐색 및 전처리 데이터의 구조, 타입, 분포, 이상치, 결측값 등을 파악한다.
필요 없는 컬럼 제거, 결측갑 처리, 인코딩, 스케일링 등 데이터 정제 수행
모델 학습에 적합한 형식으로 데이터를 준비하는 단계
데이터 분할 전체 데이터를 학습용 (Train)과 테스트 용(Test) 용으로 나눔
모델이 훈련 데이터에 과적합되지 않고, 일반화되었는지 확인하는 데 필수
일반적으로 7:3, 8:2 비율 사용
모델 선택 및 학습 문제 유형(회귀, 분류 등) 에 맞는 알고리즘 선택
학습 데이터를 기반으로 모델이 입력과 출력 간의 패턴을 학습
선형 회귀, 결정 트리, SVM, 랜덤 포레스트 등 다양한 모델 사용 가능
예측 및 평가 테스트 데이터로 모델의 성능을 검증
회귀 문제 : MAE, MSE, RMSE, R²
분류 문제 : Accuracy, Precision, Recall, F1-score 등 평가 지표 활용

 

데이터 전처리 from sklearn.preprocessing import LabelEncoder
from sklearn.preprocessing import StandardScaler

x = x.iloc[ :, 1: ]
y = y.iloc[ : , -1 ]

x.isnull.sum() # 결측치 확인

x['환불금액'].fillna(0, inplace = True) # 결측치를 0으로 채우고, 학습에 저장

col_lst = ['주구매상품', '주구매지점']

for col in col_lst
    encoder = LabelEncoder()
    x[col] = encoder.fit_transform(x[col])

x.head()
학습 / 테스트 나누기 from sklearn.model_selection import train_test_split

x_train, x_test, y_train, y_test = train_test_split(x, y, test_size = 0.2, random_state = 42)

# 각 데이터에 표준화를 적용하여 데이터의 스케일(크기 차이)를 맞춰준다.
# 평균을 0, 표준편차를 1로 맞춰서 데이터가 정규 분포 형태로 변환되도록 한다.

cols = ['총구매액', '최대구매액', '환불금액', '내점일수', '내점당구매건수', '주말방문비율', '구매주기']
scaler = StandardScaler()
scaler.fit( x_train[cols]  )

x_train[cols] = scaler.transform(x_train[cols])
x_test[cols] = scaler.transform(x_test[cols])

x_train.head()

 

왜 train에만 fit하고, transform 변환 작업은 train, text 둘 다 해줄까?

- scaler.fit()은 반드시 훈련 데이터에만 적용하여, 데스트 데이터에는 transform()만을 적용하여 변환된 값을 얻어야 한다. 이렇게 함으로써 모델의 편향을 방지하고, 평가의 신뢰성을 유지한다. 이렇게 해서 실제 운영 환경을 잘 모방할 수 있다.

 

transform을 둘 다 적용하는 이유는?

- 동일한 변환 기준을 적용하기 위해서, 모델 성능을 최적화, 모델 해석과 운영 환경의 일관성을 위해 transform은 둘 다 적용해준다.

따라서, scaler.fit()은 학습 데이터에만 적용하고, transform()은 학습 데이터와 테스트 데이터 모두에 적용하는 것이 일반적이다.

 

LogisticRegression 1. 모델링

# 1. 불러오기
from sklearn.linear_model import LogisticRegression

# 2. 선언하기
model = LogisticRegression

# 3. 학습하기
model.fit(x_train, y_train)
예측 성능 확인해보기
- 학습시킨 모델의 성능을 알아본다.
- 각 평가지표로 모델의 성능을 수치화하여 확인한다.
- 필요한 라이브러리를 import하고 성능을 확인해본다.
(정확도, 정밀도, 재현율, f1, confusion_matrix)

# 테스트 데이터 예측하기
pred = model.predict(x_test)

# 테스트 데이터 예측하기
from sklearn.metrics import accuracy_score, precision_score, recall_score, f1_score
from sklearn.metrics import confusion_matrix

confusion = confusion_matrix(y_test, pred)
accuracy = accuracy_score (y_test, pred)
precision = precision_score (y_test, pred)
recall = recall_score (y_test, pred)
f1 = f1_score(y_test, pred)
DecesionTreeclassifire # 1. 불러오기
from sklearn.tree import DecisionTreeClassifier

# 2. 선언하기
model = DecisionTreeClassifier(max_depth = 10)

# 3. 학습하기
model.fit(x_train, y_train)
학습된 모델로 테스트 데이터에 대한 예측을 수행한다.
- 학습시킨 모델의 성능을 알아본다.
- 각 평가지표로 모델의 성능을 수치화하여 확인한다.
- 필요한 라이브러리를 import하고 성능을 확인해본다.

# 테스트 데이터 예측하기
pred = model.predict(x_test)

# 평가지표 확인
from sklearn.metrics import accuracy_score, precision_score, recall_score, f1_score
from sklearn.metrics import confusion_matrix

confusion = confusion_matrix(y_test, pred)
accuracy = accuracy_score (y_test, pred)
precision = precision_score (y_test, pred)
recall = recall_score (y_test, pred)
f1 = f1_score(y_test, pred)
RandomForestClassfier # 불러오기
from sklearn.linear_model import RandomForestClassfier

# 선언하기
model = RandomForestClassfier()

# 학습하기
model.fit(x_train, y_train)
# 테스트 데이터 예측하기 
pred = model.predict(x_test)

# 평가지표 확인

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

confusion = confusion_matrix(y_test, pred)
accuracy = accuracy_score (y_test, pred)
precision = precision_score (y_test, pred)
recall = recall_score (y_test, pred)
f1 = f1_score(y_test, pred)