머신러닝 : 데이터 전처리부터 모델링과 평가까지

2026. 6. 18. 21:58·TIL/머신러닝

머신러닝 데이터 전처리부터 모델링과 평가까지 정리하기

 

- 인코딩, 스케일링, 다중공선성, 회귀·분류 모델 평가 지표까지 -

👁‍🗨 글의 목적
 이 글은 머신러닝 실습에서 자주 등장하는 데이터 전처리, 데이터 분할, 회귀분석, 분류 모델, 평가 지표를 하나의 흐름으로 정리한 글이다. 머신러닝 모델링은 단순히 모델을 불러와 학습시키는 작업이 아니라, 데이터를 모델이 이해할 수 있는 형태로 바꾸고, 훈련 데이터와 테스트 데이터를 나누며, 문제 유형에 맞는 모델과 평가 지표를 선택하는 전체 과정이다.
목차
  • 1. 머신러닝 모델링의 전체 흐름
  • 2. 데이터 전처리의 의미
  • 3. 인코딩: 범주형 데이터를 숫자로 변환하기
  • 4. 스케일링: 변수의 단위와 범위 맞추기
  • 5. fit, transform, fit_transform의 차이
  • 6. 다중공선성과 과적합
  • 7. 다중공선성 제거 방법
  • 8. 데이터 분할
  • 9. 회귀분석과 선형회귀
  • 10. 회귀 모델 성능 평가
  • 11. 다중 선형회귀
  • 12. 분류 모델과 로지스틱 회귀
  • 13. 분류 모델 성능 평가
  • 14. Precision-Recall Trade-off
  • 15. ROC Curve와 AUC
  • 16. Macro Average와 Weighted Average
  • 17. 전체 정리

1. 머신러닝 모델링의 전체 흐름

 머신러닝 모델링은 모델 클래스를 불러오고 fit()을 실행하는 것만으로 끝나지 않는다. 모델이 학습할 수 있는 데이터 형태를 만들고, 학습과 평가가 섞이지 않도록 데이터를 나누고, 문제 유형에 맞는 알고리즘과 평가 지표를 선택해야 한다.

일반적인 머신러닝 프로세스 데이터 수집 → 데이터 전처리 → EDA → 모델링 및 평가 → 배포

데이터 수집, 데이터 전처리, EDA, 모델링 및 평가, 배포로 이어지는 머신러닝 프로세스

 이 흐름에서 데이터 전처리는 모델링의 출발점이다. 실제 데이터는 결측치, 문자형 범주, 서로 다른 단위, 이상치, 높은 상관관계 변수 등을 포함하는 경우가 많다. 이런 상태의 데이터를 그대로 모델에 넣으면 모델이 제대로 학습하지 못하거나, 성능 평가 결과가 왜곡될 수 있다.

🔍 제조·품질 데이터 관점
 제조 데이터에서는 온도, 압력, 진동, 두께, 불량 여부, 설비 ID, 작업조, 제품 등급처럼 다양한 형태의 변수가 함께 존재한다. 따라서 범주형 변수는 인코딩하고, 센서값처럼 단위가 다른 변수는 스케일링하며, 불량 탐지처럼 클래스 불균형이 있는 문제에서는 정확도만이 아니라 재현율, F1 Score, Macro Average까지 함께 확인해야 한다.

2. 데이터 전처리의 의미

 데이터 전처리는 모델 학습 전에 데이터를 적절한 형태로 변환하는 과정이다. 머신러닝 모델은 기본적으로 숫자 데이터를 입력으로 받기 때문에 문자형 범주 데이터는 숫자로 바꾸어야 한다. 또한 변수마다 단위 차이가 크다면 특정 변수의 영향력이 과도하게 커질 수 있으므로 스케일을 맞춰야 한다. 대표적인 데이터 전처리 과정은 인코딩, 스케일링, 다중공선성 처리로 나눌 수 있다.

전처리 항목 목적 대표 방법 주의점
인코딩 문자형 범주를 숫자로 변환한다. One-Hot Encoding,
Label Encoding
순서 없는 범주에 Label Encoding을 적용하면 잘못된 크기 관계가 생길 수 있다.
스케일링 변수의 단위와 범위를 맞춘다. StandardScaler,
MinMaxScaler
스케일러는 훈련 데이터에만 fit하고 테스트 데이터에는 transform만 적용해야 한다.
다중공선성 처리 독립 변수 간 강한 상관관계를 줄인다. VIF, 상관계수, PCA 예측 목적과 해석 목적에 따라 처리 필요성이 달라진다.

3. 인코딩 : 범주형 데이터를 숫자로 변환하기

 인코딩은 범주형 데이터를 숫자로 변환하는 과정이다. 범주형 데이터는 숫자처럼 연속적인 값이 아니라 특정 범주나 이름으로 표현되는 데이터다. 성별, 지역, 혈액형, 제품등급, 불량 여부처럼 의미 있는 그룹으로 구분되는 값이 여기에 해당한다.

컬럼 이름 값 설명
성별 남, 여 두 개의 범주
지역 서울, 부산, 대전 세 개의 지역 카테고리
혈액형 A, B, AB, O 네 개의 범주
제품등급 상, 중, 하 순서 있는 범주
불량 여부 양품, 불량품 두 개의 범주
 머신러닝 모델은 문자열을 그대로 학습하지 못한다. 따라서 성별, 지역, 혈액형, 제품등급, 불량 여부 같은 범주형 데이터는 모델이 계산할 수 있는 숫자 형태로 변환해야 한다.

3.1 One-Hot Encoding

 One-Hot Encoding은 순서가 없는 범주형 변수를 다룰 때 가장 안전하고 많이 사용하는 방법이다. 각 범주를 새로운 열로 만들고, 해당 범주이면 1, 아니면 0으로 표시한다.

One-Hot Encoding 예시 A → [1, 0, 0], B → [0, 1, 0], O → [0, 0, 1]

 One-Hot Encoding은 성별, 혈액형, 지역처럼 순서가 없는 범주형 변수에 적합하다. 범주 사이에 크고 작음의 관계를 주고 싶지 않을 때 사용한다. pandas에서는 get_dummies()를 사용해 쉽게 적용할 수 있다.

import pandas as pd

# 1. 샘플 데이터프레임 생성
df = pd.DataFrame({
    "name": ["Alice", "Bob", "Charlie", "David"],
    "blood_type": ["A", "B", "O", "AB"]
})

print("원본 데이터:")
print(df)

# 2. One-Hot Encoding 적용
df_encoded = pd.get_dummies(df, columns=["blood_type"])

