Notice
Recent Posts
Recent Comments
Link
«   2025/05   »
1 2 3
4 5 6 7 8 9 10
11 12 13 14 15 16 17
18 19 20 21 22 23 24
25 26 27 28 29 30 31
Archives
Today
Total
관리 메뉴

여유로움

[11.28 일] 빅데이터 분석기사 실기 - Machine Learning (5~8강) 본문

셀프스터디/빅데이터 분석기사

[11.28 일] 빅데이터 분석기사 실기 - Machine Learning (5~8강)

티로즈 2021. 11. 28. 17:52

1. 지도학습과 비지도학습

  • 지도학습(Supervised)
    • 입력, 출력 데이터가 제공되는 학습
    • 이미 알려진 사례를 바탕으로 일반화된 모델 구축
    • 종류 : Regression, Classification
    • 회귀(Regression) : 숫자화 된 데이터로 예측하는 것 (학습에서 주어진 것 이외의 작은 값, 사잇값, 큰 값이 있을 수 있음)
    • 분류(Classification) : 어떤 데이터에 대한 category를 예측하는 것 (학습에서 주어진 것 이외에 다른 category 없음)
  • 비지도학습(Unsupervised)
    • 입력은 주어지지만 출력은 제공되지 않음
    • 기계가 알아서 학습하여 결과를 찾아내는 방법
    • 종류 : Clustering, Demension Reduction, Association(연관)
    • 군집화(Clustering) – 비슷한 특징을 가진 아이템을 그룹화 하는 것

 

2. 데이터 세트(Data set)

  • Data Set : 머신러닝에서 입력(X), 출력(Y)에 사용되는 데이터 묶음
  • Data Set는 1개 이상의 입력과 1개의 출력으로 구성됨
  • 지도 학습에서 입력으로 사용되는 것이 X, 출력으로 사용되는 것이 Y
    • X : 2차원 구조이며, 1개 sample은 1차원 구조 임
    • Y : 1차원 구조, 1개 sample에 대한 target은 1개 scalar 값

 

3. 홀드 아웃(Hold out)

  • 성능 검증을 위해 Data Set을 Train Set, Test Set으로 분리하여 사용함
    • Train Set은 학습에, Test Set은 성능 검증을 위해 사용됨
    • 일반적으로 7:3 ~ 8:2로 많이 구분함
  • 본 수업에서의 데이터 이름
    • X_train.csv : x_train, x_test
    • Y_train.csv : y_train, y_test
    • X_test.csv : x_submission

 

4. 교차검증(Cross Validation)

  • 데이터가 충분하지 않을 경우 Hold-out으로 나누면 많은 양의 분산 발생
  • 이에 대한 해결책으로 교차검증을 사용할 수 있음
  • 클래스 불균형 데이터에는 적합하지 않음
  • 주어진 데이터를 가지고 반복적으로 성과를 측정하여 그 결과를 평균한 것으로 모형 평가

 

5. 오버피팅(Overfitting)

  • 머신러닝 진행 시 주의해야되는 가장 중요한 문제 중 하나
  • Overfitting 은 너무 잘 맞아 떨어진다는 의미임
  • Training data에만 너무 잘 맞아 Training data 이외의 데이터들에 대해서는 잘 맞아 떨어지지 않는 경우
  • 해결 방법
    • Cross Validation (교차검증)
    • Regularization (정규화)
    • Remove Features
    • Ensembling (앙상블 기법)
  • underfitting : 아직 학습이 제대로 이루어지지 않은 상태
  • 적절한(appropriate) 학습이 좋음!

                      순서대로 Underfitting, Appropriate, Overfitting

 

6. 파라미터(Parameter)와 하이퍼파라미터(Hyper-Parameter)

  • 머신러닝 모델의 Parameter : 모델의 구성요소, 데이터로부터 학습되는 것
  • 머신러닝 모델의 Hyperparameter : 모델 학습 과정에 반영되며, 학습을 시작하기 전에 미리 값을 결정하는 것
  • Parameter : Linear Regression에서 y = Wx + b 와 같은 직선 방정식의 W, b를 찾는 것
  • Hyperparameter : kNN에서 k의 개수, Ridge, Lasso의 α값, Learning Rate 등

 

7. scikit-learn(sklearn) library 사용

# [0] 라이브러리 import
import pandas as pd
from sklearn.preprocessing import StandardScaler
from sklearn.model_selection import train_test_split
from sklearn.neighbors import KNeighborsClassifier

 

8. 데이터 전처리

  • sklearn.preprocessing.StandardScaler
    • fit(X_train) : 전처리에 필요한 값 준비, return scaler
    • transform(X_train) : 전처리 실행, return 변환된 값

    • fit_transform(X_train) : 전처리에 필요 값 준비 및 처리, return 변환된 값
