본문 바로가기

일별 학습일지

1/24~2/2 :: ML 이론

(양이 많다보니 통합으로 정리 및 작성)

 

자료출처

Upstage AI LAB 2기 ML 이론 (1/24~2/2) 실강 PPT / 김용담 강사님

 

강의 진행용 PDF에 Adobe Reader 프로그램으로 필기진행

+ (코랩 실습) 

 

필기 및 강의 PPT 교안 스크린샷이 많으며, 제대로 이해못한 내용이 있을 수 있음

 

 

서론

데이터 분석가들은 문제를 해결할 수 있는 구체적인 방안(코드) 구상 필요

어떤 데이터를 수치화하게 되면 벡터라는 개념을 가져올 수 있게 됨

 

데이터는 벡터로 표현 가능

https://www.youtube.com/watch?v=fNk_zzaMoSs&list=PLZHQObOWTQDPD3MizzM2xVFitgF8hE_ab

 

Q. 코사인 거리보다 그냥 각도를 normalize 해서 쓰는게 직관에 더 맞지 않은가?

A.

각도를 표현하고 싶으면 각도를 쓰면 되고,

벡터의 특징을 고려해 내적의 관점에서 cosin 값 차이를 볼꺼면 cosine distance를 쓰는게 낫다. 

 

 

cf. non-euclidean 

word mover's distance

hyperbolic space
spherical space

 

 

4단계로 진행이 된다

 

ML은 결국 모델 돌려봐야 답이 나온다고 함

 

 

문제 정의는 매우 중요하며, 기준에 따른 해결방식 및 실효성 상이

질문 리스트를 통해 ML에 적합한 문제인지 확인 

 

 

 

 

사람이 학습하는 방식과 비슷

- 예시들(data)를 통해 패턴을 찾아 낸다  → 컴퓨터로 

 

how? 데이터 바라보는 방법, 관점(model) + 예시(data) 

 

 

기본적인 Data Split 활용

 

 

 

 

target value의 사용 여부에 따라 지도 vs 비지도로 나뉜다

 

 

회귀 Regression

특정 변수(값)을 예측하는 방법  → y 값을 맞추는 것에 의의를 둠, 경향성

 

 

 

모든 data의 feature를 충족하는 것은 불가능( = 되었다면 overfitting)

target 값(y) 예측값(y hat)의 차를 최소로 하는 loss function을 구해  모델에 반영 필요

 

아래의 Graient Descent Algorithm을 활용

 

 

분류(Classification)

: 컴퓨터가 데이터를 나누는 방법

 

 

 

 

의사결정 나무 Decision Tree

 

 

 

회귀와 분류 둘다 적용할 수 있다는 점이 흥미롭다

 

 

 

Random Forest

decision tree를 여러번 하는 것?

단 동일 data에 진행하면 같은 DT가 나오니 bagging을 통해 data sampling 한다

 

 

 

클러스터링(Clustering) : 군집화

 

K-Means

오래전부터 쓰였던 방법으로 직관적이고 이해하기 쉬움

단, 한계 존재해 다양한 방법으로 보완 필요

 

 

 

 

GDA 처럼 점진적으로 잔차를 줄이는 기법

 

 

 

 

 

 

 

XGBoost (XGB), LGBM, CatBoost(CAT)

 

XGB

: GBM을 C++ 같은 언어로 효율 좋게 코딩하여 kaggle 같은 실전 데이터 분석 대회에서 가장 많이 사용하는 모델 

 

압도적인 성능

 

수많은 parameter 튜닝방법

 

모든 nodes 순차 전개하는 level-wise 와 달리 성능 증가하는 node만 선택적 전개하는 leaf-wise 방식
역시나 parameter가 많다

 

 

 

데이터 수집 및 정제

엔터프라이즈 급이 되면 1초마다 상대한 양의 빅데이터가 들어옴

= 효율적으로 관리 필요

 

Data Lake - RDBMS - Data Mart

 

 

EDA

저번에 했던 내용이라 간단하게 살펴봄

## ML을 위한 EDA 수행순서

# 1. info() 기본적인 크기 확인
# 2. 결측치 체크 - 결측치가 있다면 ML 모델이 안돌아감
# 3. dtype이 object인 column 확인 ---> categorical feature일 가능성이 높아서! 
# 4. target value distribution 확인

 

 

 

