[AIVLE] 머신러닝

    머신러닝

    머신러닝, 딥러닝 등 많이 들어봤을테지만, 머신러닝이 좀 더 큰 개념이라 생각하면 된다. 

    학습 방법에 따른 분류 / 과제(문제)에 따른 분류로 나눌 수 있다.

     

     

    학습 방법에 따라

     

    지도 학습

    학습 대상 데이터에 정답을 라벨링하여 학습시키는 것. 

     

    비지도 학습

    정답이 없는 데이터만으로 학습시키는 것.

     

    강화 학습

    선택 결과에 따라 보상을 받는 쪽으로 행동을 개선하게 하면서 학습시키는 것.

     

    과제에 따라

     

    분류 문제(Classification) - 지도학습

    Train set - 이미 분류된 데이터로 학습을 통해 규칙을 찾고,

    Val set / Test set으로 새롭게 주어진 데이터를 분류

     

    회귀 문제(Regression) - 지도학습

    Train set - 결과값이 있는 데이터로 학습을 통해 입력 값 / 결과 값의 연관성을 찾고,

    Val set / Test set으로 새롭게 주어진 데이터에 대한 값을 예측하는 것

     

    군집화(Clustering) - 비지도학습

    주어진 데이터로 학습하여 적절한 분류 규칙을 찾아 데이터를 분류(군집화)

     

    분류 / 회귀

    해결해야 할 문제가 분류 문제인지, 회귀 문제인지 명확히 아는 것이 매우 중요하다.

    머신러닝에서는 이에 따라 다른 알고리즘을 사용하기 때문인데,

    연속적인 숫자 예측 -> 회귀라 생각하면 나름 편하다.

     

      회귀 분류
    알고리즘 LinearRegression (선형 회귀)
    KNeighborsRegressor(K-최근접 이웃)
    DecisionTreeRegressor(결정나무)
    RandomForestRegressor
    XGBRegressor
    DecisionTreeClassifier
    KNeighborsClassifier
    LogisticRegression
    RandomForestClassifier
    XGBClassifier
    성능 평가 mean_absoluted_error
    mean_squared_error
    root_mean_squared_error
    mean_absolute_percentage_error
    r2_score
    accuracy_score
    recall_score
    precision_score
    classification_report
    confusion_matrix (매우 중요)
     

    독립 / 종속변수

    독립변수는 원인(x), 종속변수는 결과(y)로 보면 편함.

     

    Overfitting(과대적합) / Undefitting(과소적합)

    과적합은 학습 데이터에 너무 fitting 되어 학습 데이터로의 성능은 좋으나, 실전에서의 성능이 떨어지는 경우다.

    학습이 반복될수록 Training Error는 줄어들지만, Test Error는 감소하다가 어느 시점부터 다시 높아지게 된다.

    즉, Test Error가 가장 적은 시점을 잡아내는 것이 중요하다.

     

    과소적합은 모델이 너무 단순하게 설계된 경우, 학습 데이터로 적절히 Train되지 않아 Train data보다 Test data 성능이 높거나 둘 다 너무 낮은 경우를 말한다.

     

     

     

    회귀 모델 평가 지표(MSE, RMSE, MAE, MAPE)

    실제값과 모델이 예측한 값, 평균값을 바탕으로 오차를 구할 수 있다.

    실제값: 예측하고 싶은 목표 값

    예측값: 알고리즘을 통해 예측한 값

    평균값: 기존에 예측한 값(평균값보다 예측값이 실제값에 가까워야 쓸만한 모델이라 평가할 수 있다.)

     

    MSE(Mean Squared Error) $ MSE = \frac{\sum(y-\hat{y})^2}{n} $
    RMSE(Root Mean Squared Error) $ RMSE = \sqrt{\frac{\sum(y-\hat{y})^2}{n}} $
    MAE(Mean Absolute Error) $ MAE = \frac{\sum{\left|y-\hat{y}\right|}}{n} $
    MAPE(Mean Absolute Percentage Error) $ MAPE = \frac{\sum{\left|\frac{y-\hat{y}}{y}\right|}}{n} $

    오차는 당연히 작을 수록 좋고, R2 score는 클수록 좋다.

     

    R2 score?

    Coefficient of Determination(결정 계수)

    전체 오차 중에서 모델(회귀식)이 잡아낸 오차 비율(0~1 사이)

    $ R^2  = \frac{SSR}{SST} = 1 - \frac{SSE}{SST} $

     

    이 때 SST: Sum Squared Total(전체 오차)

    SSR: Sum Sqaured Regression(회귀식이 잡아낸 오차)

    SSE: Sum Squared Error(회귀식이 잡아내지 못한 오차)

    from sklearn.metrics import mean_squared_error
    from sklearn.metrics import mean_absolute_error
    from sklearn.metrics import mean_absolute_percentage_error
    from sklearn.metrics import r2_score
    
    print(mean_squared_error(y_test, y_pred))

     이런 식으로 sklearn에서 불러와 사용할 수 있다.

     

     

    분류 모델 평가 지표

    회귀 모델이 오차를 줄이는 식으로 학습한다면, 분류는 정확도를 높이는 식으로 학습한다.

    이 때 Confusion matrix 개념이 나오는데, 매우 중요하므로 꼭 기억해두도록 하자.

     

    Confusion matrix

     

     정확도(Accuracy): $ \frac {TN + TP} {TN + FP + FN + TP} $ 0과 1을 정확히 예측한 비율

     

    정밀도(Precision): $ \frac {TP} {FP + TP} $ 1이라 예측한 것중에서 실제 1인 비율

     

    재현율(Recall): $ \frac {TP} {FN + TP} $ 실제 1인 것을 1이라 예측한 비율

     

    특이도(Specificity): $ \frac {TN} {TN + FP} $ 실제 0인 것을 0이라 예측한 비율

     

    F1 score: $ \frac {2 * Precision * Recall} {Precision + Recall} $ 정밀도와 재현율의 조화평균

     

     

    머신러닝 알고리즘

     

     

    Linear Regression(선형 회귀)

     

    회귀? 판타지 소설에 나오는 그 회귀랑 똑같은 단어 맞다.

     

    평균으로 '회귀'(돌아가려는)하는 경향이 있을 때, 이를 분석하는 방법을 회귀분석이라 한다.

    (1,1), (2,2), (3,3) 일 때 (4,?)에서 ?는 당연히 4라고 생각하게 되는데, 이 때 (1,1) (2,2) (3,3)을 지나는 직선을 긋게 된다. 

    하지만 데이터는 다양한 형태이기 때문에 최선의 직선을 구한다는게 쉬운 일은 아니다.

    최~~~~~~~~~~~대한 가까운, 최선의 직선을 긋는 것이 선형 회귀. 이 때 직선은 회귀선이라 한다.

     

    모델 설계 시 모델에는 가중치(weight)와 편향(bias)가 존재하는데, 간단하게 설명하면 y = wx + b 로 보면 된다.

    오차를 최대한 줄일 수 있는 가중치와 편향을 찾는 것이 바로 최적의 회귀모델을 찾는 것이다.

     

    독립변수의 개수에 따라 단순 회귀와 다중 회귀로 분류할 수 있다.

     

    단순 회귀

     

     독립변수 하나와 종속변수 하나가 일대일 대응 관계를 갖는 선형 회귀

     

    회귀식: $ \hat{y} = b+ wx $

     

    머신러닝에서 가중치와 편향을 어떻게 확인할 수 있지?

    model.coef_	#가중치
    model.intercept_	#편향

     

    다중 회귀

     

    여러 독립변수가 종속변수에 영향을 미치는 선형 회귀 -> 여러 개의 x값 필요

     

    회귀식: $ \hat{y} = b + w_0 x_0 + w_1 x_1 + ... + w_n x_n $

     

    K-Nearest Neighbor(KNN)

     

    해석하면 K-가장 가까운 이웃 = 가장 가까운 k개 값의 평균을 계산하여 값을 예측 / 분류

    k 값에 따라 데이터 예측이 바뀌므로 적절한 k값을 찾는 것이 중요.

     

    KNN 모델 성능을 높이기 위해서는 Scaling이 필수.

    모든 데이터가 같은 범위의 데이터를 가질 때 좋은 성능을 보여준다. 왜냐고? 평균 내서 값 구하는건데 데이터 범위가 제각각이면 값이 큰 데이터 위주로 나오지 않겠어?

     

    Scaling 방법은 크게 두 가지로 나뉜다.

    - Normalization(Min-Max)

     

    $ X_norm = \frac{x-a}{b-a} $

    a = min, b = max

     

    - Standardization

    $ X_z = \frac{x-mean}{std}

     

    머신러닝은 참 편한게 다 함수를 제공해준다.

    from sklearn.preprocessing import MinMaxScaler
    
    scaler = MinMaxScaler()
    
    scaler.fit(x_train)
    
    x_train = scaler.transform(x_train)
    x_test = scaler.transform(x_test)

     

    Decision Tree(결정 트리)

    explainable한 알고리즘

     

    Impurity(불순도)

    불순도를 수치화 할 수 있는 지표 - 지니 불순도(Gini Impurity) / 엔트로피(Entropy)

     

    Information Gain(정보 이득)

    어떤 feature가 얼마나 많은 정보를 제공하는가?

     

    $ Gain(T, X) = Entropy(T) - Entropy(T, X) $

     

    결정 트리에서 정보 이득이 가장 큰 속성부터 분할하는게 좋겠지 당연히?

     

    가지치기

     

    과적합을 막기 위해서 가지치기를 해야함 - 하이퍼파라미터 조정

    파라미터 설명
    max_depth - 트리의 최대 깊이(default: None)
    - min_samples_split보다 작아질 때까지 분할
    - 너무 깊으면 과적합 발생 가능성 높아짐
    min_samples_split - 노드 분할을 위한 최소한의 샘플 개수(default: 2)
    - 작을수록 트리가 계속 분할되고, 깊이가 깊어지므로 과적합 발생 가능성 높아짐
    min_samples_leaf - 리프 노드가 되기 위한 최소한의 샘플 수(default: 1)
    - 과적합 방지 목적
    max_feature - 최선의 분할을 위해 고려할 feature 수(default: None)
    max_leaf_node - 리프 노드 최대 개수

     

    Decision Tree를 머신러닝에서 사용하면 시각화도 사용할 수 있다.

    from sklearn.tree import plot_tree
    import matplotlib.pyplot as plt
    
    fig = plt.figure(figsize = (12,10))
    plot_tree(model,
    filled = True,
    feature_names = x.columns,
    class_naems = y.unique(),
    fontsize = 10)
    
    plt.show()

    graphviz 쓰는 방법도 있는데 뭐 쓰면서 익히는걸로...

     

    Feature Importance

    이게 진짜 딥러닝 모델 설계하고 설명할 때 많이 구현해본 건데, 결정 트리에선 이걸 쉽게 시각화를 할 수 있다.

    plt.barh(list(x), model.feature_importances_)
    plt.show()

    model.feature_importances_ 로 바로 되는게 참... 내가 그동안 구현한건 뭐냐고ㅠㅡㅠㅡㅠㅡㅠㅡㅠ

     

    Logistic Regression(로지스틱 회귀)

     

    Sigmoid

     

    정말 중요한 함수다. 정말이다. 꼭 기억해두자.

    $ p = \frac {1}{1+e^{-f(x)}} $

     

     

    Support Vector Machine(SVM)

    분류를 위한 기준선 = Decision Boundary를 찾는 알고리즘, 정규화 필요

     

     

    K-Fold Cross Validation

    K - 분할 교차 검증

    데이터를 k개로 분할하여 학습에 k-1번 사용, 평가에 한번씩 사용되는 개념

    -> 모든 데이터를 학습, 평가에 사용할 수 있고 정확도 향상 및 일반화된 모델을 만들 수 있지만, 오래 걸려...

    이거도 당연히 머신러닝에서 함수 하나로 구현된다.

    from sklearn.model_selection import cross_val_score
    
    kcv = cross_val_score(model, x_train, y_train, cv = 10)	# cv: 분할 개수

     

     

     

     

    하이퍼파라미터 튜닝

     

    이건 걍 정해진 답이 없다. 실험 많이 해봐야됨

    Grid Search / Random Search 방식이라고 처음 들어보는게 있어서 간단히 요약해야겠다.

    - 딕셔너리 형태로 파라미터 값 범위 지정

    - 파라미터 값 범위를 모두 사용하는 Grid Search / 범위에서 몇 개만 선택하는 Random Search 모델 선언 후 학습

    - 학습 데이터에 대해 가장 좋은 성능을 보인 파라미터 값으로 자동 학습

    코드로 간단히 보자.

     

    param = {'param1': range(1, 11), 'param2': ['a', 'b', 'c']}
    # Grid의 경우 30개 조합에 대해서 / Random의 경우 지정한 개수의 임의 조합에 대해 성능 확인
    
    from sklearn.neighbors import KNeighborsClassifier
    from sklearn.model_selection import RandomizedSearchCV
    
    knn_model = KNeighborsClassifier()
    
    model = RandomizedSearchCV(knn_model, rand_param = param, cv = 3, n_iter = 20)
    
    model = GridSearchCV(knn)model, rand_param = param, cv = 3)
    
    # 확인
    
    model.cv_results_
    model.best_params_
    model.best_score_

     

     

     

    Ensemble(앙상블)

     

    약한 모델을 합쳐서 더 좋은 모델을 생성하는 방법

     

    Voting

    여러 개의 Classifier가 Vote를 통해 최종 예측 결과를 결정

    - Hard Voting: 다수의 답이 최종 결과

    - Soft Voting: 모든 예측 값의 확률 평균을 구하고, 가장 확률이 높은 레이블 값이 최종 결과

    from sklearn.ensemble import VotingRegressor
    
    models = [('lr', LinearRegression()), ('dt', DecisionTreeRegressor())]
    
    model = VotingRegressor(estimators = models)
    
    model.fit(x_train, y_train)

     

    Bagging

    Bootstrap Aggregating

    데이터로부터 부트스트랩(샘플링)한 데이터로 모델을 학습시킨 후, 학습된 모델 결과를 집계하여 최종 결과를 결정

    범주형 데이터는 Voting 방식으로 집계, 연속형 데이터는 평균으로 집계

    ex) Random Forest(Decision Tree가 여러 개 모인 형태)

     

     

    Boosting

    여러 분류기에 대해 순차적으로 학습을 진행하는 방식

    이전 분류기의 틀린 데이터 -> 다음 분류기가 올바르게 예측할 수 있도록 가중치 부여 -> 반복

    but, 느리고 과적합 발생 가능성 있음

    ex) XGBoost, LightGBM

     

    Stacking

    여러 모델의 예측 값을 최종 모델의 학습 데이터로 사용하여 예측하는 방식

    ex) LR, KNN 등 모델을 사용하여 예측값 구하기 -> 최종 모델의 학습 데이터로 사용

    기본 모델로 4개 이상 선택해야 좋은 결과를 기대할 수 있음

     

     

    'AIVLE' 카테고리의 다른 글

    [AIVLE] 딥러닝 2일차  (0) 2023.02.28
    [AIVLE] 딥러닝 - keras 기초  (0) 2023.02.27
    [KT AIVLE 3기] 이변량분석  (0) 2023.02.10
    [KT AIVLE 3기] 단변량분석  (0) 2023.02.09
    [KT AIVLE 3기] 데이터 시각화  (0) 2023.02.09
    Posted by 저본