품질관리(QAQC) 데이터 부트캠프(본캠프)

본캠프_7주차(화)_TIL(머신러닝 기초 정리)

Wat_zy 2025. 10. 28. 08:59

✅ 오늘 한 것

머신러닝 복습(라이브 세션 기반 1~3주차 복습)


✏️ 오늘 배운 점

머신러닝

머신러닝: 컴퓨터가 데이터를 학습하고 스스로 패턴을 찾아내 적절한 작업을 수행하도록 학습하는 알고리즘

머신러닝의 3가지 핵심 요소

  • 작업(T): 제품 결함 탐지, 생산 공정 모니터링, 품질 평가 등
  • 성능 지표(P): 정확도, 정밀도, 재현율 등
  • 경험(E): 수집된 생산 데이터, 검사 기록, 공정 센서 데이터 등

특정 작업(T)에 대해 성능 지표(P)로 측정했을 때, 경험(E)을 통해 성능이 향상된다면 그 프로그램은 학습한다고 말할 수 있다.

 

머신러닝 학습의 종류

지도 학습: 정답이 있는 데이터를 활용해 데이터를 학습시키는 것(분류, 회귀 문제)

분류: 컴퓨터가 주어진 데이터를 보고 미리 정해진 그룹(카테고리) 중 하나로 나누는 작업

이진 분류: 데이터가 두 개의 카테고리(정상 or 비정상)로 분류되는 경우

다중 분류: 데이터가 세 개 이상의 카테고리로 분류되는 경우

다중 레이블 분류: 하나의 데이터가 여러 개의 카테고리를 가질 수 있는 경우

회귀: 데이터를 기반으로 연속적인 숫자 값을 예측하는 작업

선형 회귀: 데이터가 직선 형태로 분포한다고 가정하여 예측

다항 회귀: 데이터를 비선형적으로 모델링할 때 사용
릿지 회귀/라쏘 회귀: 다중 공선성 문제를 해결하기 위해 규제를 추가한 선형 회귀

서포트 벡터 회귀(SVR): SVM을 기반으로 연속적인 값 예측

결정 트리 회귀/랜덤 포레스트 회귀: 의사결정 트리를 기반으로 데이터를 나누어 예측

딥러닝 기반 회귀: 신경망을 활용하여 복잡한 관계 학습

 

비지도 학습: 레이블이 없는 데이터를 분석하여 데이터 간의 관계, 그룹, 패턴 등을 찾는 알고리즘

정답이 없기 때문에 정확도보다 데이터 간의 유사성과 차이를 측정하는 데에 중점을 둠.

클러스터링: 데이터를 유사한 그룹으로 묶는 작업

차원 축소: 데이터를 더 간결하고 중요한 특징들만 남기는 작업

연관 규칙 학습: 데이터 간의 상관관계를 발견하는 작업

 

강화 학습: 보상을 통해 상은 최대화, 벌은 최소화하는 방향으로 행위를 강화하는 학습

 

Scikit-learn 라이브러리: 머신러닝 분석을 할 때 유용하게 사용할 수 있는 라이브러리(약어: sklearn)

from sklearn.model_selection import train_test_split
from sklearn.linear_model import LinearRegression
from sklearn.linear_model import LogisticRegression
from sklearn.naive_bayes import GaussianNB
from sklearn import svm
from sklearn import tree
from sklearn.ensemble import RandomForestClassifier

 

머신러닝 모델링 순서: 문제 정의 -> 데이터 전처리 -> 모델링

문제 정의:

  • 모델로 해결하고 싶은 문제가 무엇인지 확실하게 정의합니다.
  • 문제에 대한 나의 접근 방식을 정합니다.

데이터 전처리:

  • 데이터 수집
  • 데이터 클리닝(데이터 타입 확인, 결측치 처리 및 이상치 제거, 정규화 필요시 진행)
  • 피쳐 엔지니어링 (Feature Engineering)(분석에 활용하기 위한 변수 선택 및 필요 시 새로운 변수 생성)
  • 데이터 분할

모델링:

  • 학습에 사용할 모델을 선택하고 모델을 생성합니다.
  • 학습 데이터를 이용해 모델을 학습시킵니다.
  • 테스트 데이터를 이용해 모델을 이용한 예측을 진행합니다.
  • 성능 지표를 활용해 모델의 성능을 평가합니다.
  • 모델 성능을 끌어올리기 위해 모델의 하이퍼파라미터 값을 변경하며 위 과정을 반복합니다.

인코딩: 범주형 데이터를 숫자로 변환하는 과정

범주형 데이터: 숫자처럼 연속적인 값이 아닌 특정한 범주(category) 또는 이름(label)으로 표현되는 데이터

머신러닝 모델은 숫자만 입력받을 수 있기에 인코딩을 통하여 모델 학습을 진행시킬 수 있다.

OneHotEncoding: 가장 많이 사용하는 인코딩 방법

순서가 없는 범주형 변수를 다룰 때 효과적인 방법

범주의 개수가 너무 많지 않을 때