KNN Impuation

: 결측치를 포함하고 있는 데이터와 비슷한K개의 데이터를 찾아, K개의 평균값으로결측치를 채우는 방법

 

 

 

 

Feature Engineering

차원의 저주를 어떻게 handling 하는가

1. deep-learning 

2. diemsionality reduction : PCA 등 

 

 

 

Feature Engineering 을 위해 고려

 

1. 상관관계(Pearson's)

2. VIF(Variance Inflation Factor)

3. Data Scaling 

 

 

optuna 등을 활용,  feature의 중요도에 따라 선별해 성능을 향상시킬 수도 있음

 

 

단, feature가 엄청나게 많을 때 사용

 

K-Fold 기법을 활용,

 

RF models들을 ensemble 하여 K-Fold ensembles 을 사용하던지,

높은 성능을 뽑는 model과 hparams를 이용, 최종적으로 파라미터 튜닝 및 적용하던지 하면 좋음

 

데이터의 양이 많은 경우 연산량(=소요시간)이 증가, 알아서 판단하기

 

 

 


 

 

개발환경 관련 노하우(Colab) & 기타

 

딥러닝할꺼면 코랩 결제해서 하는게 제일 가성비 좋은 것 같다

 

https://colab.research.google.com/

 

Cloud Computing

돈을 내면 모든 기능 사용가능

 

처음엔 무료계정만 있어도 괜찮고, 무료계정이여도 나중에 T4 GPU를 쓸 수 있음

프로젝트를 할 때 불편하면 개인적으로 구매 

 

무료버전에선 주로 T4,  실제로 A100, V100은 매우 비싸며 개인구매 불가함

다음주 실습부터는 업로드하고 불러오는 방식으로 진행할 예정

 

개인 환경에서는 여러 변수가 있어 다른 것들을 설치하는 경우가 많다보니 코랩으로 진행

 

A100 VRAM 40G

 

단점

1. colab은 오래 돌리는 것이 불편(최대 24시간..)

2. 데이터 크기가 클 경우 시간이 매우 오래걸림 

- 구글 드라이브를 네트워크의 형태로 연결 및 마운트

 

ex) 한번 실험하는데 9시간..

 

그래서 나중엔 서버를 샀다. 

데이터의 용량이 커지면 나중에

 

 

Q. 투자를 좀 하고 싶다. 컴퓨터 사고 싶다.

A. 철저히 개인적인 관점에서 생각해야됨

 

 

옵션1

1. 적당한 컴퓨터 + 코랩 Pro Plus 49달러(대충 7만원) - 사용자가 늘어나면서 크레딧제로 바뀜

다른 옵션들에 비해서 쌈

 

2. 딥러닝을 하고싶다고 하면 mac은 추천안함

 

3. 가성비 RTX 3090 싸게 사면 80, 적당하면 120 (4090이 좋긴한데 너무 비쌈 260)

 

총 VRAM 사이즈가 훨씬 중요하다

대략 한 300만원 정도 듬

 

옵션2

적당한 AWS+GCP+runpod.io(aws보다 쌈)+lightning.ai

 

대학원 프로젝트 1달 예산 약 100만원정도면 딥러닝 무난하게 

 

과정 내에선 필요없다

업스테이지 경진대회를 할때 서버를 빌려준다

 

개인

m1, m2 맥북 air 가성비  + colab

 

쓰다보면 코랩이 최고다.. 

 

 

캐글 notebook? 

일주일 30시간 제한..

 

https://scikit-learn.org/stable/

 

scikit-learn: machine learning in Python — scikit-learn 1.4.0 documentation

Model selection Comparing, validating and choosing parameters and models. Applications: Improved accuracy via parameter tuning Algorithms: grid search, cross validation, metrics, and more...

scikit-learn.org

 

머신러닝을 할 때 scikit learn을 쓰면 GPU 사용 불가

ML 코드를 짜고싶은데 reference를 찾고싶다? 사이킷런 내부 보는게 제일 좋다. 

 

 

Mindset

 

정신적이나, 육체적으로 컨디션이 안좋아도

일단 따라치시는 클론 코딩만 해도 되긴 한다. 

 