print("\nOne-Hot Encoding 결과:")
print(df_encoded)

 One-Hot Encoding은 범주 사이에 임의의 순서를 부여하지 않는다는 장점이 있다. 하지만 범주 개수가 많으면 컬럼 수가 급격히 늘어난다. 예를 들어 A부터 Z까지 26개 범주가 있으면 26개의 새로운 컬럼이 생성된다. 제조 데이터에서 설비 ID, Lot ID, 제품 코드처럼 범주 수가 매우 많은 변수는 One-Hot Encoding 적용 전에 범주 수와 데이터 희소성을 함께 확인해야 한다.

3.2 Label Encoding

 Label Encoding은 문자형 데이터를 정수로 변환하는 방법이다. 각 범주에 고유한 숫자를 부여한다.

Label Encoding 예시 불만 → 0, 보통 → 1, 만족 → 2 / 불량품 → 0, 양품 → 1

 Label Encoding은 low < medium < high, 초급 < 중급 < 고급, 하 < 중 < 상처럼 순서가 명확한 변수에 적합하다. 또한 Random Forest, XGBoost 같은 트리 기반 모델에서는 범주형 변수를 정수로 바꾸어도 선형 모델보다 왜곡이 상대적으로 작을 수 있다.

❗ 주의할 점
 순서가 없는 범주에 Label Encoding을 적용하면 모델이 잘못된 크기 관계를 학습할 수 있다. 예를 들어 혈액형을 A=0, B=1, O=2로 변환하면 모델은 O가 A보다 크다고 해석할 수 있다. 혈액형처럼 순서가 없는 범주에는 One-Hot Encoding을 사용하는 것이 일반적으로 더 안전하다.
import pandas as pd
from sklearn.preprocessing import LabelEncoder

# 예시 데이터
df = pd.DataFrame({
    "name": ["Alice", "Bob", "Charlie", "David"],
    "satisfaction": ["만족", "보통", "보통", "불만"]
})

print("원본 데이터:")
print(df)

# Label Encoding
le = LabelEncoder()

# 데이터를 학습한다.
le.fit(df["satisfaction"])

print("\n# le.classes_ 확인")
print(le.classes_)

# 데이터를 변환한다.
df["satisfaction_encoded"] = le.transform(df["satisfaction"])

# fit과 transform을 동시에 수행할 수도 있다.
# df["satisfaction_encoded"] = le.fit_transform(df["satisfaction"])

print("\nLabel Encoding 결과:")
print(df)

 LabelEncoder는 scikit-learn에서 가져와 객체로 선언해야 한다. fit()으로 데이터를 학습하고, transform()으로 실제 변환을 수행한다.

LabelEncoder 사용 흐름
le = LabelEncoder()
le.fit(df["satisfaction"])
df["satisfaction_encoded"] = le.transform(df["satisfaction"])

 다만 LabelEncoder는 데이터를 학습할 때 중복을 제거한 고유값을 정렬한 뒤 0부터 숫자를 부여한다. 원하는 순서가 명확하다면 직접 매핑하는 방식이 더 안전하다.

mapping = {
    "불만": 0,
    "보통": 1,
    "만족": 2
}

df["satisfaction_encoded"] = df["satisfaction"].map(mapping)

print(df)

 

4. 스케일링: 변수의 단위와 범위 맞추기

 스케일링은 수치형 데이터의 단위, 즉 스케일을 맞추는 전처리 과정이다. 머신러닝 모델은 입력 변수들의 크기 차이에 민감할 수 있다. 스케일이 크거나 단위가 다른 변수가 있으면 모델이 특정 변수에 편향되어 학습할 수 있다. 예를 들어 키와 연봉을 동시에 사용하는 모델을 생각해 보자.

키(cm) : 160~190 / 연봉(만원): 1,000~10,000

 키의 최대값과 최소값 차이는 약 30이지만, 연봉의 차이는 9,000이다. 이 상태로 모델에 넣으면 모델은 연봉을 훨씬 큰 영향력을 가진 변수처럼 학습할 수 있다. 특히 SVM, KNN, PCA, 선형 모델처럼 거리나 계수 크기에 민감한 모델에서는 스케일링이 중요하다.

4.1 StandardScaler

 StandardScaler는 각 값을 평균 0, 표준편차 1이 되도록 변환한다. 이를 표준화라고 한다.

StandardScaler 공식
z = (x - μ) / σ
x : 원본 값
μ : 전체 데이터의 평균
σ : 전체 데이터의 표준편차
z : 표준화된 값

예를 들어 원본 값이 5, 평균이 2, 표준편차가 1이라면 표준화된 값은 3이다.

z = (5 - 2) / 1 = 3

 

StandardScaler가 원본 값을 평균 0, 표준편차 1이 되도록 하는 표준화 예시

 StandardScaler는 데이터가 정규분포에 가깝거나 대칭적일 때, 분포 모양은 유지하면서 중심을 0으로 옮기고 크기를 1로 맞추고 싶을 때 사용한다. 선형 모델, SVM, KNN, PCA 등 스케일에 민감한 모델에서도 자주 사용된다.

from sklearn.preprocessing import StandardScaler

# 예시 데이터: 5개의 샘플, 2개의 특성
X_train = [
    [1, 2],
    [3, 4],
    [5, 6],
    [7, 8],
    [9, 10]
]

# StandardScaler 초기화
scaler = StandardScaler()

# 데이터 표준화
X_train_scaled = scaler.fit_transform(X_train)

print(X_train_scaled)

 StandardScaler는 평균과 표준편차를 사용하기 때문에 이상치가 있으면 평균과 표준편차가 흔들릴 수 있다. 따라서 이상치가 많은 데이터에서는 표준화 전에 이상치 탐지나 RobustScaler 같은 대안을 검토할 필요가 있다.

4.2 MinMaxScaler

 MinMaxScaler는 각 값을 0과 1 사이로 변환한다. 이를 정규화라고 한다. 최솟값은 0, 최댓값은 1이 되며 나머지 값은 그 사이의 상대적인 위치로 변환된다.

MinMaxScaler 공식 : x' = (x - x_min) / (x_max - x_min)

 

MinMaxScaler가 원본 값을 0~1 범위로 압축하는 정규화 예시 이미지

 MinMaxScaler는 값의 범위를 일정하게 맞춰야 할 때, 데이터 분포가 정규분포가 아닐 때, 입력값을 0~1 범위로 제한하고 싶을 때 유용하다. 다만 이상치가 하나라도 있으면 전체 범위가 늘어나고 나머지 값들이 좁은 구간으로 압축될 수 있다.

from sklearn.preprocessing import MinMaxScaler

# 예시 데이터: 5개의 샘플, 2개의 특성
X_train = [
    [1, 2],
    [3, 4],
    [5, 6],
    [7, 8],
    [9, 10]
]

# MinMaxScaler 초기화
scaler = MinMaxScaler()

# 데이터 정규화
X_train_scaled = scaler.fit_transform(X_train)

print(X_train_scaled)

