KT 에이블스쿨 19일차(1)

박기범·2023년 2월 25일
0

에이블스쿨

목록 보기
23/95

오늘은 머신러닝의 마지막 날이였습니다. 머신러닝 성능 향상을 위한 앙상블에 대해 배웠습니다.



하이퍼파라미터로 성능 향상

Grid Search파라미터 조합수 x CV값 만큼 실행을 합니다.
Random Search전체 파라미터 조합 중에 일부만 성능에 대해 확인합니다.

하이퍼파라미터의 최적화된 성능을 얻었더라 하더라도 해당 성능을 온전히 보장하지는 않습니다. 완벽한 모델링을 하기 보다는 적절한 예측력을 위해 적절한 복잡도를 가진 모델을 완성할 수 있어야합니다.

▶Random Search실습

    # 불러오기
    from sklearn.model_selection import cross_val_score, RandomizedSearchCV
    from sklearn.tree import DecisionTreeRegressor
    from sklearn.metrics import mean_absolute_error, r2_score
    # 선언하기
    model_DT = DecisionTreeRegressor()
    # 성능예측
    cv_score = cross_val_score(model_DT, x_train, y_train, cv=10)

    #튜닝시작
    # 파라미터 선언
    # max_depth: 1~50
    param = {'max_depth' : range(1,51)}

    # Random Search 선언
    # cv=5
    # n_iter=20 #랜덤하게 시도할 횟수
    # scoring='r2'
    model = RandomizedSearchCV(model_DT, param, cv=5, n_iter=20)
    #cv: K-Fold 분할 개수입니다(기본값=5)
    # 학습하기
    model.fit(x_train, y_train)

    # 중요 정보 확인
    print(model.cv_results_['mean_test_score'])
    print('최적파라미터:', model.best_params_)
    print('최고성능:', model.best_score_)

해당 Random Seach의 동작 횟수를 보면 파라미터 max_depth를 1부터 50까지 반복하고 cv값이 5이기 때문에 총 50 * 5 = 250회 반복해서 최적의 파라미터 값을 찾아내서 학습을 합니다.

해당 알고리즘으로 학습 한 후에 정보를 확인하기 위해서는 여러가지 내장함수를 이용하게 되는데 모델의 학습 결과를 알고 싶으면 모델.cv_results_['mean_test_score']를 사용하면 됩니다.

만약 최적의 파라미터 값을 알고 싶다면 모델.best_params_를 사용해주면 max_depth 의 최적의 값을 알려줍니다.

만약 실행했던 성능중 제일 높았던 값을 보기 위해서는 모델.best_score_을 사용해주면 성능이 제일 좋았던 값을 알려줍니다.

만약 변수의 중요도를 확인하고자 하면 모델.best_estimator_를 사용하면 각 변수의 중요도를 알 수 있습니다.



앙상블(Ensemble)

통합은 힘이다라는 정의에 뜻을 두고 있으며 약한 모델이 올바르게 결합한다면 더 정확하고 견고한 모델을 얻을 수 있다라는 생각으로 만들게 되면 머신러닝 알고리즘입니다. 즉, 여러 개의 모델을 결합하여 훨씬 강력한 모델을 만들어내는 목적을 가진 것이 앙상블입니다.

▶보팅
여러 개의 분류기가 투표를 통해 최종 예측 결과를 투표를 통해 결정하는 방식입니다.
하드보팅은 다수 분류기가 에측한 값이 최종 결과 값이 됩니다.
소프트보팅은 모든 분류기가 예측한 값을 결정 확률로 평균을 구해서 확률이 높은 그 값을 최종 결과 값으로 결정합니다.

데이터를 여러 알고리즘으로 돌려봐서 해당 알고리즘들의 결과 값을 투표로 정해서 사용하는 것이 보팅입니다.


▶배깅
배깅은 하나의 알고리즘만 사용해서 결과를 집계하여 최종 결과를 얻는 방법입니다.(알고리즘은 같지만 데이터가 랜덤이기 때문에 다른 결과 값이 나옵니다.)

범주형 데이터에서는 투표 방식으로 결과를 집계하고 연속형 데이터에서는 평균으로 결과를 집계합니다.


▶랜덤포레스트
배갱의 가장 대표적인 알고리즘입니다. 여러 결정 트리 모델이 전체의 데이터에서 배깅 방식으로 각자의 데이터를 샘플링 진행합니다. 각 모델이 샘플링된 데이터를 학습한 후 결과를 집계하여 최종결과를 결정합니다. 기본적으로 Decision Tree알고리즘을 사용합니다.

랜덤이라고 이름이 붙은 것은 데이터 샘플링이 일단 랜덤으로 나누어지기 때문이고 결정트리로 인해 만들어진 모델들이 랜덤으로 변수를 설정하기 때문에 랜덤이라는 이름이 붙었습니다.
포레스트의 의미는 결정트리의 모델이 여러개 모여서 숲을 이룬다해서 포레스트라는 이름이 붙었습니다. 따라서 위 두개의 특징 때문에 랜덤포레스트라는 이름을 가지게 되었습니다.

랜덤포레스트의 사용방법은 아래와 같습니다.

	# 선언하기
    model = RandomForestClassifier(max_depth=5, random_state=1)
    # 학습하기
    model.fit(x_train, y_train)
    # 예측하기
    y_pred = model.predict(x_test)
    # 평가하기
    print(confusion_matrix(y_test, y_pred))
    print(classification_report(y_test, y_pred))
    # Feature 중요도 확인
    plt.barh(list(x), model.feature_importances_)
    plt.show()

▶부스팅(Boosting)
같은 유형의 알고리즘 분류기 여러 개에 대해 순차적으로 학습을 진행하는 방식으로 대표적인 알고리즘으로는 XGBoost와 LightGBM 알고리즘이 있습니다.







머신러닝의 마지막 날로 머신의 성능을 어떻게 하면 더 올릴 수 있을지에 대해 배웠습니다. 다음장에서 최종적으로 정리하겠습니다.




※공부하고 있어 다소 틀린점이 있을 수 있습니다. 언제든지 말해주시면 수정하도록 하겠습니다.
※용어에 대해 조금 공부 더 해서 수정하겠습니다.

profile
개발자가 되기 위한 한걸음

0개의 댓글