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

본캠프_7주차(목)_TIL(머신러닝 정리)

Wat_zy 2025. 10. 30. 08:59

✅ 오늘 한 것

머신러닝의 이해와 라이브러리 활용 심화, 베이직반 실시간 세션 복습


✏️ 오늘 배운 점

머신러닝의 이해와 라이브러리 활용 심화

이상치(Outlier): 보통 관측된 데이터 범위에서 많이 벗어난 아주 작은 값 혹은 큰 값 

1. Extreme Studentized Deviation(ESD)를 이용한 이상치 발견

import numpy as np
mean = np.mean(data)
std = np.std(data)
upper_limit = mean + 3*std
lower_limit = mean - 3*std

 

2. IQR(Inter Quantile Range)를 이용한 이상치 발견

Q1 = df['column'].quantile(0.25)
Q3 = df['column'].quantile(0.75)
IQR = Q3 - Q1
uppper_limit = Q3 + 1.5*IQR
lower_limit = Q1 - 1.5*IQR

 

결측치(Missing Value): 존재하지 않는 데이터

  • 결측치 처리 방법
    • 수치형 데이터
      • 평균 값 대치: 대표적인 대치 방법
      • 중앙값 대치: 데이터에 이상치가 많아 평균 값이 대표성이 없다면 중앙 값을 이용
    • 범주형 데이터
      • 최빈값 대치
    • 사용 함수
      • sklearn.impute.SimpleImputer:평균, 중앙, 최빈값으로 대치
        • SimpleImputer.statistics_ : 대치한 값 확인 가능
      • sklearn.impute.IterativeImputer: 다변량대치(회귀 대치)
      • sklearn.impute.KNNImputer: KNN 알고리즘을 이용한 대치

인코딩(Encoding): 범주형 데이터에 대한 전처리

1. 레이블 인코딩(Label Encoding)

  • 정의: 문자열 범주형 값을 고유한 숫자로 할당
    • 1등급 → 0
    • 2등급 → 1
    • 3등급 → 2
  • sklearn.preprocessing.LabelEncoder
  • 메소드
    • fit: 데이터 학습
    • transform: 정수형 데이터로 변환
    • fit_transform: fit과 transform을 연결하여 한번에 실행
    • inverse_transform : 인코딩된 데이터를 원래 문자열로 변환

2. 원-핫 인코딩(One-Hot Encoding)

  • 정의: 각 범주를 이진 형식으로 변환하는 기법
    • 빨강 → [1,0,0]
    • 파랑 → [0,1,0]
    • 초록 → [0,0,1]
  • pd.get_dummies
  • sklearn.preprocessing.OneHotEncoder
  •  메소드
    • fit: 데이터 학습
    • transform: 정수형 데이터로 변환
    • fit_transform: fit과 transform을 연결하여 한번에 실행
    • inverse_transform: 인코딩된 데이터를 원래 문자열로 변환
    • categories_: 인코더가 학습한 클래스(범주)
    • get_feature_names_out(): 학습한 클래스 이름(리스트)
# CSR 데이터 데이터프레임으로 만들기
csr_df = pd.DataFrame(csr_data.toarray(), columns = oe.get_feature_names_out())
# 기존 데이터프레임에 붙이기(옆으로)
pd.DataFrame([titaninc_df,csr_df], axis = 1)

 

스케일링(Scaling): 수치형 자료에 대한 전처리

1 .표준화(Standardization)

  • 각 데이터에 평균을 빼고 표준편차를 나누어 평균을 0 표준편차를 1로 조정하는 방법
  • 수식

  • 함수: sklearn.preprocessing.StandardScaler
    • 메소드
      • fit : 데이터학습(평균과 표준편차를 계산)
      • transform: 데이터 스케일링 진행
    • 속성
      • mean_: 데이터의 평균 값
      • scale_, var_: 데이터의 표준 편차,분산 값
      • n_features_in_: fit 할 때 들어간 변수 개수
      • feature_names_in_: fit 할 때 들어간 변수 이름
      • n_samples_seen_ : fit 할 때 들어간 데이터의 개수
    2. 정규화(Normalization)
    • 정의: 데이터를 0과 1사이 값으로 조정(최소값 0, 최대값 1)
    • 수식

  • 함수: sklearn.preprocessing.MinMaxScaler
    • 메소드
      • fit : 데이터학습(평균과 표준편차를 계산)
      • transform: 데이터 스케일링 진행
    • 속성
      • data_min_: 원 데이터의 최소 값
      • data_max_: 원 데이터의 최대 값
      • data_range_ : 원 데이터의 최대-최소 범위

3. 로버스트 스케일링(Robust Scaling)

  • 정의: 중앙값과 IQR을 사용하여 스케일링.
  • 수식

  • 함수: sklearn.preprocessing.RobustScaler
    • 속성
      • center_: 훈련 데이터의 중앙값