4.3 SVM과 스케일링

 SVM(Support Vector Machine)은 feature의 scale에 민감한 모델이다. SVM은 데이터 포인트 사이의 거리와 결정 경계를 기준으로 분류를 수행하기 때문에, 변수의 스케일이 크게 다르면 결정 경계가 왜곡될 수 있다.

 

SVM에서 스케일링 전후 결정 경계가 달라지는 비교 이미지

 예를 들어 한 변수는 0~1 범위이고 다른 변수는 1,000~10,000 범위라면, SVM은 큰 범위를 가진 변수를 더 중요한 축처럼 취급할 수 있다. 따라서 SVM을 사용할 때는 StandardScaler나 MinMaxScaler를 적용해 변수의 스케일을 맞추는 것이 중요하다.

5. fit, transform, fit_transform의 차이

 전처리 과정에서는 fit, transform, fit_transform의 차이를 반드시 이해해야 한다. 이 차이를 모르면 테스트 데이터의 정보가 전처리 기준에 섞이는 데이터 누수가 발생할 수 있다.

메서드 의미 사용 위치
fit 데이터를 입력으로 받아 변환 기준을 학습한다. 훈련 데이터에만 사용한다.
transform fit을 통해 학습된 기준을 사용해 데이터를 변환한다. 훈련 데이터와 테스트 데이터 모두에 사용할 수 있다.
fit_transform fit과 transform을 연속적으로 수행한다. 훈련 데이터에만 사용한다.
 훈련 데이터에는 fit_transform()을 사용하고, 테스트 데이터에는 transform()만 사용해야 한다. 테스트 데이터에 fit_transform()을 사용하면 테스트 데이터의 평균, 표준편차, 최솟값, 최댓값 같은 정보가 전처리 기준에 반영된다. 이는 모델 평가 시점에서 아직 몰라야 할 정보를 미리 사용한 것이므로 데이터 누수에 해당한다.
from sklearn.model_selection import train_test_split
from sklearn.preprocessing import StandardScaler

X = [[1], [2], [3], [4], [5], [6], [7], [8]]
y = [10, 20, 30, 40, 50, 60, 70, 80]

X_train, X_test, y_train, y_test = train_test_split(
    X,
    y,
    test_size=0.25,
    random_state=42
)

scaler = StandardScaler()

X_train_scaled = scaler.fit_transform(X_train)
X_test_scaled = scaler.transform(X_test)
💻 데이터 누수 방지 원칙
 전처리 기준은 반드시 훈련 데이터에서만 학습해야 한다. 테스트 데이터는 모델이 실제 운영 환경에서 처음 만나는 데이터라고 가정해야 하므로, 테스트 데이터의 통계량을 전처리 기준에 반영하면 안 된다.

6. 다중공선성과 과적합

6.1 다중공선성

 다중공선성은 독립 변수, 즉 feature들 간에 강한 상관관계가 있는 경우를 의미한다. 선형 모델에서는 다중공선성이 있으면 모델의 예측이 불안정해지고, 각 변수가 결과에 미치는 영향을 해석하기 어려워진다.

 예를 들어 키와 몸무게는 서로 강한 상관관계를 가질 수 있다. 이 두 변수를 동시에 사용해 어떤 값을 예측하면 모델이 두 변수의 영향을 명확히 구분하기 어려워질 수 있다.

💡 비선형 모델에서도 다중공선성을 처리해야 할까?
 랜덤 포레스트, XGBoost 같은 트리 기반 모델은 선형 모델과 다르게 변수 간 독립성을 강하게 가정하지 않는다. 각 노드에서 분할할 변수를 자동으로 선택하기 때문에 다중공선성의 영향을 상대적으로 적게 받는다. 하지만 불필요한 변수가 많아지면 모델 복잡도가 증가하고, 과적합 위험이 커지며, Feature Importance 해석이 왜곡될 수 있다.

따라서 다중공선성은 모델의 목적에 따라 처리 여부를 판단해야 한다. 모델 해석이 목적이라면 적극적으로 확인해야 하고, 예측 성능이 목적이라면 반드시 제거하지 않더라도 변수 중요도 해석에는 주의해야 한다.

6.2 과적합

과적합은 머신러닝 모델이 학습 데이터에 지나치게 최적화되어 새로운 데이터에 대한 예측 성능이 저하되는 현상이다. 쉽게 말하면 train data에서는 100점을 받지만, test data에서는 20점을 받는 상황이다. 모델이 학습 데이터의 패턴뿐 아니라 노이즈까지 외워버렸기 때문에 새로운 데이터에 일반화하지 못한다.

 

과소적합, 적절한 학습, 과적합의 차이를 보여주는 개념 이미지

과적합 발생 원인 설명
모델이 너무 복잡할 때 데이터의 일반 패턴보다 세부 노이즈까지 학습한다.
훈련 데이터가 부족할 때 다양한 상황을 충분히 학습하지 못해 새로운 데이터에 약해진다.
노이즈나 이상치가 많을 때 실제 패턴이 아닌 우연한 변동을 모델이 학습할 수 있다.
과적합 방지 방법 설명
모델 복잡도 줄이기 불필요하게 복잡한 모델 구조를 단순화한다.
더 많은 훈련 데이터 확보 다양한 패턴을 학습할 수 있도록 데이터 수를 늘린다.
Regularization 적용 L1, L2 정규화를 통해 모델의 복잡도를 제어한다.
교차 검증 사용 데이터 분할에 따른 성능 편차를 줄이고 안정적으로 평가한다.
 Regularization은 모델의 복잡도를 제어하는 방법이다. 대표적인 방법으로 Ridge 회귀와 Lasso 회귀가 있다.

7. 다중공선성 제거 방법

7.1 VIF 기반 변수 제거

 VIF(Variance Inflation Factor, 분산팽창계수)는 특정 변수가 다른 독립 변수들과 얼마나 강하게 관련되어 있는지 확인하는 지표다. VIF 값이 높으면 해당 변수는 다른 변수들과 높은 상관관계를 가진다.

 일반적으로 VIF 값이 10 이상이면 다중공선성이 높다고 판단하고 제거를 고려한다. 더 엄격한 기준을 사용할 경우 5 이상을 기준으로 삼기도 한다.

VIF 기반 변수 제거 흐름
1. 모든 변수에 대해 VIF를 계산한다.
2. VIF 값이 가장 높은 변수를 제거한다.
3. 다시 VIF를 계산한다.
4. VIF 값이 기준 이하가 될 때까지 반복한다.
import pandas as pd
from statsmodels.stats.outliers_influence import variance_inflation_factor

X = pd.DataFrame({
    "height": [160, 165, 170, 175, 180],
    "weight": [55, 60, 65, 70, 75],
    "income": [3000, 3200, 4000, 4500, 5000]
})