[방법1] X_train, X_test를 합쳐서 전처리 작업
  • 전처리 작업 후 분리해서 X_train은 학습모델을 생성, X_test 제출용값을 구하는 데 사용
  • scaler.fit_transform(X_train + X_test)
[방법2] X_train, X_test를 각 각 전처리 작업
  • X_train에 적용된 전처리가 그대로 X_test에 적용되어야함
  • scaler.fit(X_train) : 전처리에 필요한 값 준비
  • scaler.transform(X_train) : X_train 전처리 실행
  • scaler.transform(X_test) : X_test 전처리 실행
# [2] X, Y 데이터로 분리
X = df.iloc[:,:-1]
Y = df['target'#df.iloc[:,-1]

# [방법1] StandardScaler 사용하여 표준 정규 분포 만들기 -  fit_transform(X)
scaledX = StandardScaler().fit_transform(X)
print(scaledX.mean(), scaledX.std()) #표준정규분포 : 평균 0, 표준편차 1

# [방법2] StandardScaler 사용하여 표준 정규 분포 만들기 - fit(), transform()
scaler = StandardScaler().fit(X) #스케일러를 가져옴
scaledX = scaler.transform(X) #X_train
print(scaledX.mean(), scaledX.std())
scaledX_submission = scaler.transform(X_test)

 

9. 데이터 분할

  • sklearn.model_selection.train_test_split
  • x_train, x_test, y_train, y_test = train_test_split(X, Y, test_size, train_size, random_state, shuffle, stratify)
    • 배열들을 지정된 비율로 나눠서 반환
    • test_size = 0.25 : 0.0~1.0 테스트 데이터셋 비율
    • train_size = None : 0.0~1.0 훈련 데이터셋 비율
    • random_state = None : 정수 값, 난수 발생의 시드(seed) 값
    • shuffle = True : boolean 값을 전달해서 섞을지 말지 결정 (기본값=True)
    • stratify : Y의 지정한 데이터 비율을 유지(층화추출), Y가 범주형일 때 사용함
from sklearn.model_selection import train_test_split
# [4] train, test 세트 8:2로 나누기
a = list(range(10))
x_train, x_test= train_test_split(a, test_size=0.2)
x_train, x_test

# [5] 층화추출 이해 (비율 맞춰 나누기)
a = [1123] * 5   # 20개 데이터   8:2 (4 : 1)
x_train, x_test = train_test_split(a, test_size=0.2, stratify=a) #층화추출
print(x_train, x_test)

# [6] 여러 개 데이터셋을 분할
a = list(range(10)) #행의 개수가 같아야 함
b = list(range(10))
train_test_split(a,b,test_size=0.2)

# [7] scaledX, Y를 사용하여 train_size : test_size 를 0.8 : 0.2로 나누기, 
# random_state = 0 사용, 층화추출, 데이터 섞기 사용

x_train, x_test, y_train, y_test = train_test_split(scaledX, Y, test_size=0.2, random_state=0, stratify=Y) #보통 Y 비율에 맞춤

print(x_train.shape, x_test.shape, y_train.shape, y_test.shape)

 

10. 머신러닝 모델(Estimator) Interface

sklearn.base.BaseEstimator
  • 모델의 기반 클래스 모든 머신러닝 모델(Estimator)은 반드시 상속 구현
  • 학습/훈련, 예측, 평가/검정 방법 인터페이스 일관성 제공
  • BaseEstimator를 상속받아 만들어진 모델들은 개별 알고리즘으로 구현, 동일 interface를 사용
  • fit(X_train, y_train) : 모델 학습/훈련
  • score(X_test, y_test) : 성능 측정 : 1에 가까울수록 좋은 성능
  • predict(X_test) : 예측 값 반환
KNeighborsClassifier(n_neighbors=5, *, weights='uniform', algorithm='auto'
                     leaf_size=30, p=2, metric='minkowski', metric_params=None, n_jobs=None)

# [8] 모델 생성 및 학습
# k가 3인 knn 분류기 생성
knn = KNeighborsClassifier(n_neighbors=3)
# knn 에 Train set 전달하여 모델 생성(학습)
knn.fit(x_train, y_train)
# 동일한 결과: knn = KNeighborsClassifier(n_neighbors=3).fit(x_train, y_train)

# [9] 평가하기
# train set, test set을 각각 사용함
print('train 성능 :', knn.score(x_train, y_train) )
print('test  성능 :', knn.score(x_test, y_test))

# 성능이 낮은 경우 : hyperparameter 조절, model을 변경, 데이터의 전처리를 변경 등을 통해 성능을 향상할 수 있음

# [10-1] knn 모델에 Test set 적용하여 예측치 얻기
pred = knn.predict(x_test)
pred

# [10-2] 예측 확률 값
pred_proba = knn.predict_proba(x_test)
print(pred_proba)

 

출처 : 유튜브 강의 EduAtoZ