df_encoded = pd.get_dummies(df, columns=['blood_type'])

 

Label Encoder: 문자형 데이터를 정수(숫자)로 변환하는 간단한 방법

주로 순서가 있는 범주형 변수를 처리할 때 유용

from sklearn.preprocessing import LabelEncoder

le = LabelEncoder()
df['LE 진행한 컬럼'] = le.fit_transform(df['바꾸고자 하는 범주형 컬럼'])

 

스케일링: 수치형 데이터의 단위(스케일)를 맞추는 전처리 과정

머신러닝 모델은 입력 변수들의 크기 차이에 민감하기에 스케일링 필요

스케일이 크거나 단위가 다른 변수는 모델이 편향되게 학습할 수 있음.

 

StandardScaler(표준화): 데이터를 평균 0, 표준편차 1로 변환

데이터가 정규분포에 가깝거나 대칭적일 때 사용

이상치가 있으면 평균과 표준편차가 흔들릴 수 있음.

from sklearn.preprocessing import StandardScaler
from sklearn.preprocessing import LabelEncoder

# StandardScaler 초기화
scaler = StandardScaler()

# 데이터 표준화
Data_scaled = scaler.fit_transform(data)

 

MinMaxScaler(정규화): 각 값을 0~1 사이로 변환

값의 범위를 일정한 크기로 맞춰야 할 때, 데이터 분포가 비정규형일 때 사용

from sklearn.preprocessing import MinMaxScaler

# MinMaxScaler 초기화
scaler = MinMaxScaler()

# 데이터 정규화
Data_scaled = scaler.fit_transform(data)


다중공선성: 독립 변수들 간에 강한 상관관계가 있는 경우
선형 모델에서는 다중공선성이 있으면 처리가 필요하다. 비선형 모델에서는 영향이 적어 무시할 수 있음.

하지만, 비선형 모델에서 다중공선성이 문제가 될 수 있는 경우

1) 불필요한 변수가 많아져 모델의 복잡도가 증가(과적합)

2) 모델 해석(Feature Importance)이 왜곡될 가능성 ⇒ 어떤변수가 온도라는변수가 제일 의미가 크더라.

3) 훈련 데이터 효율성 저하

모델링의 목적이 해석인 경우 다중공선성 처리, 예측인 경우 다중공선성 처리 X

 

과적합(overfitting): 머신러닝 모델이 학습 데이터에 지나치게 최적화되어 새로운 데이터에 대한 예측 성능이 저하되는 현상

과적합이 발생하는 이유

  • 모델이 너무 복잡할 때: 너무 많은 파라미터가 있거나, 너무 깊은 신경망을 사용할 때 과적합이 발생할 수 있습니다. 이 모델은 훈련 데이터를 지나치게 잘 맞추려 하여, 실제로는 예측력이 떨어집니다.
  • 훈련 데이터가 부족할 때: 훈련 데이터가 적으면 모델이 그 데이터를 과도하게 학습하여, 새로운 데이터에 대한 일반화 능력이 떨어집니다.
  • 노이즈가 많은 데이터: 데이터에 잡음이나 이상치가 있을 때, 모델이 이 잡음까지 학습하게 되면 과적합이 일어납니다.

과적합을 방지하는 방법

  1. 모델의 복잡도 줄이기: 너무 많은 파라미터를 가진 모델 대신, 간단한 모델을 사용합니다.
  2. 더 많은 훈련 데이터 확보: 데이터가 많을수록 모델이 훈련 데이터에 과도하게 맞추는 것을 방지할 수 있습니다.
  3. 정규화(Regularization): L1, L2 정규화 같은 기법을 사용해 모델의 복잡도를 제어할 수 있습니다.
  4. 교차 검증: 모델을 여러 번 테스트하여 과적합 여부를 확인하고, 모델을 개선합니다.

VIF(Variance Inflation Factor): 값이 높을수록 해당 변수는 다른 변수들과 높은 상관관계를 가짐.

VIF 값이 10 이상이면 다중공선성이 높다고 판단하고 제거 고려

방법:

  1. 모든 변수에 대해 VIF를 계산
  2. VIF 값이 가장 높은 변수를 제거하고 다시 VIF 계산
  3. VIF 값이 10 이하가 될 때까지 반복
from statsmodels.stats.outliers_influence import variance_inflation_factor
import statsmodels.api as sm

def calculate_vif(X):
    vif_data = pd.DataFrame()
    vif_data["Variable"] = X.columns
    vif_data["VIF"] = [variance_inflation_factor(X.values, i)
                       for i in range(X.shape[1])]
    return vif_data.sort_values('VIF', ascending=False)
    
# 예시 데이터 생성
np.random.seed(42)
size = 100

# 독립변수 3개
X1 = np.random.normal(10, 5, size)
X2 = 2*X1 + np.random.normal(0, 1, size)  # X1과 강한 상관관계
X3 = np.random.normal(5, 2, size)

# 데이터프레임 구성
df = pd.DataFrame({
    "X1": X1,
    "X2": X2,
    "X3": X3
})