vif_df = pd.DataFrame()
vif_df["feature"] = X.columns
vif_df["VIF"] = [
    variance_inflation_factor(X.values, i)
    for i in range(X.shape[1])
]

print(vif_df)

 VIF 값만 보고 변수를 기계적으로 제거해서는 안 된다. 도메인 지식이 있다면 변수 간 관계를 먼저 이해한 뒤 제거 여부를 결정해야 한다. 제조 데이터에서는 온도와 압력, 설비 속도와 생산량처럼 물리적으로 연관된 변수가 많기 때문에 통계 수치와 공정 지식을 함께 봐야 한다.

7.2 높은 상관관계를 가진 변수 제거

 피어슨 상관계수를 계산해 상관계수가 높은 변수 쌍 중 하나를 제거할 수 있다. 일반적으로 상관계수의 절댓값이 0.9 이상이면 높은 상관관계를 가진다고 판단한다.

상관계수 기반 제거 흐름
1. 피어슨 상관행렬을 계산한다.
2. 상관계수가 0.9 이상인 변수 쌍을 찾는다.
3. 도메인 지식이나 모델 성능을 고려해 제거할 변수를 결정한다.
import pandas as pd
import seaborn as sns
import matplotlib.pyplot as plt

df = pd.DataFrame({
    "height": [160, 165, 170, 175, 180],
    "weight": [55, 60, 65, 70, 75],
    "income": [3000, 3200, 4000, 4500, 5000]
})

corr = df.corr(numeric_only=True)

print(corr)

sns.heatmap(corr, annot=True)
plt.show()

 

상관관계 행렬을 heatmap으로 시각화한 결과 이미지

7.3 PCA 분석

 PCA(Principal Component Analysis, 주성분 분석)는 다중공선성이 높은 변수를 직접 제거하지 않고, 새로운 축으로 변환하여 차원을 줄이는 방법이다. 강한 상관관계를 가진 변수들을 그대로 사용하는 대신 여러 변수의 정보를 합친 새로운 축인 주성분을 만든다.

PCA 적용 흐름
1. 주성분 개수 n_components를 결정한다.
2. PCA를 적용하여 새로운 변수로 변환한다.
3. 변환된 변수를 모델에 사용한다.
from sklearn.decomposition import PCA
from sklearn.preprocessing import StandardScaler

X = df[["height", "weight", "income"]]

scaler = StandardScaler()
X_scaled = scaler.fit_transform(X)

pca = PCA(n_components=2)
X_pca = pca.fit_transform(X_scaled)

print(X_pca)
print("설명된 분산 비율:", pca.explained_variance_ratio_)

 

PCA를 이용해 차원을 축소한 결과 또는 주성분 축 변환 이미지

 PCA의 장점은 다중공선성을 해결하면서도 데이터 정보를 최대한 유지할 수 있다는 점이다. 하지만 PCA 적용 후에는 기존 변수의 의미가 새로운 축으로 변환되기 때문에 해석력이 떨어진다. 변수 중요도를 직접 해석해야 하는 품질 원인 분석에서는 PCA 적용 여부를 신중하게 판단해야 한다.

7.4 다중공선성은 무조건 처리해야 할까?

 다중공선성은 모델링 목적에 따라 처리 여부가 달라진다. 모델링의 목적이 해석이라면 다중공선성을 처리하는 것이 중요하다. 예를 들어 음주량과 흡연량이 암 발생에 미치는 영향을 분석한다면, 두 변수 사이의 관계를 고려하지 않고 모델을 해석하면 잘못된 결론을 낼 수 있다.

반면 모델링의 목적이 예측이라면 다중공선성을 반드시 제거하지 않아도 된다. 특히 트리 기반 모델은 다중공선성이 예측 결과 자체에 미치는 영향이 상대적으로 작다. 다만 변수 중요도 해석에는 영향을 줄 수 있으므로 주의해야 한다.

8. 데이터 분할

 모델을 훈련하고 평가하기 위해 데이터를 훈련 데이터와 테스트 데이터로 나눈다. 훈련 데이터는 모델 학습에 사용하고, 테스트 데이터는 모델이 본 적 없는 데이터로 일반화 성능을 평가하는 데 사용한다.

 

전체 데이터를 train set과 test set으로 나누는 데이터 분할 이미지

데이터 구분 역할
훈련 데이터 모델 학습에 사용한다.
테스트 데이터 모델이 본 적 없는 데이터로 일반화 성능을 평가한다.
검증 데이터 모델 선택, 하이퍼파라미터 튜닝, 중간 평가에 사용한다.
 데이터를 나누는 이유는 모델이 훈련 데이터만 잘 맞추고 새로운 데이터에서는 성능이 떨어지는 과적합을 확인하기 위해서다. 실제 상황에서도 잘 작동하는지 평가하려면 모델이 학습하지 않은 테스트 데이터가 필요하다.
일반적인 데이터 분할 비율
train : test = 8 : 2 or train : validation : test = 7 : 2 : 1

 분류 문제에서 클래스 비율이 불균형하다면 stratify=y를 사용해 훈련 데이터와 테스트 데이터의 클래스 비율을 비슷하게 유지하는 것이 좋다.

import pandas as pd
from sklearn.model_selection import train_test_split

# 예시 데이터 생성
data = {
    "feature1": range(100),
    "feature2": range(100, 200),
    "label": [0] * 80 + [1] * 20  # 불균형 데이터
}

df = pd.DataFrame(data)

# X와 y 분리
X = df[["feature1", "feature2"]]
y = df["label"]

# 데이터 분할
# stratify=y를 사용하면 클래스 비율을 train/test에 비슷하게 유지할 수 있다.
X_train, X_test, y_train, y_test = train_test_split(
    X,
    y,
    test_size=0.3,
    random_state=42,
    stratify=y
)

print("훈련 데이터 크기:", X_train.shape)
print("테스트 데이터 크기:", X_test.shape)

print("훈련 라벨 비율:")
print(y_train.value_counts(normalize=True))

print("테스트 라벨 비율:")
print(y_test.value_counts(normalize=True))

9. 회귀분석과 선형회귀

 회귀분석은 종속변수와 독립변수 간의 관계를 모델링하고, 이를 통해 숫자 값을 예측하거나 통찰을 얻는 통계적 기법이다.

구분 의미 예시
종속변수 예측하고자 하는 변수, y값 산출물의 순도, 제품 수율, 시험 점수
독립변수 종속변수에 영향을 미치는 변수, X값 반응 시간, 반응 온도, 촉매 종류
 예를 들어 화학 공정에서 산출물의 순도를 예측한다고 하자. 종속변수는 산출물의 순도이고, 독립변수는 반응 시간, 반응 온도, 사용된 촉매의 종류가 될 수 있다.

