TIL

내일배움캠프 본캠프 21일차 - 머신러닝 특강(사이킷런)/진로고민

수현조 2024. 12. 23. 21:15

사이킷 런에서

사이킷런(Scikit-learn)은 머신러닝을 위한 강력한 파이썬 라이브러리로, 데이터 전처리, 모델 학습, 평가 등 다양한 기능을 제공합니다. 결측치 처리, 원-핫 인코딩, 스케일링 이외에도 많은 기능이 있으며, 이를 체계적으로 정리해보겠습니다.


1. 데이터 전처리 기능

데이터를 학습 가능한 형태로 변환하는 작업이 중요합니다. 사이킷런은 다양한 전처리 도구를 제공합니다.

1.1 결측치 처리

  • SimpleImputer
    • 결측치를 평균, 중앙값, 최빈값 등으로 채우는 도구.
    • 예:
      from sklearn.impute import SimpleImputer
      imputer = SimpleImputer(strategy='mean')  # 'mean', 'median', 'most_frequent'
      X = imputer.fit_transform(X)
  • KNNImputer
    • K-최근접 이웃(KNN)을 기반으로 결측치를 채웁니다.
    • 예:
      from sklearn.impute import KNNImputer
      imputer = KNNImputer(n_neighbors=5)
      X = imputer.fit_transform(X)

1.2 카테고리 데이터 처리

  • OneHotEncoder
    • 범주형 데이터를 원-핫 인코딩으로 변환.
    • 예:
      from sklearn.preprocessing import OneHotEncoder
      encoder = OneHotEncoder()
      X_encoded = encoder.fit_transform(X)
  • OrdinalEncoder
    • 카테고리 데이터를 정렬된 정수 값으로 변환.
    • 예:
      from sklearn.preprocessing import OrdinalEncoder
      encoder = OrdinalEncoder()
      X_encoded = encoder.fit_transform(X)

1.3 스케일링 및 정규화

1. 스케일링 및 정규화의 차이

  • 스케일링: 데이터의 크기를 조정하여 모든 feature가 동일한 범위를 가지도록 변환. (예: 0~1, 평균 0 & 표준편차 1)
  • 정규화: 각 데이터 포인트를 벡터의 크기로 나눠 조정. (예: 유클리드 노름으로 벡터 크기를 1로 조정)

2. 주요 스케일링 방법

2.1 StandardScaler (표준화)

  • 목적: 평균 0, 표준편차 1로 데이터를 변환.
  • 적합한 경우: 데이터가 정규분포(가우시안 분포)를 따를 때.

코드 예제:

from sklearn.preprocessing import StandardScaler
import numpy as np

# 데이터 생성
X = np.array([[1.0, 2.0, 3.0], [4.0, 5.0, 6.0], [7.0, 8.0, 9.0]])

# 스케일링 적용
scaler = StandardScaler()
X_scaled = scaler.fit_transform(X)

print("스케일링 후 데이터:")
print(X_scaled)

2.2 MinMaxScaler (최소-최대 정규화)

  • 목적: 데이터를 0~1 사이의 값으로 변환.
  • 적합한 경우: 데이터 분포가 정규분포가 아니며, 이상치가 없을 때.

코드 예제:

from sklearn.preprocessing import MinMaxScaler

# 데이터 생성
X = np.array([[1.0, 2.0, 3.0], [4.0, 5.0, 6.0], [7.0, 8.0, 9.0]])

# 정규화 적용
scaler = MinMaxScaler()
X_normalized = scaler.fit_transform(X)

print("정규화 후 데이터:")
print(X_normalized)

2.3 RobustScaler

  • 목적: 중앙값(median)과 IQR(Interquartile Range)을 사용해 데이터를 변환.
  • 적합한 경우: 이상치(outlier)에 민감하지 않은 스케일링이 필요할 때.

코드 예제:

from sklearn.preprocessing import RobustScaler

