파이썬/판다스

pandas 배우기 5편 모델 : 훈련, GridSearchCV, 하이퍼파라미터, 평가 : logisticRegression, RandomForest, XGBClassifier

Olivia-BlackCherry 2024. 11. 9. 08:06

 

머신러닝의 다양한 모델에 대해 알아보고, 훈련, 평가, Gridsearch를 이용한 최적의 파라미터 찾는 방법 등을 알아본다. 

 

 

 

목차

    < logisticRegression >

    1. Model Building

      모델 설계 및 학습

    from sklearn.linear_model import LogisticRegression
    lr = LogisticRegression()
    lr.fit(X_train, y_train)
    array([1., 1., 0., ..., 1., 1., 0.])

     

      예측

    y_pred = lr.predict(X_test)
    y_pred
    array([1., 1., 0., ..., 1., 1., 0.])

     

     

    2. 피처 중요도

    1) feature importance 확인하기
      coef 절대값이 클 수록 해당 피처의 중요도 높음
    lr.coef_ : 회귀계수(2차원출력)

    lr.coef_
    array([[ 3.79084262e-04, -1.49813091e-05, -7.29626435e-07,
             8.37010244e-03, -2.21317256e-06,  6.43304607e-06,
            -2.54137725e-05, -5.66106961e-04]])

     

    2) feature_names_in_
    컬럼이름

    lr.feature_names_in_
    array(['claim_status_opinion', 'author_ban_status_banned',
           'author_ban_status_under review', 'video_duration_sec',
           'video_view_count', 'video_share_count', 'video_download_count',
           'video_comment_count'], dtype=object)

     

    3) dataframe 만들기

    coef= pd.DataFrame({'coefficients Name': lr.feature_names_in_, 'coefficients': lr.coef_[0]})
    coef

     

    4) sort_values(by=?, key=abs)
    절대값(abs) 기준 정렬하기

    coef.sort_values(by='coefficients', key=abs).reset_index(drop=True)

     
    5) feature_importances_
    - tree기반 모델에서는 피처 중요도 확인하고 싶을 때 feature_importances_ 이용 가능
    - logisticRegression은 없음 : - lr.feature_importances_ (X)
     
     

     

    3. 분류 평가

    from sklearn.metrics import classification_report
    from sklearn.metrics import confusion_matrix, ConfusionMatrixDisplay

     
    1) confusion_matrix(y_test, y_pred)

    from sklearn.metrics import confusion_matrix
    result= confusion_matrix(y_test, y_pred)
    print(result)
    [[3304 3757]
     [1162 6085]]

     

    2) ConfusionMatrixDisplay(혼동행렬).plot()

    from sklearn.metrics import ConfusionMatrixDisplay
    ConfusionMatrixDisplay(result).plot()
    plt.show()

     
    3)  Classification_report(y_test, y_pred, target_names=?)

    from sklearn.metrics import classification_report
    target_labels=['verified', 'not verified']
    print(classification_report(y_test, y_pred, target_names=target_labels))

     

    4) recall, precision, f1_score, accuracy_score

    from sklearn.metrics import recall_score, precision_score, f1_score, accuracy_score
    accuracy_score(y_test, y_pred)
    precision_scre(y_test, y_pred)
    recall_score(y_test, y_pred)
    f1_score(y_test, y_pred)

     

     

     

     < random forest model >

    1. 모델

    from sklearn.ensemble import RandomForestClassifier
    rf = RandomForestClassifier()

     

    2. 하이퍼파라미터 튜닝

    params = {'n_estimators': [50, 100],
             'max_depth': [10, 50],
             'min_samples_leaf':[1, 5],
             'min_samples_split': [ 10,20],
             'max_features':['sqrt'],
             'max_samples':[.5, .7]}


    1) n_estimators : 트리의 개수
    기본값 : 100

    n_estimators : [100,200,300]

     

    2) max_depth : 개별 트리의 최대 깊이, 깊이가 깊을수록 모델은 데이터를 세밀하게 학습하나 과적합의 위험 높아짐
    기본값 : None

    max_depth : [10,20,None]

     

    3) min_samples_leaf : 리프 노드의 최소 샘플 수
    기본값 : 1

    min_samples_leaf : [1,2,4]


    4) min_samples_split : 노드 분할 위한 최소 샘플 수. 값이 낮으면 모델이 복잡, 높으면 과적합 예방. 0.01같은 비율 또는 2 같은 정수 값으로 샘플 수를 설정함.
    기본값 : 2
    예를 들어 min_samples_split=0.1이라면 100개의 데이터 중 0.1은 10개이므로, 노드에 최소 10개의 샘플이 있어야 분할이 가능하다.

    min_samples_split : [2, 4, 10]

     

    5) max_features : 각 노드에서 분할에 사용할 최대 특성 수. sqrt는 특성 수의 제곱근만큼 사용함.
    기본값 :'auto', 분류문제에서 'sqrt' 선택됨
    예를 들어 컬럼이 4개라면 sqrt(4) = 2개 만큼 쓰겠다.

    max_features :['auto', 'sqrt', 'log2']

     

    6) max_samples : 각 트리가 학습할 때 사용하는 랜덤한 샘플의 비율, 전체의 몇 퍼센트의 데이터 사용할지? 과적합을 방지하며, 일부 데이터만 사용하기에 학습 속도도 개선됨
    0 < max_samples <=1
    기본값: None(전체 데이터셋)
    예를 들어 총 데이터가 100개이며 max_samples=0.5라면 50개의 데이터를 랜덤하게 선택해 학습함

    max_samples : [0.5, 0.7, 0.9]

     
    6) bootstrap : 부트스트랩 샘플링 사용
    부트스트랩 : 중복을 허용한 랜덤 샘플링 --> 다양성이 증가하여 오버피팅 방지
    기본값 : True

    bootstrap = True

     

     

     

    3. GridSearch 최적의 파라미터 찾기

    1) scoring
    gridsearchCV가 각 하이퍼파라미터 조합에 대해 모델 성능을 평가하는데 사용할 다양한 성능 메트릭 정의

    scoring = {'accuracy', 'precision', 'recall', 'f1'}

     

    2) refit
    최적의 모델으로 다시 학습할 때 기준이 될 메트릭

    refit='recall'

     

    3) 단일 metric
    만약 단일 metric으로 평가하려면 scroing='accuracy'처럼 단일 metric을 적용함.
    refit은 자동으로 해당 metric이 적용되기 때문
     

    4) cv 
    교차검증전략
    5개의 fold로 나눠서 검증함

    cv=5

     

    5) n_jobs 
    사용할 cpu코어 개수, -1은 가능한 모든 코어 사용하겠다는 의미

    n_jobs=-1

     

    6) verbose
    진행 상황 출력 여부, 1은 모두 출력하겠다는 의미

    verbose=1

     

    7) error_score 
    어떤 에러인지 설명해주기 때문에 좋음

    error_score ='raise'

     

    8) %%time
    매직코맨드 %, %% + time을 이용해서 시간을 보여줄 수 있다.

    %%time

     
     
    - 전체 코드 -

    from sklearn.model_selection import GridSearchCV
    
    scoring = {'accuracy':'accuracy',
              'precision':'precision',
              'recall':'recall',
              'f1':'f1'}
    
    grid_rf = GridSearchCV(estimator = rf, 
                           param_grid =params, 
                           scoring = scoring,
                           refit = 'accuracy',
                           cv=5, 
                           verbose=1,
                           n_jobs=-1,
                           error_score='raise')
                           
    grid_rf.fit(x_tr, y_tr)

     
    9) 최적의 하이퍼파라미터

    grid_rf.best_params_
    {'max_depth': 50,
     'max_features': 'sqrt',
     'max_samples': 0.7,
     'min_samples_leaf': 5,
     'min_samples_split': 10,
     'n_estimators': 50}

      
    10) 하이퍼파라미터 평가

    # average validation score
    grid_rf.best_score_
    0.993995633187773

     

     

     < XGBoost >

    Extreme Gradient Boosting
    회귀 / 분류와 같은 예측 모델에 사용함
    트리 기반의 앙상블 학습 알고리즘
     

    모델 XGBoostClassifier

    from xgboost import XGBClassifier

    1) objective : 목적함수
      binary : logistic
    이진 분류를 위한 로지스틱 회귀 (0 또는 1의 이진 출력)

    xgb = XGBClassifier(objective = 'binary:logistic', random_state=0)

      multi : softmax
    다중 클래스 분류 문제에서 가장 높은 확률을 가진 클래스의 인덱스 반환 
    num_class 파라미터 추가하여 클래스 수를 설정해야 함

    xgb = XGBClassifier(objective='multi:softmax', num_class=3, random_state=42)

     

    2) 하이퍼파라미터

    cv_params = {'max_depth': [4,8,12],
                 'min_child_weight': [3, 5],
                 'learning_rate': [0.01, 0.1],
                 'n_estimators': [300, 500]
                 }

       min_child_wieght 
    각 트리의 리프 노드를 분할할 때 최소로 필요한 데이터 샘플 수이다.
    규제 파라미터로서 역할을 하고, 크기가 클 수록 underfit이 발생할 가능성이 높다.
    0-1 사이의 값을 취한다.
      learning_rate
    각 트리가 이전 트리의 오차를 얼마나 크게 반영하여 학습할지를 결정한다.
    lr이 크면 이전 트리의 오차를 크게 반영하기에 모델학습이 빠르게 되지만, 수렴하지 못하고 발산할 가능성이 있다.
    lr이 작으면 이전 트리의 오차를 작게 반영하여 모델이 안정적으로 수렴하나, 학습이 느려질 수 있다.
     
    3) 평가
    모델성능평가지표
    각 지표에 대해 교차검증 결과가 계산됨

    scoring = {'accuracy', 'recall', 'f1', 'precision'}

     

    4) cv 
    cross validation 교차 검증
    데이터 분할에 따른 편향을 줄이고 모델의 일반화 성능을 평가할 수 있음
    데이터를 훈련 세트와 검증세트로 여러 번 나누어 각 폴드에서 모델 성능을 평가함.
    예를 들어 cv=3이라하면, 3개의 폴드가 있다.

    1) 훈련 훈련 검증 평가=a
    2) 훈련 검증 훈련 평가=b
    3) 검증 훈련 훈련 평가=c
      (a+b+c)/3

    여기서 각각 모델을 훈련 및 평가한다. 그 결과로 3개의 점수가 생성된다. 이 점수는 각 폴드의 성능을 대변한다. 이 점수들의 평균을 계산한 것이 최종 점수가 된다.
     

    5) refit
    여러 지표 중 특정 지표를 기준으로 모델을 재학습
    만약 refit='recall'이라면, 교차 검증 후 recall 점수가 가장 높은 하이퍼파라미터 조합으로 모델을 재학습함  
     

    6) 훈련

    grid_xgb.fit(x_tr, y_tr)

     

    7) best_score_

    grid_xgb.best_score_

     

    8) best_params_

    gird_xgb.best_params_

     

     

    데이터분석 모델링