9.1 선형회귀

 선형회귀는 하나의 독립변수와 종속변수 사이의 선형 관계를 모델링하는 방법이다.

 

데이터 점들과 이를 가장 잘 설명하는 직선 형태의 선형회귀 그래프 이미지

선형회귀식 : y = β0 + β1x1 + ε 또는 1차 함수 형태 y = ax + b
항 의미
y 예측하려는 종속변수
x1 독립변수
β0 절편, 모델의 시작점
β1 기울기, 독립변수가 종속변수에 미치는 영향의 크기
ε 오차, 모델의 예측값과 실제값 간의 차이
 예를 들어 공부 시간과 시험 점수의 관계를 선형회귀로 분석한다고 하자. 절편이 20이고 기울기가 5라면 회귀식은 y = 5x + 20이 된다. 이는 공부를 하나도 하지 않아도 기본적으로 20점을 받고, 공부 시간이 1시간 증가할 때마다 시험 점수가 5점 증가한다는 의미로 해석할 수 있다.

9.2 회귀모델 실습 흐름

 간단한 선형회귀 모델은 라이브러리 불러오기, 데이터 준비, 훈련 데이터와 테스트 데이터 분리, 모델 생성, 학습, 예측 순서로 만들 수 있다.

# 라이브러리 불러오기
from sklearn.linear_model import LinearRegression
from sklearn.model_selection import train_test_split
from sklearn.metrics import mean_squared_error
import matplotlib.pyplot as plt

 scikit-learn은 회귀 모델을 불러오는 데 사용하고, train_test_split은 데이터셋을 훈련 데이터와 테스트 데이터로 분리하는 데 사용한다.

from sklearn.model_selection import train_test_split

# 데이터 준비
X = [[1], [2], [3], [4], [5]]
y = [2, 4, 6, 8, 10]

# 훈련 데이터와 테스트 데이터 분리
X_train, X_test, y_train, y_test = train_test_split(
    X,
    y,
    test_size=0.2,
    random_state=42
)

9.3 scikit-learn에서 모델 만드는 법

 scikit-learn에서 모델을 만드는 기본 흐름은 모델 클래스를 불러오고, 모델 객체를 생성한 뒤, fit()으로 학습하고, predict()로 예측하는 것이다.

scikit-learn 모델링 기본 흐름
1. 모델 클래스를 불러온다.
2. 모델 객체를 생성한다.
3. fit()으로 모델을 학습한다.
4. predict()로 예측한다.
from sklearn.linear_model import LinearRegression

# 모델 만들기
model = LinearRegression()

# 지도학습이므로 문제 X와 정답 y를 함께 넣어 학습시킨다.
model.fit(X_train, y_train)

10. 회귀 모델 성능 평가

 회귀 모델은 실제값과 예측값의 차이를 기준으로 평가한다. 일반적인 선형회귀분석은 최소제곱법을 이용해 계수를 구한다. 최소제곱법은 잔차의 제곱합이 최소가 되도록 가중치와 편향을 찾는 방법이다.

잔차 = 실제값 - 예측값

회귀분석에서 자주 사용하는 평가 지표는 MAE, MSE, RMSE, R²이다.

지표 전체 이름 핵심 의미 해석
MAE Mean Absolute Error 오차의 절댓값 평균 평균적으로 얼마나 틀렸는지 직관적으로 보여준다.
MSE Mean Squared Error 오차 제곱의 평균 큰 오차에 더 큰 페널티를 준다.
RMSE Root Mean Squared Error MSE의 제곱근 오차를 원래 데이터와 같은 단위로 해석할 수 있다.
R² R-squared 모델이 실제값의 변동성을 설명하는 정도 1에 가까울수록 설명력이 높다.

 

 

각 성능 평가 지표의 공식과 선형 회귀 그래프 이미지

10.1 MAE

 MAE(Mean Absolute Error, 평균절대오차)는 실제값과 예측값의 차이를 절댓값으로 변환한 뒤 평균을 계산한 값이다. 오차의 크기를 그대로 반영하기 때문에 평균적으로 얼마나 틀렸는지 직관적으로 확인할 수 있다.

from sklearn.metrics import mean_absolute_error

y_true = [3, -0.5, 2, 7]
y_pred = [2.5, 0.0, 2, 8]

mae = mean_absolute_error(y_true, y_pred)

print("MAE:", mae)

10.2 MSE

 MSE(Mean Squared Error, 평균제곱오차)는 실제값과 예측값의 차이를 제곱한 뒤 평균을 구한 값이다. MSE는 0에 가까울수록 모델이 실제값을 잘 예측한다는 뜻이다.

 예를 들어 실제값이 3이고 예측값이 2.5라면 오차는 0.5이다. MSE에서는 이 오차를 제곱하므로 0.25가 된다. MSE는 큰 오차에 더 큰 페널티를 주지만, 단위가 원래 데이터의 제곱이 되기 때문에 해석이 어려울 수 있다.

from sklearn.metrics import mean_squared_error

# 예시 데이터
y_true = [3, -0.5, 2, 7]
y_pred = [2.5, 0.0, 2, 8]

# MSE 계산
mse = mean_squared_error(y_true, y_pred)

print("MSE:", mse)

10.3 RMSE

 RMSE(Root Mean Squared Error, 평균제곱근오차)는 MSE의 제곱근을 취한 값이다. RMSE는 예측 오차를 실제 데이터와 같은 단위로 나타낼 수 있게 해준다. RMSE 값도 0에 가까울수록 모델이 실제값을 잘 예측한다는 뜻이다.

from sklearn.metrics import mean_squared_error
import numpy as np

# 예시 데이터
y_true = [3, -0.5, 2, 7]
y_pred = [2.5, 0.0, 2, 8]

# MSE 계산
mse = mean_squared_error(y_true, y_pred)

# RMSE 계산
rmse = np.sqrt(mse)

print("RMSE:", rmse)

10.4 R²

R²(R-squared, 결정계수)는 모델이 실제값의 변동성을 얼마나 잘 설명하는지를 나타내는 지표이다. R² 값이 1에 가까울수록 모델이 데이터를 잘 설명한다고 평가할 수 있다.

결정계수 = 1 - (모델이 설명하지 못한 변동 / y의 전체 변동)
from sklearn.metrics import r2_score

# 예시 데이터
y_true = [3, -0.5, 2, 7]
y_pred = [2.5, 0.0, 2, 8]

# R² 계산
r2 = r2_score(y_true, y_pred)

print("R² 스코어:", r2)

11. 다중 선형회귀

 다중 선형회귀는 두 개 이상의 독립변수를 사용하여 종속변수를 예측하는 방법이다. 하나의 변수만으로 설명하기 어려운 문제에서 여러 독립변수를 동시에 고려한다. 예를 들어 시험 점수를 예측한다고 할 때, 독립변수로 하루 공부 시간, 수면 시간, 커피 섭취량을 사용할 수 있다.