과적합(Overfitting): 데이터를 과도하게 학습한 나머지 해당 문제만 잘 맞추고 새로운 데이터를 제대로 예측 혹은 분류하지 못하는 현상

  • 모형이 지나치게 복잡할 때 : 과대 적합이 될 수 있음
  • 모형이 지나치게 단순할 때: 과소 적합이 될 수 있음

☑️ 과적합 해결 - 테스트 데이터의 분리

  • 학습 데이터(Train Data): 모델을 학습(fit)하기 위한 데이터
  • 테스트 데이터(Test Data): 모델을 평가 하기 위한 데이터

함수: sklearn.model_selection.train_test_split

  • 파라미터
    • test_size: 테스트 데이터 세트 크기
    • train_size: 학습 데이터 세트 크기
    • shuffle: 데이터 분리 시 섞기
    • random_state: 호출할 때마다 동일한 학습/테스트 데이터를 생성하기 위한 난수 값. 수행할 때 마다 동일한 데이터 세트로 분리하기 위해 숫자를 고정 시켜야 함
  • 반환 값(순서 중요)
    • X_train, X_test, y_train, y_test

의사결정나무: 나무 구조로 나타내어 전체 자료를 몇 개의 소집단으로 분류하거나 예측을 수행하는 분석 방법

  • 장점
    • 쉽고 해석하기 용이
    • 다중분류와 회귀에 모두 적용이 가능
    • 이상치에 견고하며 데이터 스케일링이 불필요(데이터의 상대적인 순서를 고려해서)
  • 단점
    • 나무가 성장을 너무 많이하면 과대 적합의 오류에 빠질 수 있다.
    • 훈련 데이터에 민감하게 반응하여 작은 변화가 노이즈에도 나무의 구조가 크게 달라짐(불안정성)
  • Python 라이브러리
    • sklearn.tree.DecisionTreeClassifier
    • sklearn.tree.DecisionTreeRegressor

의사결정나무는 과적합과 불안정성 문제가 많았기에 랜덤 포레스트를 활용하여 문제를 해결하였다.

☑️ 배깅(Bagging)의 원리

  • 언제나 머신러닝은 데이터의 부족이 문제
  • 이를 해결 하기 위한 Bootstrapping + Aggregating 방법론
    • Bootstrapping: 데이터를 복원 추출해서 유사하지만 다른 데이터 집단을 생성하는 것
    • Aggregating: 데이터의 예측,분류 결과를 합치는 것
    • Ensemble(앙상블): 여러 개의 모델을 만들어 결과를 합치는 것

☑️ Tree를 Forest로 만들기

  • 여러 개의 데이터 샘플에서 각자 의사결정트리를 만들어서 다수결 법칙에 따라 결론을 냄

☑️ 랜덤 포레스트 정리

  • 장점
    • Bagging 과정을 통해 과적합을 피할 수 있다.
    • 이상치에 견고하며 데이터 스케일링이 불필요
    • 변수 중요도를 추출하여 모델 해석에 중요한 특징을 파악 할 수 있다.
  • 단점
    • 컴퓨터 리소스 비용이 크다.
    • 앙상블 적용으로 해석이 어렵다.
  • Python 패키지
    • sklearn.ensemble.RandomForestClassifer
    • sklearn.ensemble.RandomForestRegressor

K-Nearest Neighbor(KNN): 주변의 데이터를 보고 내가 알고 싶은 데이터를 예측하는 방식

  • 주변 데이터 K개를 선정 후에 거리 기준으로 가장 많은 것으로 예측하는 것이 바로 KNN의 기본 원리

☑️ 하이퍼 파라미터의 개념

  • 파라미터(Parameter): 머신러닝 모델이 학습 과정에서 추정하는 내부 변수이며 자동으로 결정 되는 값
    • Ex) 선형회귀에서 가중치와 편향
    • (혼동주의) Python에서는 함수 정의에서 함수가 받을 수 있는 인자(입력 값)를 지정하는 개념
  • 하이퍼 파라미터(Hyper parameter): 데이터 과학자가 기계 학습 모델 훈련을 관리하는데 사용하는 외부 구성변수이며 모델 학습과정이나 구조에 영향을 미침

☑️ KNN 모델의 정리

  • 장점
    • 이해하기 쉽고 직관적
    • 모집단의 가정이나 형태를 고려하지 않음
    • 회귀, 분류 모두 가능함
  • 단점
    • 차원 수가 많을 수록 계산량이 많아짐
    • 거리 기반의 알고리즘이기 때문에 피처의 표준화가 필요함
  • Python 라이브러리
    • sklearn.neighbors.KNeighborsClassifier
    • sklearn.neighbors.KNeighborsRegressor