# 데이터 생성
X = np.array([[1.0, 2.0, 100.0], [4.0, 5.0, 200.0], [7.0, 8.0, 300.0]])

# RobustScaler 적용
scaler = RobustScaler()
X_robust_scaled = scaler.fit_transform(X)

print("RobustScaler 후 데이터:")
print(X_robust_scaled)

3. 주요 정규화 방법

3.1 Normalizer (벡터 정규화)

  • 목적: 각 샘플의 크기(노름, norm)를 1로 조정.
  • 적합한 경우: 데이터가 방향성에 더 의미가 있을 때(예: 텍스트 데이터의 TF-IDF).

코드 예제:

from sklearn.preprocessing import Normalizer

# 데이터 생성
X = np.array([[1, 2, 3], [4, 5, 6], [7, 8, 9]])

# Normalizer 적용
normalizer = Normalizer()
X_normalized = normalizer.fit_transform(X)

print("Normalizer 후 데이터:")
print(X_normalized)

4. 스케일링 및 정규화 비교

방법 적용 목적 특징 적용 시 주의점
StandardScaler 평균 0, 표준편차 1 정규분포에 적합 이상치에 민감
MinMaxScaler 0~1 사이 값 데이터 범위가 정해져 있을 때 적합 이상치에 민감
RobustScaler 중앙값과 IQR 이상치 영향을 줄이고 싶을 때 적합 데이터 중심이 중요하지 않을 때
Normalizer 벡터 크기 1로 정규화 방향성 데이터에 적합 데이터 스케일 정보 손실

5. 실전 활용 팁

  1. 훈련 데이터와 테스트 데이터를 동일하게 변환
    • fit은 훈련 데이터에만 사용하고, 테스트 데이터는 transform만 수행.
  2. 모델의 요구사항에 맞게 선택
    • 거리 기반 알고리즘(KNN, K-Means 등): MinMaxScaler 추천.
    • 선형 모델(SVM, Logistic Regression 등): StandardScaler 추천.
  3. 이상치가 많은 경우 RobustScaler 사용
    • MinMaxScaler나 StandardScaler는 이상치에 취약.

예제: 모든 스케일링 방법 비교

import numpy as np
from sklearn.preprocessing import StandardScaler, MinMaxScaler, RobustScaler, Normalizer

# 데이터 생성
X = np.array([[1, -1, 2],
              [2, 0, 0],
              [0, 1, -1]])

# 각각의 스케일링 적용
scalers = {
    "StandardScaler": StandardScaler(),
    "MinMaxScaler": MinMaxScaler(),
    "RobustScaler": RobustScaler(),
    "Normalizer": Normalizer()
}

# 결과 출력
for scaler_name, scaler in scalers.items():
    print(f"{scaler_name} 적용 결과:")
    print(scaler.fit_transform(X))
    print()


2. 특징 엔지니어링

특징 생성과 선택을 위한 도구들입니다.

2.1 다항식 특징

  • PolynomialFeatures
    • 기존 feature를 사용해 다항식 feature 생성.
    • 예:
      from sklearn.preprocessing import PolynomialFeatures
      poly = PolynomialFeatures(degree=2, include_bias=False)
      X_poly = poly.fit_transform(X)
      

2.2 특징 선택

  • SelectKBest
    • 통계 검정(카이제곱, 분산 분석 등)을 기반으로 가장 중요한 K개의 feature를 선택.
    • 예:
      from sklearn.feature_selection import SelectKBest, chi2
      selector = SelectKBest(chi2, k=3)
      X_new = selector.fit_transform(X, y)
      
  • RFE (Recursive Feature Elimination)
    • 모델 기반으로 feature를 순차적으로 제거하여 최적의 feature 집합 선택.

3. 데이터 변환

데이터를 변환하거나 특성을 조정하는 도구입니다.