다중 선형회귀 예시
독립변수: 하루 공부 시간, 수면 시간, 커피 섭취량
종속변수: 시험 점수
다중 선형회귀식 y = β0 + β1x1 + β2x2 + ... + βnxn + ε

 각 독립변수는 종속변수에 개별적으로 영향을 미친다. 모델은 모든 독립변수의 영향을 동시에 고려한다. 다만 독립변수가 너무 많으면 해석이 복잡해지고, 다중공선성이나 과적합 문제가 발생할 수 있다.

import numpy as np
import pandas as pd
from sklearn.linear_model import LinearRegression
from sklearn.model_selection import train_test_split

# 독립 변수 x1, x2
X = np.array([
    [1, 2],
    [2, 3],
    [3, 5],
    [4, 6],
    [5, 8]
])

# 종속 변수 y
y = np.array([3, 5, 7, 9, 11])

# 학습 데이터와 테스트 데이터 분리
X_train, X_test, y_train, y_test = train_test_split(
    X,
    y,
    test_size=0.2,
    random_state=42
)

# 모델 학습
model = LinearRegression()
model.fit(X_train, y_train)

# 결과 확인
print("회귀 계수 (W):", model.coef_)
print("절편 (b):", model.intercept_)

# 예측
print("X_test:", X_test)
y_pred = model.predict(X_test)

print("예측 값:", y_pred)

12. 분류 모델과 로지스틱 회귀

12.1 분류 모델

 분류 모델은 어떤 대상을 정해진 범주에 구분해 넣는 작업이다. 제품이 정상인지 불량인지, 고객이 이탈할지 유지될지, 환자가 질병을 가졌는지 아닌지처럼 범주를 예측하는 문제에 사용한다.

 

분류 모델이 데이터를 서로 다른 범주로 나누는 개념 이미지를 삽입한다.

 분류 분석은 군집 분석과 유사해 보일 수 있지만 중요한 차이가 있다. 분류 분석은 각 범주가 미리 정의되어 있다. 반면 군집 분석은 정답 범주 없이 데이터의 유사성을 기준으로 그룹을 찾는다.

분류 유형 의미 예시
이진 분류 두 개의 범주 중 하나를 예측한다. 정상/불량, 해지/유지
다중 분류 세 개 이상의 범주 중 하나를 예측한다. A/B/C 등급, 상/중/하

12.2 로지스틱 회귀 분석

 로지스틱 회귀는 분류 문제의 대표적인 알고리즘이다. 이름에는 회귀가 들어가지만, 실제로는 종속변수가 범주형일 때 사용하는 분류 모델이다. 로지스틱 회귀는 점들을 가장 잘 나누는 S자 곡선을 찾아 예/아니오를 판별한다.

 

로지스틱 회귀의 S자 곡선과 결정 기준(P = 0.5로 설정된)을 설명하는 이미지

 선형회귀로 분류를 수행하기 어려운 이유는 예측값이 확률 범위를 벗어날 수 있기 때문이다. 확률은 반드시 0과 1 사이 값이어야 한다. 하지만 직선 함수는 음수나 1보다 큰 값을 만들 수 있다.

선형회귀로 확률을 예측할 때의 문제
공부시간이 매우 적을 때: 예측값이 음수가 될 수 있다.
공부시간이 매우 많을 때: 예측값이 1을 초과할 수 있다.

 로지스틱 회귀는 이 문제를 시그모이드 함수로 해결한다. 시그모이드 함수는 어떤 입력값이 들어와도 결과를 0과 1 사이 값으로 변환한다. 즉, 로지스틱 회귀의 핵심은 어떤 일이 일어날 가능성을 0~1 사이 숫자로 표현하는 것이다.

from sklearn.datasets import make_classification
from sklearn.linear_model import LogisticRegression
from sklearn.model_selection import train_test_split

X, y = make_classification(
    n_samples=200,
    n_features=4,
    n_classes=2,
    random_state=42
)

X_train, X_test, y_train, y_test = train_test_split(
    X,
    y,
    test_size=0.3,
    random_state=42,
    stratify=y
)

model = LogisticRegression()
model.fit(X_train, y_train)

y_pred = model.predict(X_test)
y_prob = model.predict_proba(X_test)[:, 1]

print("예측 클래스:", y_pred[:10])
print("양성 클래스 확률:", y_prob[:10])

13. 분류 모델 성능 평가

 분류 모델은 예측한 범주가 실제 범주와 얼마나 일치하는지 평가한다. 대표적인 평가 지표에는 혼동 행렬, 정확도, 정밀도, 재현율, F1 Score, ROC Curve, AUC가 있다.

13.1 혼동 행렬

 혼동 행렬은 예측값이 실제값과 일치하는지 분류하는 표다. 이진 분류에서는 예측 범주와 실제 범주에 따라 TP, TN, FP, FN 네 가지 결과가 나온다.


scikit-learn confusion matrix의 TP, TN, FP, FN의 위치와 행과 열 순서를 설명

용어 의미
TP 실제 양성을 양성으로 예측
TN 실제 음성을 음성으로 예측
FP 실제 음성을 양성으로 잘못 예측
FN 실제 양성을 음성으로 잘못 예측

 sklearn.metrics.confusion_matrix를 사용하면 혼동 행렬을 구할 수 있다. scikit-learn의 confusion matrix는 일반적으로 행이 실제값, 열이 예측값을 의미한다. 이진 분류에서 라벨이 0과 1이면 보통 다음 순서로 출력된다.

scikit-learn confusion matrix 출력 순서
[[TN, FP], [FN, TP]]
from sklearn.metrics import confusion_matrix

cm = confusion_matrix(y_test, y_pred)

print(cm)

13.2 정확도

정확도는 전체 데이터 중 올바르게 분류한 비율이다.

Accuracy = (TP + TN) / (TP + FN + FP + TN)
from sklearn.metrics import accuracy_score

accuracy = accuracy_score(y_test, y_pred)

print("Accuracy:", accuracy)

 정확도는 전체적인 성능을 직관적으로 보여주지만, 클래스 불균형 데이터에서는 착시를 만들 수 있다. 예를 들어 불량률이 5%인 데이터에서 모든 제품을 정상으로 예측해도 정확도는 95%가 될 수 있다.

13.3 정밀도

정밀도는 모델이 양성이라고 예측한 것 중 실제 양성의 비율이다.

Precision = TP / (TP + FP)

 예를 들어 의사가 양성이라고 예측한 사람 중 실제 양성 환자의 비율을 의미한다. 의사가 정말 확실한 사람에게만 양성 판정을 내리면 정밀도는 올라갈 수 있다.

from sklearn.metrics import precision_score

