ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • #12 : KT_AIVLE_SCHOOL : DX_4th : 6주차 : 머신러닝-지도학습
    KT_AIVLE_SCHOOL_DX_4th 2023. 9. 19. 00:47

    지난시간에는

    #10 미니프로젝트3차 ( https://datawithu.tistory.com/21 )

    #11 쉬어가기편 ( https://datawithu.tistory.com/22 )  

    에 대해서 다루었다. 

     

    이번시간에는 약 5일 동안  머신러닝(Machine-Learning)중 지도학습에 대해여 배운다. 

     

    이번 강의는 이강래 강사님께서 진행해주셨다.

    • 1. 머신러닝
    • 2.성능평가
    • 3.알고리즘
    • 4.K-Fold Cross validation
    • 5.Hyperparameter 튜닝
    • 6.앙상블

    이번 5일 동안은 머신러닝 중에서도 지도학습에 관하여 배우게 되었다. 


    #  Intro ) 교육 후 짧은 생각  정리

    머신러닝이라는 말을 들었때,  드디어 !!! 라는 생각이 들었다. 

    사실 데이터 자격증도 그렇게 많이(?) 따고서는 (정확히는 날림으로 따고서는 )

    한번도 제대로 공부를 해보아야 겠다. 

    또는 적어도 이 정도는 알아야 데이터분석을 할 수 있는 거 아냐 

    결심만 수백번했는데,  에이블스쿨이라는 강제성이 더해지니, 역시 :) 하게 되었서

    정신+몸은 힘들었지만,  MY Brain 내 뇌는 약간 좋아?한것 같다.

     

    그래도 지도학습의 경우,  이미 빅데이터분석 기사를 올해 7월에 취득했어서

    비교적 프로세스는 어렵지 않았다. 

     

    물론 강사님이 친절하게 설명해주시는 부분과 내가 가진 오류들을 검토하고,

    또 겸손이라는 말을 가슴에 새기면서 듣고자 했다.

    특히, 성능평가 부분에서 RMSE, Confusion_matrix는 항상 항상 어렵고 안 외워졌는데,

    이번에는 마참내 드디어 외울수 있게 된것 같아 매우 기쁘다. 

     

     


    1. 머신러닝 

    • 머신러닝에는 지도학습, 비지도학습. 강화학습으로 나눌수 있다.
    • 지도학습 : 정답이 정해져있음 (분류/회귀)
    • 비지도학습: 정답이 없음(군집화/변화/연관분석)
    • 강화학습 : 결과가 학습에 영향을 

    1) 분류 VS 회귀

    • 회귀: 연속적인 값 예측
      • LinearRegression
        KNeighborsRegressor
        DecisionTreeRegressor
        RandomForestRegressor
        XGBRegressor
    • 분류: 범주값 예측
      • DecisionTreeClassifier
        KNeighborsClassifier
        LogisticRegression
        RandomForestClassifier
        XGBClassifier

    2) 모델링과 데이터 

    • 평균 또한 가장 단순한 모델이며,  관측값(실젯값)과 모델 예측값의 차이를 이탈도= 오차 라고 한다.
    • 데이터는 보통 :  학습용(70~80%) + 검증용(30~20%)   &  별도의 평가용 데이터로 구성된다.

    3) 학습 데이터 성능에 대한 결과

    • 과대적합 : 학습 데이터의 성능이 좋지만,  평가데이터의 성능이 나쁨 ; 예측성능이 안좋음
    • 과소적합 : 모델이 단순하여 학습데이터에 대한 훈련이 안되어있음. 평가 데이터의 성능이 학습데이터보다 좋거나 전체적으로 나쁨

    4) 기본 모델링 코드

    #0. 데이터분리 모듈 불러오기
    from sklearn.model_selection import train_test_split
    
    #1. 학습용, 평가용 데이터 분리 
    x_train , x_test , y_train , y_test = train_test_split (x, y, test_size 0.3 )
    #1. 또는  학습용 성능용 데이터 분리
    x_train , x_val , y_train , y_val = train_test_split (x, y, test_size 0.3 )
    
    # 2.사용할 모델 불러오기
    from sklearn.모듈 import 회귀/분류 등
    
    #3.사용할 평가지표 불러오기
    from sklearn.metrics import mean_absolute_error , r2_score #회귀
    from sklearn.metrics import confusion_matrix, classification_report #분류
    
    #4. 모델 선언 & train
    model = 모델( 튜닝가능 )
    model.fit(x_train, y_train)  # 모델 학습시키기
    
    #5. 예측
    y_pred = model.predict(x_test) 
    
    #6. 성능 평가 : (실젯값, 예측값)  <= 이 순서대로 데이터 넣기!!!
    mean_absolute_error( y_test , y_pred) #회귀
    
    accuracy_score( y_test , y_pred)#분류
    precision_score(y_test , y_pred ,average=None)# 분류

    2.성능평가

    1 )  회귀 모델 : 예측값과 실제값의 오차로 모델의 성능을 평가

    1-1) 오차 : 작을 수록 좋음

    • SSE :오차의 제곱의 합  :Sum Squared Error
    • MSE : SSE의 평균 : 오차제곱 합의 평균 : Mean SSE
      • RMSE: 오차제곱 합 평균의 제곱근 : Root MSE
    • MAE : 오차의 절대값의 합 : Mean Absolute Error
      • MAPE : 오차 절대값 합의 비율 : Mean Absolute Percentage Error  => 오차의 비율을 보고 싶은 경우에

    1-2) 결정계수 : 클수록 좋음 

    • 결정계수 𝑅 2 (R Squared)  
      • 전체 오차 중, 회귀식이 잡아낸 오차 비율
      •  0 ~ 1 사이  : R2 score가 1이면, 오차=0이라는 말
      • 오차의 비 또는 설명력이라고 함

     

    2 ) 분류 모델 : 정확하게 예측하여 분류한 비율로 모델의 성능 평가 

    2-1) 혼동행렬 : Confusion Matrix

    • 정확도 :Accuracy  :   0을 0으로 + 1을 1로 예측  / 전체(TN + FP + FN +TP)
      • 정분류율 : 양성을 양성으로 음성을 음성으로 정확하게 예측함
    • 정밀도 : Precision :  1을 1로 예측   /  (0을 1로 예측 + 1을 1로 예측)
      • 예측의 관점으로  : 양성으로 예측한 것들 중에 실제 양성인 것
    • 재현률: 민감도 : Recall : 1을 1로 맞춤/  (예측0이 실제1 + 예측1이 실제1)
      • 실제 관점으로  : 실제 양성 중에서  양성으로 예측한 값 :   예시) 실제 암환자에게 암으로 진단할 수 있는지?

    2-2) F1-score : 정밀도와 재현율의 조화평균 

    • F1-score = ( 2 * 정밀도*민감도 ) / ( 정밀도 + 민감도 )

    3.알고리즘

    3-1) Linear Regression :  선형 회귀 

    • 최선의 회귀모델:  전체 데이터의 오차 합이 최소가 되는 모델
    # 회귀계수 = 가중치 확인 : 
    model.coef_
    
    # 편향(y절편) = 
    model.intercept_

    1.단순 회귀 : 독립변수 1개 

    2. 다중 회귀 : 독립변수 2개 이상

    • 회귀 계수가 여러개가 나오므로 독립변수들의 이름을 같이 확인하는 것이 좋다 예) list(x) 

    3-2) KNearest Neighbor : KNN : 회귀/분류

    • k개의 최근접 이웃의 값을 찾아 그 값들로 새로운 값을 예측함 
    • default k값은 5,  가장 적절한 K 찾기기 관건
    • 스케일링 필요
      • 정규화 스케일링:  각 변수의 값을 0~1사이로 만듬   
        • (X-Xmin) / (Xmax -Xmain)
      • 표준화 스케일링 :  N(0,1)로 표준정규분포를 따르게 만듬 : 각 변수 평균 0, 표준편차 1 :
        • (X-Xmean) / Xstd
    # min-max 정규화 사용
    from sklearn.preprocessing import MinMaxScaler
    # 정규화
    scaler = MinMaxScaler()
    # 학습용 데이터로 스케일링 할것 !!
    scaler.fit(x_train)  
    x_train_s = scaler.transform( x_train)
    x_test_s = scaler.transform( x_test)
    # 회귀
    from sklearn.neighbors import KNeighborsRegressor
    from sklearn.metrics import mean_absolute_error , r2_score
    
    # 분류
    from sklearn.neighbors import KNeighborsClassifier
    from sklearn.metrics import confusion_matrix , classification_report

    3-3) Decision Tree : 의사결정나무/결정트리 :  회귀 /분류

    • 확률에 근거해 예측을 하는 분류 모델
    • 분석과정을 시각화 가능 => 화이트박스 모델
    • 튜닝(max_depth)으로 가지치기 필요, 적절한 깊이 찾는 것이 관건
    • Root Node(부모노드)  ->---------> Terminal Node( =Leaf Node)
    • 분류 : 마지막 자식노드에 있는 Samples의 최빈값을 예측으로 반환
      • 불순도로 평가 : 순도가 높을 수록 분류가 잘된것
        • 지니 불순도 : 0~0.5 사이값으로 지니 불순도가 낮을수록 순도가 높음(0) vs 섞이면 0.5
        • 엔트로피  : 0~1 사이 값으로 , 값이 낮을수록 완벽하게 분류됨(0)  vs 섞이면 1 
      • 정보 이득 : 정보이득이 크다 = 불순도가 줄어든다. 
    • 트리 시각화
    # graphivz 는 따로 사이트에서 다운로드를 받아서 컴터에 설치해야한다.
    from sklearn.tree import export_graphviz
    
    # 이미지 파일 만들기
    export_graphviz( model, filled=True, feature_names=x.columns, class_names = y.unique(),
    				rounded=True, precision=5, out_file='tree.dot')
    
    # 저장화질
    !dot tree.dot Tpng otree.png Gdpi 300 
    
    # 이미지 불러오기
    from IPython.display import Image
    Image(filename='tree. png', width=400 )
    • 변수 중요도 시각화
    plt.barh( list (x), model.feature_importances) 
    plt.ylabel('요인')
    plt.xlabel('중요도')
    • 회귀: 마지막 자식노드에 있는 Samples의  평균을 예측으로 반환
      • MAE로 평가
    # 회귀
    from sklearn.tree import sklearn.tree.DecisionTreeRegressor
    from sklearn.metrics import mean_absolute_error , r2_score
    
    # 분류
    from sklearn.tree import sklearn.tree.DecisionTreeClassifier
    from sklearn.metrics import confusion_matrix , classification_report
    
    model = DecisionTreeClassifier max_depth 5

    3-4) Logistic Regression : 분류

    시그모이드 함수 : -inf ~~ +inf범위에서  0또는1로 분류함

    from sklearn.linear_model import LogisticRegression
    from sklearn.metrics import confusion_matrix , classification_report

     


    4.K-Fold Cross validation : 분할 교차 검증 

    •  정확도를 향상시킬 수 있음, 일반화된 모델을 만들 수 있음, 과소적합 방지.
    • 기본 cv = 5가 디폴트 값
    • from sklearn.model_selection import cross_val_score 을 사용
    # 1 사용할 모델 불러오기 
    from sklearn..............
    from sklearn.model_selection import cross_val_score
    
    # 2 모델 선택 
    model = 불러온모델(하이퍼파라미터)
    
    # 3 성능검증
    cv_score = cross_val_score (model, x_train , y_train ,cv=10)
    
    # 확인
    print( cv_score)
    print(cv_score.mean())

    5.Hyperparameter => 튜닝

    1) 하이퍼 파라미터란?

    모델링시, 모델의 성능을 최적화하기 위해 인간이 조절할수 있는 매개변수 값.

    • KNN에서는 n_neighbors=k의 수에 따라 성능이 달라짐
      •  k=가장클때,  가장 단순한 모델이 된다. 회귀 : 평균,  분류: 최빈값
      • 거리계산 (유클리드 거리(점과 점 직선 거리),   맨하탄 거리( 평면으로만 움직이는 점과 점 거리))
    • Decision Tree에서
      • max_depth : 트리 깊이를 제한, 값이 작을 수록 모델이 단순함
      • min_samples_leaf : 잎이 되기 위한 최소한의 샘플 데이터수, 값이 클수록 모델이 단순함
      • min_samples_split : 노드 분할을 위한 최소 샘플 데이터수 , 값이 클수록 모델 단순

     

    2 )  최적의 하이퍼 파라미터 찾는 방법 

    2-1) Grid Search : 모든 파라미터 범위를 고려

    • 딕셔너리 형태로 파라미터 값의 범위를 지정 후,
    • Grid Search 모델 선언 후에 학습데이터 학습을 하여 
    • 가장 좋은 성능을 보인 파라미터 값으로 자동으로 학습
    •  예측 및 평가 

    2-2) Random Search : 모든 파라미터 범위를 고려

    • 딕셔너리 형태로 파라미터 값의 범위를 지정 후,
    • Random Search 모델 선언 후에 학습데이터 학습을 하여 
    • 가장 좋은 성능을 보인 파라미터 값으로 자동으로 학습
    •  예측 및 평가 
    # 파라미터 정하기
    params = { 'max_depth': range(1,11),  'min_samples_split' : range(10,51,10)  }
    
    # 모델
    from sklearn.tree import DecisionTreeClassifier
    model_dt = DecisionTreeClassifier()
    
    # Grid 또는 RandomSerach 사용
    from sklearn.model_selection import GridSearchCV
    
    model = GridSearchCV(model_dt,  params, cv=10)
    
    ## GridSearchCV 의 경우 n_iter옵션을 지정하지 않음 =>  반복횟수
    model = RandomizedSearchCV( model_dt, params,cv=3 ,n_iter=20)
    
    
    # 모델 학습
    model.fit(x_train, y_train)
    
    # 결과확인하기 => 어디에서 하이퍼파라미터가 최적일지 찾기 
    model.cv_results_  #t수행정보 값들
    model.best_params_  #최적파라미터 값들
    model.best_score_   #최고 성능 값들
    
    
    ## 결과를 시각화해서 보는 것도 좋음
    pd.Dataframe 만들어서 시각화 해보기

    6.앙상블

    여러 모델을 쒺끼해서 더 강한 모델을 만드는 것

    1.) voting 보팅 

    =>  여러 모델들중에서 투표로  최종 예측결과를 결정


    2.) Bagging 배깅 : 복원추출 샘플

    =>  여러 샘플 데이터를 부트스트랩하여 한가지 모델유형로 학습후, 모델 예측결과를 집계하여 결정

    • 범주형데이터는 투표방식으로 결과 집계
    • 연속형 데이터는 평균으로 결과 집계
    • 대표 : RandomForest  :
      • 여러 Decision Tree모델을 만들어서  각각 데이터 샘플링을 가지고 개별 학습후, 결과집계 후 결정
        • 주요 파라미터 : max_depth,  n_estimators

    3.) Boosting 부스팅 

    => 가중치를 부여하는 방식으로 이전 모델과 다음모델을 순차적으로 학습하여 진행,

    => Gradient Boosting  : 이전의 모델의 학습 결과가 다음 모델읠 학습 결과에 영향을 주는 줘서 가중치를 계산

    • 3-1) XGBoost : GBM(gradient boost machine)의 병렬 학습을 구현
      • 장점
        • 회귀/분류 가능,
        • 자체적으로 tree모델에서 가지치기 함
        • 결측치 알아서 처리
        • Cross validation 알아서 함  
      • 주요 하이퍼 파라미터
        • n_estimator : 디폴트 100  
        • max_depth : 디폴트 6
      • early_stopping_rounds : 모델 학습시에  n_estimator 갯수를 정할 때 유용 
    model.fit (x_train , y_train , eval_set= [(x_train , y_train ), (x_val , y_val )],
    		early_stopping_rounds=10 )
    • 3-2) LightGBM

    4.)  Stacking 스태킹

    => 여러 모델의 예측값을 , 최종 모델의 학습데이터로 사용하여 예측을 함

    • -기본 모델을 3~4개 정도 선택하기 ->  예측값을을  최종모델의 학습데이터로 사용

     


    ### 정리

    회귀 : LinearRegression, KNeighborsRegressor, DecisionTreeRegressor, RandomForestRegressor, XGBRegressor,LGBMRegressor

    회귀-성능평가 : MAE, MSE, MAPE, r2_score

    분류 : LogisticRegression. KNeighborsClassifier,  DecisionTreeClassifier, RandomForestClassifier XGBClassifier,LGBMClassifier

    분류-성능평가 : Accuarcy, Recall, Precision, confusion_matrix, f1_score, classification_report

     

    성능튜닝 : cross_val_score, RandomizedSerachCV, GridSearchCV


     

    다음편은 머신러닝- 비지도 학습을 배울 예정이다 가보자굿 ~~~

Designed by Tistory.