부스팅(Boosting): 여러 개의 약한 학습기(weak learner)를 순차적으로 학습하면서 잘못 예측한 데이터에 가중치를 부여하여 오류를 개선해나가는 학습 방식

  • 부스팅 알고리즘 종류
    • Gradient Boosting Model
      • 특징
        • 가중치 업데이트를 경사하강법 방법을 통해 진행
      • Python 라이브러리
        • sklearn.ensemble.GradientBoostingClassifier
        • sklearn.ensemble.GradientBoostingRegressor
    • XGBoost
      • 특징
        • 트리기반 앙상블 기법으로, 가장 각광받으며 Kaggle의 상위 알고리즘
        • 병렬학습이 가능해 속도가 빠름
      • Python 라이브러리
        • xgboost.XGBRegressor
        • xgboost.XGBRegressor
    • LightGBM
      • 특징
        • XGBoost와 함께 가장 각광받는 알고리즘
        • XGBoost보다 학습시간이 짧고 메모리 사용량이 작음
        • 작은 데이터(10,000건 이하)의 경우 과적합 발생
      • Python 라이브러리
        • lightgbm.LGBMClassifier
        • lightgbm.LGBMRegressor

베이직반 복습

Pandas 라이브러리

  • Series: 1차원 데이터 구조(리스트와 비슷하지만 인덱스를 포함).
  • DataFrame: 2차원 데이터 구조(엑셀 시트와 유사).이 두 구조는 데이터를 효율적으로 저장하고 처리하는 데 필수적

- 데이터 전처리

import pandas as pd
import numpy as np

series = pd.Series(data)
df = pd.DataFrame(data)

# 정수형 인덱스로 접근
.iloc[]
# 인덱스 이름으로 접근
.loc[]
# 특정값이 포함되어 있는지 여부 확인
isin()
# 컬럼 삭제
df.drop(axis=1)
# 행 삭제
df.drop(axis=0)
# 결측치가 있는 행 제거
df.dropna()
# 결측치가 있는 열 제거
df.dropna(axis=1)
# 평균으로 대체(연속형 데이터)
df['컬럼명'].fillna(df['컬럼명'].mean())
# 중앙값으로 대체(이상치가 있을 때 추천)
df['컬럼명'].fillna(df['컬럼명'].median())
# 최빈값으로 대체(범주형 데이터)
df['컬럼명'].fillna(df['컬럼명'].mode())
# 행과 열 전치
df.transpose()
# 원하는 컬럼만 조회하기
print(df['컬럼명'])
# 컬럼 삭제
df = df.drop('컬럼명', axis= )
# 행 삭제
df.drop(index=' ', inplace=True(원본 df 변경) or False(새로운 df 생성))
# 컬럼별 결측치 개수
df.isnull().sum()
# 중복값 확인
df.duplicated().sum()
# 범주화 데이터 처리
df['컬럼명'] = pd.cut(df['컬럼명'], bins = bins, labels = labels, include_lowest=True)
# datetime 변환 
df["날짜"] = pd.to_datetime(df["날짜"], format="mixed", errors="coerce")
--> format="mixed": 여러 형태의 날짜 데이터 통일화
--> errors: raise(에러 출력), ignore(그대로 남기기), coerce(결측치로 처리)
# datetime으로 타입 변환
df["date"] = pd.to_datetime(df["date"])
# 데이터 정렬
.sort_values(by="컬럼명", ascending=True(오름차순), False(내림차순))
# 인덱스 기준 데이터 정렬
.sort_index(ascending=True(오름차순), False(내림차순))

# KNN IMputation
from sklearn.impute import KNNImputer
imputer_knn = KNNImputer(n_neighbors=n)
데이터가 1000~5000 --> n=3~5
데이터가 5000~10000 --> n=7~10
df_knn_imputed = imputer_knn.fit_transform(df)
df_knn_imputed = pd.DataFrame(df_knn_imputed), columns=df.columns)

 

- 데이터 시각화

import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
import seaborn as sns

# 공통
plt.figure(figsize=(a, b))

# Line plot
plt.plot(data, label='이름', linewidth=숫자)

# Bar Plot
sns.catplot(kind='bar', data=data, x=x, y=y, hue='색상')

# Histogram
plt.hist(data, bins=bins(막대 개수), alpha=투명도(0.0~10.0) , label=label)

# Boxplot
sns.boxplot(x=x, y=y, data=data)

# Violine Plot
sns.violinplot(x=x, y=y, data=data, inner='quartile'(중앙값과 IQR 표시), palette=색상)

# KDE Plot
sns.kdeplot(data, label=label, fill=True(곡선 아래 영역 채우기), alpha=투명도(0.0~10.0))

✏️ 오늘의 핵심

데이터 타입·분포에 맞춘 결측/이상치 처리와 누수 없는 인코딩·스케일링을 표준화하고, 트리·앙상블·KNN의 전제조건을 지키면, 모델을 바꿔도 흔들리지 않는 재현 가능한 파이프라인이 됩니다.


📌추가로 해야할 점

통계 및 머신러닝 개인과제, 졸업시험