precision = precision_score(y_test, y_pred)

print("Precision:", precision)

13.4 재현율

재현율은 실제 양성 중 모델이 양성으로 올바르게 예측한 비율이다.

Recall = TP / (TP + FN)

 예를 들어 실제 양성 환자 중 모델이 양성이라고 찾아낸 사람의 비율이다. 의사가 모든 사람에게 양성 판정을 내리면 재현율은 올라갈 수 있다.

from sklearn.metrics import recall_score

recall = recall_score(y_test, y_pred)

print("Recall:", recall)

13.5 F1 Score

F1 Score는 정밀도와 재현율의 조화 평균이다. 정밀도와 재현율의 균형을 보고 싶을 때 사용한다.

F1 Score = 2TP / (2TP + FP + FN) 또는 F1 Score = 2 × Precision × Recall / (Precision + Recall)

 정밀도와 재현율은 trade-off 관계에 있다. 정밀도를 높이면 재현율이 낮아질 수 있고, 재현율을 높이면 정밀도가 낮아질 수 있다. F1 Score는 이 둘 중 하나만 보는 것이 아니라 균형을 평가한다.

from sklearn.metrics import f1_score

f1 = f1_score(y_test, y_pred)

print("F1 Score:", f1)

14. Precision-Recall Trade-off

 Precision과 Recall은 동시에 최대값 1.0을 얻기 어렵다. 예를 들어 불량 탐지 모델에서 재현율을 높이기 위해 조금이라도 의심되는 제품을 모두 불량으로 예측하면 실제 불량을 놓칠 가능성은 줄어든다. 하지만 정상 제품까지 불량으로 잘못 예측할 가능성이 커져 정밀도는 낮아질 수 있다.

 반대로 정말 확실한 경우에만 불량으로 예측하면 정밀도는 높아진다. 하지만 실제 불량을 놓칠 가능성이 커져 재현율은 낮아질 수 있다.

운영 전략 장점 위험 적합한 상황
재현율 우선 실제 양성을 놓칠 가능성이 감소 정상까지 양성으로 잘못 판단할 수 있다. 불량 유출, 질병 진단, 안전 사고처럼 놓치면 비용이 큰 문제
정밀도 우선 양성 판정의 신뢰도가 증가 일부 실제 양성을 놓칠 수 있다. 후속 조치 비용이 크거나 오탐 비용이 큰 문제
 따라서 분류 모델에서는 비즈니스 목적에 따라 Precision과 Recall 중 무엇을 더 중요하게 볼지 결정해야 한다. 제조 공정 불량 탐지에서는 불량 제품을 놓치지 않는 것이 중요하다면 Recall을 우선해야 하고, 정상 제품을 불량으로 판정해 폐기하거나 재검사하는 비용이 크다면 Precision도 함께 고려해야 한다.

15. ROC Curve와 AUC

 ROC(Receiver Operating Characteristic, 수신자 조작 특성) 커브는 모든 임계값에서의 모델 성능을 한눈에 보여주는 시각화 도구다. 단일 임계값에 의존하지 않고 모델의 전반적인 분류 능력을 평가할 수 있다.

축 의미 공식
X축 FPR(False Positive Rate, 거짓 양성 비율) FPR = FP / (FP + TN)
Y축 TPR(True Positive Rate, 참 양성 비율) TPR = TP / (TP + FN)
TPR은 실제 양성인 것들 중에서 모델이 양성이라고 올바르게 예측한 비율이다. TPR은 Recall과 같다. ROC 커브는 다양한 임계값에 따라 달라지는 TPR과 FPR 값을 그래프에 점으로 찍고 연결한 선이다.

ROC 커브에서 임계값 변화에 따라 TPR과 FPR이 달라지는 개념과 이상적인 ROC 커브와 랜덤 예측선의 차이

 이상적인 ROC 커브는 왼쪽 상단 모서리에 가까운 형태다. 대각선은 랜덤 예측에 가까운 성능을 의미하므로, ROC 커브는 대각선보다 위쪽에 있어야 한다.

 AUC(Area Under the Curve, 곡선 아래 면적)는 ROC 커브 아래 면적을 의미한다. AUC가 1에 가까울수록 좋은 모델이고, 0.5에 가까우면 무작위 예측에 가깝다.

from sklearn.metrics import roc_curve, roc_auc_score
import matplotlib.pyplot as plt

# 양성 클래스 확률
y_prob = model.predict_proba(X_test)[:, 1]

fpr, tpr, thresholds = roc_curve(y_test, y_prob)
auc_score = roc_auc_score(y_test, y_prob)

plt.figure(figsize=(6, 5))
plt.plot(fpr, tpr, label=f"AUC = {auc_score:.3f}")
plt.plot([0, 1], [0, 1], linestyle="--")

plt.xlabel("False Positive Rate")
plt.ylabel("True Positive Rate")
plt.title("ROC Curve")
plt.legend()
plt.show()


ROC Curve와 AUC 값이 표시된 그래프 결과 이미지를 삽입한다.

💡 ROC 커브가 중요한 이유
 ROC 커브는 임계값 독립적인 평가가 가능하고, 여러 모델의 성능을 한 그래프에서 비교하기 쉽다. 또한 TPR과 FPR의 trade-off를 고려해 비즈니스 목적에 맞는 임계값을 선택하는 데 활용할 수 있다.

16. Macro Average와 Weighted Average

 분류 리포트에서는 macro avg와 weighted avg가 함께 출력된다. 클래스 불균형이 있는 데이터에서는 이 두 평균의 차이를 반드시 이해해야 한다.

 예를 들어 제조 공정 불량 탐지 모델이 있다고 하자. 전체 100개의 제품 중 90개는 정상이고, 10개는 불량이다. 모델의 클래스별 F1 Score가 다음과 같다고 가정한다.

정상 클래스: 데이터 수 90개, F1 Score 0.90
불량 클래스: 데이터 수 10개, F1 Score 0.10

 이 모델은 정상 데이터는 잘 맞추지만, 실제로 중요한 불량 데이터는 거의 찾지 못하는 모델이다. 이 상황에서 Macro Average와 Weighted Average는 서로 다른 메시지를 준다.

16.1 Macro Average

Macro Average는 데이터 개수에 상관없이 모든 클래스를 1:1로 동일하게 취급하여 평균을 낸다.

Macro Average = (정상 점수 + 불량 점수) / 클래스 개수
예시: (0.90 + 0.10) / 2 = 0.50

 불량 클래스의 낮은 성능이 전체 평균에 그대로 반영되기 때문에 점수가 낮게 나온다. 소수 클래스를 잘 예측하는지가 중요한 암 진단, 사기 탐지, 불량 탐지 문제에서는 Macro Average를 반드시 확인해야 한다.

16.2 Weighted Average