물론 빠르게 성장하려면 열심히 보면서 생각하는게 좋음 

 

 

pycaret
autogluon
AutoML

 

하이퍼 파라미터 튜닝을 하는 방식은 여러가지가 있지만 정답은 모르기에,

항상 넣는다고 해서 성능 개선이 이뤄진다고 보긴 어려움

 

ML을 제대로 하고 싶다고 하면, 이론을 파는게 좀더 좋다.

학습하는 코드는 간단하기에

 

 

코딩과제인데 검색하면 잘 나와있음

chat gpt에게 물어봐도 다 아니까 안쓰도록

 

과제의 기준 : 과제의 코드를 직접 공부하고 직접 짠다는 것으로 기준을함

내용은 보면 알겠지만 코드의 주석 & 왜 동작하는지 등 기재 필요

 

회귀모델은 얼마나 틀렸느냐로 비교함

overfitting 사례

 

 


[Upstage AI LAB 02] 20240201 실습_HW2-Spaceship Titanic PJT_2nd

 

실습 competition 개인 기록용으로 주요내용만 작성

 

 

문제 1.
PassengerID에서 분리한 group_num을 기준으로 groupby하여 관측시 Transported 된 인원이 상이했음

 

 

 

해결법

방법이 잘 안떠올라서 row별로 값을 추가하는 함수를 만들어 2차례에 걸쳐 적용

 

# in_large_group column 생성
test['in_large_group'] = '0'

# in_large_group 1차처리
def find_large_group(row):
  PassengerId = row['PassengerId']
  group_num, id = map(str, PassengerId.split('_0'))

  if int(id) >= 4:
      return 1
  else:
      return 0

test['in_large_group'] = test.apply(find_large_group, axis=1, result_type='expand')

 

최대 인원 수가 7을 넘지 않았음 → 01,02,03 은 제외된 듯 하여 보완하는 함수 설정

# in_large_group 2차처리
df2 = test.groupby(by='group_num')['in_large_group'].sum()

def find_large_group2(row):
  PassengerId = row['PassengerId']
  group_num, id = map(str, PassengerId.split('_0'))
  in_large_group = df2.loc[group_num]

  if row['in_large_group'] == 0 and int(in_large_group) > 0:
      return 1
  else:
      return row['in_large_group']

test['in_large_group'] = test.apply(find_large_group2, axis=1, result_type='expand')

제외된 value들도 in_large_group 컬럼에 1표시 완료된듯 함

 

 

문제2. parameter tuning

최적의 parameter가 뭔지 모르겠음

추후 GridSearchCV를 돌려도 원하는 만큼의 성능이 안나옴

 

해결법

- 직접 수동 튜닝하면서 테스트 진행
- parameter별로 반복문 돌려 테스트 한 이후 df화하여 best validation 기준으로 정렬 후 상위 값 선정

- 이후 model에 적용시키면서 model 최종 결정

# learning rate test

score_df = pd.DataFrame(columns=['parameter', 'Train', 'Validation', 'T-V'])
i = 0.03

while i < 0.3:
  model_test = XGBClassifier(

      learning_rate = i,
      random_state = 42
  )
  model_test.fit(X_train, y_train)

  print("Prediction")
  pred_train = model_test.predict(X_train)
  pred_val = model_test.predict(X_val)

  train_score = accuracy_score(y_train, pred_train)
  val_score = accuracy_score(y_val, pred_val)

  score_dic = {
      'parameter' : i,
      'Train' : train_score,
      'Validation' : val_score,
      'T-V' : train_score - val_score
      }

  score_df = score_df.append(score_dic, ignore_index=True)
  i += 0.01

상위 값들을 산출 및 적용

 

 

결과

 

성과

- kaggle competition 경험이 없었는데 대략적으로 진행되는 방식을 이해 (submission 제출법 등

- hyper parameter의 튜닝도 효과가 있지만 EDA를 통한 data agumentation의 중요도 체감

'일별 학습일지' 카테고리의 다른 글

2/7 :: 실강  (0) 2024.02.07
2/6 :: 실강  (0) 2024.02.06
1/22 :: 실강  (0) 2024.01.24
1/19 :: 실강  (0) 2024.01.22
01/15 :: Git  (0) 2024.01.17