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미만의 에러는 작아지고, 그 이상의 에러는 커짐 - 실제 정답보다 낮게 예측했는지, 높게 했는지를 파악하기 힘듦 - 스케일 의존적임 : 모델마다 에러 크기가 동일해도 에러율은 동일하지 않는다. |
머신러닝 학습 프로세스
데이터 수집 (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) |
모델 선택 | 설명 | 코드 |
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) |
'KT AIVLE > 데이터 분석, ML, DL' 카테고리의 다른 글
[KT AIVLE 스쿨 7기] 딥러닝 (0) | 2025.04.16 |
---|---|
[KT AIVLE DX 트랙 7기] 인공지능과 머신러닝 (0) | 2025.04.13 |
[KT AIVLE DX 트랙 7기] 인공지능과 머신러닝 (1) | 2025.04.09 |
[KT AIVLE DX 트랙 7기] 가설검증 & 이변량 분석과 시각화 (0) | 2025.04.06 |
[KT AIVLE DX 트랙 7기] 단변량 분석과 시각화 (0) | 2025.04.06 |