[파이데사] ML 2

2023. 4. 26. 12:352022/파이썬을이용한데이터사이언스

반응형

Supervised learning

  • 정답이 존재한 상태로 학습을 시키는 방식
  • 비지도학습보다 성능이 더 좋으나 y값(labels)를 얻는 것이 쉽지 않음
  • y값이 연속형이라면 선형회귀 이용
  • y값이 이산형이라면 classification 이용
  • Regression
    • 과거의 점수를 분석함으로써 학생들의 중간고사 점수를 예측할 때
      • X: past scores of another students
      • y: their midterm scores
    • 중고차의 특징을 분석함으로써 가격 예측하기
      • X: characteristics of cars already sold
      • y: their prices
  • Classification
    • 과거의 점수들을 분석하여 학생들의 성적 예측하기
      • X: past scores of students
      • y: their grades(A, B, C)
    • 중고차의 특징을 분석함으로써 가격의 범위를 예측하기
      • X: characteristics of cars already sold
      • y: their price ranges(high, medium, low)
  • 일반적으로 회귀문제는 해결하는데 훨씬 어려움
    • 회귀문제를 분류 문제로 바꿔 연속형 종속 값들을 카테고라이징 함
    • regression은 많은 정보들을 제공함
  • classification에서는 grey areas가 존재

Classification evaluation

  • classification evaluation
    • 좋은 classifier는 무엇일까?
      • c.f. regression
        • 실제 값과 예측값 사이의 오차를 최소화
    • 모르는 데이터의 카테고리를 정확하게 예측해라
  • 일반적인 평가 방식
    • 지도학습에서의 트레이닝과 평가 과정
    • evaluation metrics
      • regression : RMSE, MAE, MAPE
        • data split
          • training set : tr, 머신러닝 모델을 훈련시키기 위한 데이터셋
          • test set : te, 모델의 성능을 평가하기 위한 데이터셋
          • validation set : 하이퍼파라미터를 조절하기 위한 데이터
          • 비율(8:2, 7:3)대로 랜덤하게 데이터를 나눔
          • k-fold cross validation
            • 10-fold cv : 10개로 쪼개서 돌아가며 이용
          • time dependent split
          # k-fold split
          import random
          import math
          from sklearn import datasets
          
          wine = datasets.load_wine()
          
          r, c = wine.data.shape
          
          X = wine.data
          y = wine.target
          
          # random split 1
          tr_ratio = 0.8
          tr_idx = random.sample(range(r), int(math.floor(r*tr_ratio)))
          te_idx = [x for x in range(r) if x not in tr_idx]
          
          X_tr, y_tr, X_te, y_te = X[tr_idx, :], y[tr_idx], X[te_idx, :], y[te_idx]
          
          print(tr_idx, te_idx)
          
          # random split 2
          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)
          
          # k-fold
          from sklearn.model_selection import KFold
          kf = KFold(n_splits=10)
          for train_idx, test_idx, in kf.split(X):
              X_train, X_test, y_train, y_test = X[train_idx], X[test_idx], y[train_idx], y[test_idx]
              print(train_idx, test_idx)
          
      • classification : accuracy, F1 score, recall, precision
        • accuracy
          • 완벽하게 예측된 instances의 비율
          • 주어진 데이터셋이 불균형하다면?
            • classifier를 만들고 accuracy를 계산
          • true positive + true negative / total population
        • recall, precision
          • recall
            • true positive / false negative + true positive
          • precision
            • true positive / true positive + false positive
from sklearn import metrics
from sklearn.metrics import confusion_matrix

y_te = [1, 0, 1, 1, 0]
pred = [1, 1, 1, 1, 1]

print(confusion_matrix(y_te, pred))
print(metrics.accuracy_score(y_te, pred))
print(metrics.recall_score(y_te, pred))
print(metrics.precision_score(y_te, pred))
print(metrics.f1_score(y_te, pred))

Classification models

  • KNN algorithm
    • K-nearest neighbor
    • aka case-based learning (CBR)
    • intuition
      • 유사한 트레이닝 예시들을 찾고 그것들과 같은 클래스를 예측 
        • characteristics
          • 트레이닝 X
          • 단순하지만 강함
          • 비선형
          • 느림
          • K 값에 달려있음
            • 주로 3이나 5를 이용
  • decision tree
    • intuition
      • root node를 기준으로 단계적으로 의사결정을 진행
    • characteristic
      • 이해하고 설명하기 쉬움
      • overfitting → 깊이를 알아내야 함
      • 연속형 features와는 문제가 생길 수 있음
      • high-level 노드에서의 실수는 결정적임
  • SVM (Soft Vector Machine)
    • intuition
      • 데이터 포인트들 사이의 가장 큰 간격을 제공하는 선을 찾아냄
      • 최적화 문제
    • characteristic
      • 일반적이고 억셈.. 굳셈..?
      • 빠름
      • 성능이 좋은 편임 (최고는 X)
      • 이해는… 불가
    from sklearn.datasets import load_wine
    from sklearn.model_selection import train_test_split, cross_val_score
    from sklearn import svm, tree
    from sklearn.metrics import accuracy_score, confusion_matrix
    
    wine = load_wine()
    X = wine.data
    y = wine.target
    
    X_tr, X_te, y_tr, y_te = train_test_split(X, y, train_size=0.8)
    
    trained_svm = svm.SVC(kernel='linear').fit(X_tr, y_tr)
    y_pred = trained_svm.predict(X_te)
    
    print(confusion_matrix(y_te, y_pred))
    print(accuracy_score(y_te, y_pred))
    
    dt_clf = tree.DecisionTreeClassifier()
    acc_dt = cross_val_score(dt_clf, X, y, cv=10)
    
    print(acc_dt)
    print(acc_dt.mean())
    
  • kernel method
    • kernel trick
      • 고차원의 feature 공간과 input 공간을 받는 함수
      • 유사도의 척도

Deep learning

  • find a suitable model for my problem
    • problem definition
      • y: continuous, categorical
    • feature type
      • continuous (연속형 데이터)
      • discrete (이산형 데이터)
      • sequential (시계열 데이터)
      • heterogeneous → 이상 데이터..?
    • data quality
      • noise
      • scale → normalization
    •  
반응형

'2022 > 파이썬을이용한데이터사이언스' 카테고리의 다른 글

[파이데사] ML 1  (0) 2023.04.26