어제 배운 내용 복습
특징 처리
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에 대해 상세히 다루지 않음
- 조별 회의
- 조별로 주제 : 선행 연구 + 특색 데이터
- 주제 + 데이터를 같이 체크
'ASAC 빅데이터 분석가 7기 > ASAC 일일 기록' 카테고리의 다른 글
ASAC 빅데이터 분석가 과정 33일차 (25.01.21) (0) | 2025.01.21 |
---|---|
ASAC 빅데이터 분석가 과정 32일차 (25.01.20) (0) | 2025.01.20 |
ASAC 빅데이터 분석가 과정 30일차 (25.01.16) (0) | 2025.01.16 |
ASAC 빅데이터 분석가 과정 29일차 (25.01.15) (0) | 2025.01.15 |
ASAC 빅데이터 분석가 과정 28일차 (25.01.14) (0) | 2025.01.14 |