ASAC 빅데이터 분석가 7기/ASAC 일일 기록

ASAC 빅데이터 분석가 과정 31일차 (25.01.17)

junslee 2025. 1. 17. 09:20

어제 배운 내용 복습


특징 처리

Tree 모형으로 만들면 정규성을 최소화로 만들 수 있다
KNN은 잘 사용 안함 (알고리즘으로 취급 안함)

scikit-learn 소개

# 0. 데이터 핸들링 + 수집 + 전처리
import pandas as pd
import numpy as np

  • 1. scikit-learn이 ML을 전통적인 모델링
    => 필요한 중간에 잡단한 모듈들을 잘 만들어 둔다
    지금은 중간에 매개체의 역할
# 1-1) 샘플 데이터 : 수집한 데이터 , 받은 데이터
# => mnist 필기체 : openml
from sklearn.datasets import fetch_openml
# -> 2025.1.17 기준 openml사이트가 좀 이상함 - 데이터 로딩 안됨

# 1-2) 주어진 데이터를 분리 : train_test_split
from sklearn.model_selection import train_test_split

# 1-3) 내가 사용할 / 피팅을 할 f 의 스타일 : 어떤 모델을 사용할지
# knn ,xgboost 같은 외부의 f 스타일을 가지고와서 사용
# 참고) 파이썬/scikit-learn : 분류 => Classfier
#                                           회귀 => Regressor
# => 사용할 알고리즘 + 목적성(분류/회귀)
# ref : https://scikit-learn.org/stable/modules/generated/sklearn.neighbors.KNeighborsClassifier.html
from sklearn.neighbors import KNeighborsClassifier

# 1-4) 평가 : 여러가지 평가지표 -> 성능 판단
# 분류에서 가장 간단한 acc  etc
# : scikit-learn 없는 지표도 있다 직접 만들어서 해야 한다
from sklearn.metrics import accuracy_score

  • 참고) colab이 어느 버전을 사용하는지 체크
import sklearn
sklearn.__version__ # _ 앞뒤로 2개씩
'1.6.0'
28*28
784

  • 참고) 간단하게 openml 안되서 sklearn 8*8 우회
from sklearn.datasets import load_digits
data = load_digits()
data
# 출력 생략
type(data)

data.keys()
dict_keys(['data', 'target', 'frame', 'feature_names', 'target_names', 'images', 'DESCR'])
data["data"]

data["data"].shape
(1797, 64)

  • 주어진 데이터의 Feature쪽 : 속성 -> 2D Matrix
X = data["data"]
X.shape
  • 정답에 대한 부분
data["target"].shape
y = data["target"]
y.shape
(1797,)

  • 주어진 데이셋에 대해서
    F를 최적화 하는데 사용할 데이터 : train
    F를 최적화 하고, 평가를 하기 위해서 사용할 데이터 : test
    : 자체 평가(vald), 실전 평가(test)
train_X, test_X, train_y, test_y = train_test_split(
    X, # 문제지
    y, # 문제에 대응되는 정답지
    test_size = 0.25, # 전체 데이터 수 중에서 25프로를 test 분리
    #RandomSampling => 재현성 시드값
    # 기본 옵션 : shuffle =True (X,y에 대해서 RS전에 한 번 흔들고)
    random_state=1234
)

len(X)
1797
len(train_X)
1347
len(test_X)
450
len(test_X)/ len(X)
0.25041736227045075

  • 1개 샘플에 대해서 확인
train_X.shape
(1347, 64)
train_X[0]


  • # 1개 샘플의 원본의 데이터가 2D -> ML 적용하기 위해서 1차원으로 변환
    # => EDA 하기 위해서는 2D
import seaborn as sns
sns.heatmap( train_X[10].reshape(8,8))

train_y[10]
3

  • EDA를 통해서 주요한 변수들에 대한 작업
    수치적으로 PCA + 차원을 줄이는 방향 (Algo)
    도메인 지식활용( 변수 생성 + 가공 ) <= ML의 핵심


  • 정답 : 정답에 대한 분포
    -> pandas : value_counts()
    => numpy에 있는 unique()

  • 목적성
    정답의 종류 + 분포/비율 => 지표 + 학습의 방법론
    너무 심한 비대칭일 때 여러 고민을 해야 한다(지표 + 기술적인 방법)

np.unique(train_y)
# => 0~9까지 10개 중에 1개를 맞추자!! 분류(멀티 클래스)
array([0, 1, 2, 3, 4, 5, 6, 7, 8, 9])
np.unique(train_y, return_counts=True)


  • 정답의 종류 : 10가지
    분포 : 대략 어비슷하게 존재 130개 내외
    => accuracy 같은 지표를 사용을 해도 괜찮지 않을까
    평가 지표에 대한 고민을 해야한다

  • 돌려보려는 모델들에 대한 세팅 : F에 대한 세팅
    f : knn분류 : 메뉴얼을 보고 선택( pycaret 패키지 : 자기가 알아서 돌림)
# 1) 사용할 모델을 불러와야 함
knn = KNeighborsClassifier(n_neighbors=5, n_jobs=-1)
  • 엄청나게 큰 데이터와 무거운 모델을 n_job=-1 : 렉걸림
    GPU 병렬처리 지원하지 않는다
    CPU의 코어수
  •  F에 대한 구체적인 세팅 HPT 모델의 성능을 많이 좌우를 한다
    Hyperparmeter Tunning 성능
    - 직접 내가 하나씩 조합을 test(100) : gridsearch
    - 랜던 조합으로 선택 test(20)  : randomgirdsearch
    - +베이지안 최적화 : optuna, RayTune etc(200X 초반)
  • AutoML(성능이 그래도 괜찮음)
    Feature 변환 + 처리 + 도메인 지식