Weighted Average는 각 클래스가 가진 데이터 개수의 비율만큼 가중치를 곱해서 평균을 낸다.

Weighted Average = (정상 점수 × 정상 개수 + 불량 점수 × 불량 개수) / 전체 데이터 개수
예시: (0.90 × 90 + 0.10 × 10) / 100 = (81 + 1) / 100 = 0.82

Weighted Average는 0.82로 높게 나온다. 하지만 이 숫자에 속으면 안 된다. 전체 데이터의 90%를 차지하는 정상 클래스의 높은 점수가 소수 클래스의 낮은 성능을 가려버릴 수 있기 때문이다.

16.3 Macro Avg와 Weighted Avg 비교

구분 의미 언제 사용하는가 위험
Macro Avg 클래스 간 평등 소수 클래스 예측 성능이 매우 중요할 때 다수 클래스를 잘 예측한 성과가 낮게 보일 수 있음
Weighted Avg 다수결의 원칙 전체적인 볼륨 관점에서 모델의 전반적 성능을 볼 때 소수 클래스를 못 맞춰도 점수가 높게 나올 수 있음
❗ 불량 탐지 모델 평가 주의점
 제조 공정 불량 탐지처럼 불량 데이터가 적지만 중요한 문제에서는 Accuracy나 Weighted Average만 보면 위험하다. 반드시 Recall, F1 Score, Macro Average를 함께 확인해야 한다. 정상 제품을 잘 맞추는 모델이 좋은 모델처럼 보일 수 있지만, 실제 핵심은 불량을 얼마나 놓치지 않는가이다.

17. 전체 정리

  • 데이터 전처리의 핵심은 모델이 데이터를 학습할 수 있는 형태로 바꾸는 것이다. 범주형 데이터는 인코딩을 통해 숫자로 변환하고, 수치형 데이터는 스케일링을 통해 단위와 범위를 맞춘다. One-Hot Encoding은 순서 없는 범주에 적합하고, Label Encoding은 순서가 있는 범주에 적합하다. 단, 원하는 순서가 명확하다면 map()을 사용하는 것이 더 명확하다.
  • 스케일링에서는 StandardScaler와 MinMaxScaler를 구분해야 한다. StandardScaler는 평균 0, 표준편차 1로 변환하며 정규분포에 가까운 데이터나 선형 모델, SVM, KNN, PCA에 자주 사용된다. MinMaxScaler는 값을 0과 1 사이로 변환하며 값의 범위를 일정하게 맞추고 싶을 때 사용된다.
  • 다중공선성은 독립 변수 간 상관관계가 높은 문제다. 해석이 목적이면 적극적으로 처리해야 하고, 예측이 목적이며 트리 기반 모델을 사용한다면 반드시 제거하지 않아도 된다. VIF, 상관계수, PCA 등을 활용할 수 있지만, 변수 제거는 도메인 지식과 모델 목적을 함께 고려해야 한다.
  • 모델링 전에는 데이터를 훈련 데이터와 테스트 데이터로 분할해야 한다. 훈련 데이터는 모델 학습에 사용하고, 테스트 데이터는 모델이 처음 보는 데이터로 일반화 성능을 평가하는 데 사용한다. 전처리 기준은 훈련 데이터에서만 학습해야 하며, 테스트 데이터에는 transform()만 적용해야 한다.
  • 회귀 문제에서는 MAE, MSE, RMSE, R² 같은 지표를 사용한다. MAE는 평균적인 오차 크기를 직관적으로 보여주고, MSE는 큰 오차에 더 큰 페널티를 준다. RMSE는 원래 데이터 단위로 오차를 해석할 수 있게 해주며, R²는 모델이 실제값의 변동성을 얼마나 설명하는지 보여준다.
  • 분류 문제에서는 Accuracy, Precision, Recall, F1 Score, ROC-AUC를 사용한다. Accuracy는 전체 중 맞춘 비율이고, Precision은 양성 예측 중 실제 양성 비율이며, Recall은 실제 양성 중 모델이 찾아낸 비율이다. F1 Score는 Precision과 Recall의 균형을 평가하고, ROC-AUC는 임계값 변화에 따른 전반적인 분류 성능을 평가한다.
📑 핵심 요약
 머신러닝의 핵심은 데이터를 적절히 전처리하고, 문제에 맞는 모델을 학습시키며, 목적에 맞는 평가 지표로 모델을 판단하는 것이다. 특히 제조 공정 불량 탐지처럼 클래스 불균형이 있는 문제에서는 단순 정확도만 보면 안 된다. 다수 클래스의 성능이 소수 클래스의 실패를 가릴 수 있기 때문에 Recall, F1 Score, Macro Average를 함께 확인해야 한다.

출처

※ KDT 빅데이터 기반 품질 관리(QA/QC) 양성 과정 6회차

'TIL > 머신러닝' 카테고리의 다른 글

선형 모델 이후의 모델링 프로세스 실습  (0) 2026.06.29
로지스틱 회귀와 분류 평가 지표 정리  (0) 2026.06.24
머신러닝의 정의와 학습 유형 그리고 모델링 흐름 정리  (0) 2026.06.17
머신러닝 기초와 선형회귀 이해하기  (0) 2026.06.17
VS Code 설치 및 설정 방법 : Python과 Jupyter Notebook 실습 환경 조성하기  (0) 2026.06.17
'TIL/머신러닝' 카테고리의 다른 글
  • 선형 모델 이후의 모델링 프로세스 실습
  • 로지스틱 회귀와 분류 평가 지표 정리
  • 머신러닝의 정의와 학습 유형 그리고 모델링 흐름 정리
  • 머신러닝 기초와 선형회귀 이해하기
yustitix
yustitix
Semiconductor Process & Quality Data Analyst Candidate, M.S. in Polymer Engineering, @Yustitix </br> Aspiring Semiconductor Process & Quality Data Analyst, aiming to grow into a Manufacturing AI Data Scientist.
  • yustitix
    데분하다
    yustitix
  • 전체
    오늘
    어제
    • 분류 전체보기 (52)
      • Portfolio (4)
      • Job search (9)
        • JD (3)
        • Article study (5)
        • News room (1)
      • TIL (35)
        • TIL (2)
        • 코테 (11)
        • Python (6)
        • 머신러닝 (6)
        • 기초 통계 (3)
        • 반도체 공정 입문 (7)
      • Project (4)
        • FAERS 이상사례 자가보고 데이터 기반 모니터링.. (4)
  • 블로그 메뉴

    • 홈
    • 태그
    • 방명록
  • 링크

  • 공지사항

  • 인기 글

  • 태그

  • 최근 댓글

  • 최근 글

  • hELLO· Designed By정상우.v4.10.6
yustitix
머신러닝 : 데이터 전처리부터 모델링과 평가까지
상단으로

티스토리툴바