3.1 데이터 변환

  • PowerTransformer
    • 데이터의 분포를 정규 분포에 가깝게 변환.
    • 예: Box-Cox, Yeo-Johnson 변환.
    • 예:
      from sklearn.preprocessing import PowerTransformer
      pt = PowerTransformer(method='yeo-johnson')
      X_transformed = pt.fit_transform(X)
      
  • QuantileTransformer
    • 데이터를 특정 분위에 따라 정규화.

3.2 데이터 비율 조정

  • Binarizer
    • 특정 임계값을 기준으로 데이터를 이진화(0, 1) 처리.
  • Normalizer
    • 각 데이터 벡터의 크기를 1로 조정(유클리디안 거리 기준).

4. 데이터 샘플링

불균형 데이터 문제를 해결하거나 샘플링을 위한 도구.

4.1 SMOTE

  • Synthetic Minority Oversampling Technique.
  • 소수 클래스 샘플을 생성하여 데이터 균형 맞춤.

4.2 Train-Test Split

  • 학습 데이터와 테스트 데이터를 나누는 도구.
  • 예:
    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)
    

여기서부터 아직 잘 모름

5. 모델 평가

5.1 교차 검증

  • KFold
    • 데이터를 K개의 폴드로 나누어 교차 검증 수행.
    • 예:
      from sklearn.model_selection import KFold
      kf = KFold(n_splits=5)
      for train_index, test_index in kf.split(X):
          X_train, X_test = X[train_index], X[test_index]
      
  • StratifiedKFold
    • 데이터의 클래스 비율을 유지한 교차 검증.

5.2 평가 메트릭

  • 정확도, F1 스코어, ROC-AUC 등을 계산.
    from sklearn.metrics import accuracy_score, f1_score
    print(accuracy_score(y_true, y_pred))
    print(f1_score(y_true, y_pred))
    

여기도 아직 잘 모름

6. 파이프라인

전처리와 모델 학습을 하나의 워크플로우로 구성.

from sklearn.pipeline import Pipeline
from sklearn.ensemble import RandomForestClassifier
from sklearn.preprocessing import StandardScaler

pipeline = Pipeline([
    ('scaler', StandardScaler()),
    ('model', RandomForestClassifier())
])

pipeline.fit(X_train, y_train)

이건 또 뭘까

7. 모델 튜닝

GridSearchCV

  • 다양한 하이퍼파라미터 조합을 테스트하여 최적값을 찾음.
  • 예:
    from sklearn.model_selection import GridSearchCV
    param_grid = {'n_estimators': [10, 50, 100]}
    grid = GridSearchCV(estimator=RandomForestClassifier(), param_grid=param_grid, cv=3)
    grid.fit(X, y)
    

RandomizedSearchCV

  • 무작위로 하이퍼파라미터를 선택하여 최적 조합을 찾음.

정리

사이킷런은 단순한 머신러닝 모델 제공뿐 아니라 데이터 전처리, 평가, 튜닝, 파이프라인 구성 등 머신러닝 워크플로우 전체를 지원합니다. 이를 효과적으로 활용하면 작업 효율성을 크게 높일 수 있습니다.

 

배가고프고 배가고픈데 귀찮아서 일어나지를 못하겠고 배고프고 엄마가 보고싶고 피곤하고 뭐 별거 한것도 없는데 어떻게 이렇게 힘든지 집에있는데 왜 집에가고싶은지 아무튼

자격증에 대한 필요성을 느꼈다.

안일했구나 싶었고 그러면서도 안 안일하면 어쩔건데 싶었고

정보처리기사, adsp 라는 자격증을 알게되었고

책 사서 공부해야지 뭐 별 수 있나

머신러닝 딥러닝이 끝이 아니라는 게 놀랍기만 하다

쟝고라고..?

국비지원 강의니까 취업도 국가가 시켜주면 좋겠다ㅎ

이 기간동안 할 수 있는 만큼 다 해 봐야겠다는..생각이 들었다.

배가고프다............ 귀찮아서 걍 자야겠다