# 2) 학습을 수행 : 주어진 데이터에 맞춰서 내가 세팅한(디테일한 F)에 대한 파라미터 최적화 : Learning
# 시간이 오래 걸리는 부분 + k-fold ( * k)
knn.fit(train_X, train_y)

# 3) 2번에서 공부한 내용을 바탕으로 실전 문제를 풀어봐야 한다
# => .predict : 실제 수능 시험의 OMR 카드 작성
pred = knn.predict(test_X)
pred

# 검토
sns.heatmap( test_X[3].reshape(8,8))

test_y[3] # 실제 정답
6
pred[3] # 내가 푼 예상 정답
6
# 4) 평가원처럼 채점 : 전체 문제들에 대한 채점 자동화
# => 기준 : accuracy
accuracy_score(test_y, pred)
0.9822222222222222
  • 100문제 중에서 98문제를 잘 맞췄습니다
  • knn을 가지고 대충 한 번 해보면 acc : 0.98정도
    base_line : acc 0.98
  • 나의 목표 : knn을 가지고 이거보다 더 높은 acc 나오도록
    knn의 구체적인 세팅을 잘 찾아보자 HPT
    : 대회( 수단과 방법을 안 가린)
    + 경우에 따라서는 우연히 1번 잘 나올 수 있으 : k-fold CV 사용
# k-fold cv
from sklearn.model_selection import cross_val_score

  • knn의 f 스타일에서 구체적으로 f 과정에서 n_negihor
    baseline : 0.98
    -> 실험의 값 : n_neighbors = 1,2,3,,,99, etc
    m1) 직접 내가 조합들을 해보는 거 : gridsearchCV
    m2) 랜던하게 샘플링 해서 실험 :randomgridsearchCV
    m3) 베이지안 최적화 : optuna etc
# 직접 하나씩 해보자
# 1) 테스트할 파라미터들을 리스트업
neighbors = [  i for i in range(1,10) if i % 2 ==1]
# => 1,3,5,7,9 : k

# 2) 1개 k값으로 최적화를 하고 결과들을 모을려고 한다
cv_scores = []

# 3) 테스트할 값들을 돌리면 된다
for k in neighbors:
    # 3-1) 모델을 준비
    knn = KNeighborsClassifier(n_neighbors=k, n_jobs=-1)
    # 3-2) k-fold + 평가 -> cross_val_score
    # -> 어떤 모델, 문제, 정답지, 몇 등분, 채점기준
    scores = cross_val_score( knn, train_X, train_y,
                             cv=5, scoring="accuracy")
    # -> k-fold : 5 5번에 대한 acc의 여러 성적에 대해서 대표화 평균
    cv_scores.append(scores.mean() )
    print(str(k)+"-k values Acc:", scores.mean() )
    # print(scores)
    # print(k)


  • f를 다양하게 적용을 하면서 실험
    knn : 거의 사용을 안 한다
    svm : 요즘은 좀 안쓴다
    DT  : 잘 사용을 안 한다 하지만, 최근에 사용하는 모델의 근본
    => 개념은 알아 두어야 한다

  • 여러 모델을 활용한 모델 : 앙상블모델
    -> Bagging : RandomForest
    -> Boosting : xgboost, lightGBM, catBoost etc(대세)
    => 원조는 DT + tree기반의 모형이 가지는 특징

  • 최종 모델을 선택
    1) 했던 여러개의 f 중에서 best 1개 선택
    2) 했던 여러개의 모델을 종합을 해서
    - voting : Hard / Soft
    - Stacking : 대회에서 종종 협업에서는 굳이 안씀
    - Bagging : 스케일 업을 사용해서 팀플

  • 전체적인 느낌
    전체적인 프로세스 : 데이터가 정해지면 루틴이 정해진 작업
    => AutoML

Model : Decision Tree

  • 기준에 따라서 의사결정

  • 분류는 하면 할 수록 Overfit이 가능
    하지만 시간이 너무 걸려 성능이 안좋음
    -> 적당히 분류하고 잘라야 한다 (가지 치기)
    -> 노드의 개수 조절 (분화 조절)

Model : Decision Tree - Classification


  • Ex) 간단한 예시로 DT(Decision Tree)를 만들어보자
    각 Feature들 중에 가장 1순위 Feature를 찾아야 한다
    => 기준 : 지니 계수(Gini index)

  • 지니 계수 계산
    => 안좋은 case (0.5) : 반반
    => 좋은 case : 작을수록 좋음 -> 중요도가 높다

  • DT 2번 가지까지 완성 (2번가지에서 깨끗하게 정리된 예시)
    1번 가지를 만든 후 가지별로 다시 지니계수를 계산해야 한다.
    # 퀴즈로 낼 수 있음 (직접 해보기)

  • 주의할 점
    - 분포도는 신경쓰지 않음
    - 정규성이나 값의 range를 신경 쓰지 않음
    - Feature에 대해 상세히 다루지 않음

  • 조별 회의 
  • 조별로 주제 : 선행 연구 + 특색 데이터 

  • 주제 + 데이터를 같이 체크