# VIF 계산 실행
vif_result = calculate_vif(df)
print(vif_result)

# 1. 독립 변수 행렬 준비
X = data[['X1', 'X2', 'X3']]

# 2. 상수항 추가 (회귀분석을 위해 반드시 필요)
X = sm.add_constant(X)

# 3. VIF 계산
vif = pd.DataFrame()
vif["변수"] = X.columns
vif["VIF"] = [variance_inflation_factor(X.values, i) for i in range(X.shape[1])]

print(vif)

 

피어슨 상관계수를 계산하여 상관계수 0.9 이상인 변수 쌍 중 하나를 제거 

corr_matrix = df_numeric.corr().abs()

# 상관관계가 높은 변수 찾기
threshold = 0.9
high_corr_vars = set()

for i in range(len(corr_matrix.columns)):
    for j in range(i):
        if corr_matrix.iloc[i, j] > threshold:
            colname = corr_matrix.columns[i]
            high_corr_vars.add(colname)

# 상관계수가 높은 변수 제거
df_corr_reduced = df_numeric.drop(columns=high_corr_vars)

 

PCA 분석: 다중공선성이 높은 변수를 직접 제거하지 않고, 새로운 축으로 변환하여 차원을 줄이는 방법

2개의 강한 상관관계를 가진 변수 X, X1가 있다면 이를 제거하지 않고 PC1라는 새로운 축을 만든다.

from sklearn.decomposition import PCA
from sklearn.preprocessing import StandardScaler

# 데이터 표준화(데이터의 크기가 PCA에 영향을 미치므로 StandardScaler() 적용)
scaler = StandardScaler()
df_scaled = scaler.fit_transform(df_numeric)

# PCA 적용
pca = PCA(n_components=0.95)  # 설명된 분산 95% 유지
df_pca = pca.fit_transform(df_scaled[['a','b']])

 

데이터 분할: 훈련 데이터(Train) + 테스트 데이터(Test)

훈련 데이터: 모델 학습에 사용

테스트 데이터: 모델이 본 적 없는 데이터로, 일반화 성능 평가

보통 train : test = 8 : 2로 비율 적용(7: 3도 사용하기는 함)

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로 클래스 비율 유지)
X_train, X_test, y_train, y_test = train_test_split(
    X, y, test_size=0.3, random_state=42)

 

회귀분석: 종속변수(목표 변수)와 독립변수(설명 변수) 간의 관계를 모델링하고, 이를 통해 예측하거나 통찰을 얻는 통계적 기법

종속변수: 우리가 예측하고자 하는 변수 y값

독립변수: 종속변수에 영향을 미치는 변수 X값

 

선형회귀:

  • y: 예측하려는 종속변수
  • x1: 독립변수 (종속변수에 영향을 미치는 변수)
  • β0: 절편 (모델의 시작점)
  • β1: 기울기 (독립변수가 종속변수에 미치는 영향의 크기)
  • ϵ: 오차 (모델의 예측값과 실제값 간의 차이)
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

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) # 지도학습 문제랑 정답을 다 줘야한다.

# 예측 및 평가
y_pred = model.predict(X_test)
print("MSE:", mean_squared_error(y_test, y_pred))
print("회귀 계수 (W):", model.coef_)
print("절편 (b):", model.intercept_)

# 그래프 그리기
plt.scatter(X, y, color='blue', label='Actual data')  # 실제 데이터
plt.plot(X, model.predict(X), color='red', label='Regression line')  # 회귀선
plt.scatter(X_test, y_test, color='orange', label='Test data')  # 테스트 데이터

 

다중 선형회귀:

  • x1,x2,…,xn: 여러 독립변수 (공부 시간, 수면 시간 등)
  • y: 종속변수 (시험 점수)
import numpy as np
import pandas as pd
from sklearn.linear_model import LinearRegression
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)

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

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

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

 

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

실제 값과 예측 값 간의 차이를 제곱하여 계산한 후 평균을 구하는 값

MSE 값은 0에 가까울수록 모델이 실제 값을 잘 예측하고 있다는 뜻

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)

 

평균 제곱근 오차(RMSE, Root Mean Squared Error):

MSE의 제곱근을 취한 값

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 계산 (MSE의 제곱근)
rmse = np.sqrt(mse)

 

결정 계수( , R-squared):

R² 값이 1에 가까울수록 모델이 잘 작동

=1 --> 100%

=0.9 --> 90%

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)

✏️ 오늘의 핵심

1) 머신러닝을 ‘T–P–E’로 정의하기 -> 2) 학습 종류와 올바른 문제 정식화 -> 3) 표준 파이프라인 -> 4) 전처리 핵심 -> 5) 다중공선성과 차원 축소 -> 6) 과적합 방지 슈트 -> 7) 모델 선택의 가이드 -> 8) 데이터 분할과 재현성

 


📌추가로 해야할 점

통계학 기초 3주차, 졸업 시험, 베이직반 수업 복습