상세 컨텐츠

본문 제목

머신러닝과 딥러닝(8)_LightGBM

카테고리 없음

by teminam 2023. 6. 14. 15:30

본문

1. credit 데이터셋 알아보기

sns.barplot(x='Payment_of_Min_Amount', y='Credit_Score', data=credit_df)
# 이전달 이자를 갚지 않고, 이번달에 돈을 안쓰는 사람(No), 쓰는사람(Yes0은 신용도가 낮음, NM(Not money)은 무슨뜻??

plt.figure(figsize=(20, 5))
sns.barplot(x='Occupation', y='Credit_Score', data=credit_df)

# corr(): 각 열 간의 상관계수를 반환하는 메소드
# 피어슨, 캔달-타우, 스피어먼
plt.figure(figsize=(12, 12))
sns.heatmap(credit_df.corr(), cmap='coolwarm', vmin=-1, vmax=1, annot=True)

# Credit_History_Age의 데이터를 개월수로 변경
# 22년 Years and 1 Months -> 22*12+1

# Credit_History_Age 데이터 변환 함수
# def convert_to_months(age):
#     if pd.isnull(age):  # NaN 값 처리
#         return np.nan
#     try:
#         years = int(age.split(' Years ')[0])  # 연 단위 추출
#         months = int(age.split(' and ')[1].split(' Months')[0])  # 월 단위 추출
#         total_months = years * 12 + months  # 개월 수로 계산
#         return total_months
#     except:
#         return np.nan  # 변환 실패 시 NaN 반환

# # Credit_History_Age 열 변환
# credit_df['Credit_History_Age'] = credit_df['Credit_History_Age'].apply(convert_to_months)

# # 변환된 데이터 확인
# print(credit_df)
# 강사님 코드
# Credit_History_Age의 데이터를 개월로 변경
# 22 Years and 1 Months -> 22 * 12 + 1

credit_df['Credit_History_Age'] = credit_df['Credit_History_Age'].str.replace(' Months', '')
credit_df['Credit_History_Age'] = pd.to_numeric(credit_df['Credit_History_Age'].str.split(' Years and ', expand=True)[0])*12 + pd.to_numeric(credit_df['Credit_History_Age'].str.split(' Years and ', expand=True)[1])

    위의 코드는 'Credit_History_Age' 열의 데이터를 변경하는 과정을 나타내고
    있습니다. 코드를 한 줄씩 설명해보겠습니다:

    1. `credit_df['Credit_History_Age'].str.replace(' Months', '')`:
      - 'Credit_History_Age' 열의 값에서 ' Months' 문자열을 제거합니다. 이를
      위해 `str.replace()` 함수를 사용합니다.
      - 예를 들어, '22 Years and 1 Months'라는 값이 있으면 '22 Years and 1'로
      변경됩니다.

    2. `pd.to_numeric(credit_df['Credit_History_Age'].str.split(' Years and ',
    expand=True)[0])`:
      - 'Credit_History_Age' 열의 값을 ' Years and ' 문자열을 기준으로
      분할합니다. 이를 위해 `str.split()` 함수를 사용하고, `expand=True`
      설정하여 결과를 열로 확장합니다.
      - 분할된 첫 번째 열에는 연수(년)에 해당하는 값이 있습니다. 이를 숫자로
      변환하기 위해 `pd.to_numeric()` 함수를 사용합니다.
      - 예를 들어, '22 Years and 1'을 분할하면 첫 번째 열에는 '22'가 있습니다.

    3. `pd.to_numeric(credit_df['Credit_History_Age'].str.split(' Years and ',
    expand=True)[1])`:
      - 'Credit_History_Age' 열의 값을 ' Years and ' 문자열을 기준으로
      분할합니다. 이를 위해 `str.split()` 함수를 사용하고, `expand=True`
      설정하여 결과를 열로 확장합니다.
      - 분할된 두 번째 열에는 개월수에 해당하는 값이 있습니다. 이를 숫자로
      변환하기 위해 `pd.to_numeric()` 함수를 사용합니다.
      - 예를 들어, '22 Years and 1'을 분할하면 두 번째 열에는 '1'이 있습니다.

    4. `pd.to_numeric(credit_df['Credit_History_Age'].str.split(' Years and ',
    expand=True)[0])*12 + pd.to_numeric(credit_df['Credit_History_Age'].str.
    split(' Years and ', expand=True)[1])`:
      - 앞서 얻은 연수(년)과 개월수를 곱하여 총 개월 수로 변환합니다. 연수를
      12로 곱한 후 개월수를 더합니다.
      - 예를 들어, '22 Years and 1'의 경우 22 * 12 + 1로 계산되어 265가 됩니다.

    마지막으로, 위의 과정을 거친 결과를 'Credit_History_Age' 열에 대입하여 해당
    열의 값이 개월 수로 변경됩니다.

 

2. LightGBM(LGBM)

  • 트리기반 학습 알고리즘인 gradient boosting 방식의 프레임워크
  • 의사결정나무, 랜덤포레스트는 균형트리 분할방식(Level Wise)이라면, LGBM은 리프 중심 트리 분할(Leaf Wise)
  • GBM(Gradient Boosting): 모델1을 통해 y를 예측하고, 모델2에 데이터를 넣어 y를 예측, 모델3에 넣어 y를 예측하는 방식
  • 학습하는데 걸리는 시간이 적음(빠른 속도)
  • 메모리 사용량이 상대적으로 적은편
  • 적은 데이터셋을 사용할 경우, 과적합 가능성이 매우 큼(일반적으로 데이터가 1만개 이상은 사용해야 함)
    LightGBM (Light Gradient Boosting Machine)은 경사 부스팅 기반의 머신러닝
    알고리즘 중 하나입니다. LightGBM은 Microsoft에서 개발한 오픈 소스
    프로젝트로, 대규모 데이터셋에서 빠른 학습과 예측 성능을 제공하는 것이
    특징입니다.

    LightGBM은 일반적인 그래디언트 부스팅 트리와 비슷한 방식으로 동작합니다.
    그러나 LightGBM은 몇 가지 주요한 차이점이 있습니다:

        1. Leaf-wise 분할: 일반적인 그래디언트 부스팅 트리 알고리즘은 균형 잡힌
        트리 분할을 수행합니다. 반면 LightGBM은 Leaf-wise 방식으로 트리를
        성장시키는데, 이는 한 번에 하나의 리프 노드만 확장하는 것을 의미합니다.
        이를 통해 LightGBM은 균형 잡힌 트리 분할보다 더 적은 손실을 가진 리프를
        생성할 수 있습니다.

        2. 분할 포인트 방식: LightGBM은 이진 트리 분할 대신에 분할 포인트라는
        개념을 사용합니다. 분할 포인트는 각 특성의 값을 정렬한 후, 이를 기준으로
        트리를 분할합니다. 이를 통해 LightGBM은 더 적은 비용으로 최적의 분할을
        탐색할 수 있습니다.

        3. 데이터 병렬 학습: LightGBM은 데이터 병렬 학습을 지원하여 대규모
        데이터셋을 처리하는 데 효율적입니다. 데이터 병렬 학습은 데이터를 여러 개의
        작은 하위 데이터셋으로 분할하여 각각의 하위 데이터셋에서 독립적으로 트리를
        학습시키는 것을 의미합니다.

        4. 적은 메모리 사용: LightGBM은 적은 메모리를 사용하여 대규모 데이터셋을
        처리할 수 있습니다. 이는 트리 학습 과정에서 메모리 사용을 최적화하고,
        특성과 인스턴스에 대한 데이터 표현을 최소화함으로써 가능합니다.

    LightGBM은 분류 및 회귀 문제에 널리 사용되며, 특히 대규모 데이터셋에서
    성능과 속도 면에서 우수한 결과를 보여줍니다. 또한 LightGBM은 다양한
    하이퍼파라미터를 조정하여 모델의 성능을 향상시킬 수 있는 유연성도
    제공합니다.

 

    Random Forest와 LightGBM은 둘 다 앙상블 기반의 머신러닝 알고리즘이지만 몇
    가지 다른 점이 있습니다.

        1. 트리 분할 방식: Random Forest는 결정 트리를 사용하며, 트리의 분할을 위해
        전체 특성 중 일부 특성을 무작위로 선택합니다. 이는 특성의 일부만 고려하여
        모델을 학습하므로 특성 선택의 다양성을 높이고 과적합을 줄이는 효과가
        있습니다. 반면에 LightGBM은 LightGBM의 특징 중 하나인 Leaf-wise 분할 방식을
        사용합니다. 이는 최적의 분할을 탐색하기 위해 최대로 손실을 줄일 수 있는
        리프 노드를 확장하는 방식입니다.

        2. 학습 방식: Random Forest는 부트스트랩 샘플링(bootstrap sampling)을
        사용하여 훈련 데이터의 일부를 사용합니다. 각 트리는 랜덤하게 선택된
        부트스트랩 샘플에 대해 학습됩니다. 이를 통해 다양한 훈련 데이터를 사용하여
        트리를 학습하고, 앙상블 모델을 구성합니다. LightGBM은 일반적으로
        그레이디언트 부스팅 기반의 알고리즘처럼 순차적으로 학습을 진행합니다.
        데이터 병렬 학습을 지원하기는 하지만, 일반적으로 부트스트랩 샘플링을
        사용하지는 않습니다.

        3. 메모리 사용: Random Forest는 모든 트리를 동시에 학습하고 메모리에
        보관해야 하기 때문에 대규모 데이터셋에 대한 메모리 사용이 증가할 수
        있습니다. 반면에 LightGBM은 Leaf-wise 분할과 데이터 병렬 학습을 통해 적은
        메모리로도 대규모 데이터셋을 처리할 수 있습니다.

        4. 속도: LightGBM은 Leaf-wise 분할과 데이터 병렬 학습 등의 최적화 기법을
        사용하여 빠른 학습과 예측 속도를 제공합니다. 특히 대규모 데이터셋에서
        Random Forest보다 효율적인 결과를 보일 수 있습니다.

        5. 하이퍼파라미터 조정: Random Forest는 주로 트리의 개수와 각 트리의 깊이와
        같은 하이퍼파라미터를 조정하여 모델을 튜닝합니다. LightGBM은 이와 함께
        learning rate, num_leaves, max_depth 등 다양한 하이퍼파라미터를 조정하여
        모델의 성능을 향상시킬 수 있습니다.

    이러한 차이점들로 인해 Random Forest와 LightGBM은 서로 다른 특성을 가지며,
    문제에 따라 적절한 알고리즘을 선택할 수 있습니다. Random Forest는 다양한
    특성을 고려하여 안정적인 성능을 보이고, LightGBM은 대규모 데이터셋이나
    속도에 민감한 경우에 효과적일 수 있습니다.

 

    그래디언트 부스팅(Gradient Boosting)은 앙상블 학습의 일종으로, 여러 개의
    약한 학습기(weak learner)를 순차적으로 학습하여 강력한 예측 모델을 구축하는
    방법입니다. 그래디언트 부스팅은 오차를 최소화하기 위해 이전 모델의 오차를
    보정하는 방식으로 동작합니다.

    그래디언트 부스팅은 다음과 같은 주요 단계로 이루어집니다:

        1. 초기 모델 학습: 첫 번째 모델을 학습하여 초기 예측값을 만듭니다.
        일반적으로는 단순한 모델인 결정 트리(Decision Tree)를 사용합니다.

        2. 잔차 계산: 초기 예측값과 실제 타깃 값 사이의 잔차(오차)를 계산합니다.
        잔차는 실제 타깃 값에서 현재까지의 예측값을 뺀 값으로, 이는 모델의 예측이
        얼마나 잘못되었는지를 나타냅니다.

        3. 잔차에 대한 새로운 모델 학습: 이전 모델의 잔차를 타깃 값으로 간주하여
        새로운 모델을 학습합니다. 이 새로운 모델은 이전 모델의 예측 오차를 보정하는
        방향으로 학습됩니다. 새로운 모델은 기존 모델과 앙상블되어 예측값을
        업데이트합니다.

        4. 예측값 업데이트: 새로운 모델을 사용하여 예측값을 업데이트합니다. 이전
        모델의 예측값에 새로운 모델의 예측 결과를 더하면, 예측값이 점진적으로
        개선됩니다.

        5. 위 과정을 반복: 위 단계들을 반복하여 추가적인 모델들을 학습하고 예측값을
        업데이트합니다. 이는 예측 오차를 점차적으로 보정하여 최종 예측 모델을
        생성합니다.

    그래디언트 부스팅은 학습 데이터의 잔차를 보정하는 방식으로 동작하기 때문에,
    이전 모델의 오차를 보정하는 새로운 모델들이 추가됨에 따라 모델의 성능이
    개선됩니다. 이를 통해 강력한 예측 모델을 구축할 수 있습니다. 그래디언트
    부스팅은 다양한 종류의 학습 알고리즘과 결합하여 사용할 수 있으며, 대표적

    인 그래디언트 부스팅 알고리즘으로는 Gradient Boosting Machine(GBM),
    XGBoost, LightGBM 등이 있습니다.

 

 

 

    `roc_auc_score(y_test, proba1, multi_class='ovr')`는 다중 클래스 분류
    문제에서의 ROC 곡선 아래 면적(Area Under the ROC Curve, AUC)을 계산하는
    함수입니다. ROC 곡선은 이진 분류에서 사용되는 평가 지표이지만, 다중 클래스
    문제에서도 사용 가능합니다.

      - `y_test`: 실제 타깃 값들로 구성된 배열입니다. 각 샘플의 실제 클래스
      레이블을 포함합니다.
      - `proba1`: 다중 클래스 분류 모델의 예측 확률(또는 점수) 배열입니다. 각
      샘플에 대한 다중 클래스 예측 결과의 확률 또는 점수 값을 포함합니다.
      - `multi_class='ovr'`: 다중 클래스 분류에서의 처리 방법을 지정합니다.
      `'ovr'`은 "One-vs-Rest" 방식을 의미하며, 각 클래스에 대해 이진 분류를
      수행하여 각 클래스에 속하는지 아닌지를 예측합니다. 이를 통해 다중 클래스
      문제를 이진 분류 문제로 변환하여 AUC를 계산합니다.

    `roc_auc_score()` 함수는 주어진 다중 클래스 문제에서 AUC 값을 반환합니다.
    다중 클래스 AUC는 "One-vs-Rest" 방식으로 계산되며, 각 클래스에 대해 해당
    클래스와 다른 모든 클래스를 구분하는 이진 분류 문제로 변환하여 AUC를
    계산합니다. 따라서, 각 클래스에 대한 이진 분류 AUC를 계산한 후, 평균값을
    취하여 최종 다중 클래스 AUC 값을 얻습니다.

3. RandomizedSearchCV

  • 분류기를 결정하고, 해당 분류기의 최적의 하이퍼 파리미터를 찾기 위한 방법
  • 튜닝하고 싶은 파라미터를 지정하여 파리미터 값의 범위를 정하고, n_iter값을 설정하여 해당 수 만큼 Random하게 조합하여 반복 적용
# n_estimators: 반복 수행하는 트리의 갯수(기본값: 100), 값을 크게 지정하면 학습시간도 오래걸리며, 과적합이 발생할 수 있음
# max_depth: 트리의 최대 깊이(기본값: -1 "니가 할 수 있는데까지 내려가라")
# num_leaves:
# learning_rate: 학습률(기본값: 0.1)

params = {
    'n_estimators':[100, 300, 500, 1000],
    'max_depth':[-1, 30, 50, 100],
    'num_leaves':[5, 10, 20, 50],
    'learning_rate':[0.01, 0.05, 0.1, 0.5]
}

 

    `RandomizedSearchCV`는 scikit-learn 라이브러리에서 제공되는 하이퍼파라미터
    튜닝을 위한 검증 방법 중 하나입니다. 머신러닝 모델의 성능을 최적화하기 위해
    다양한 하이퍼파라미터 조합을 탐색하는 데 사용됩니다.

    일반적으로 머신러닝 모델은 여러 개의 하이퍼파라미터를 가지며, 이러한
    하이퍼파라미터들은 모델의 학습 알고리즘, 모델의 구조, 학습 과정 등을
    제어합니다. 하이퍼파라미터의 조정은 모델의 성능과 일반화 능력에 큰 영향을
    미칩니다. `RandomizedSearchCV`는 랜덤한 하이퍼파라미터 조합을 사용하여 특정
    범위 내에서 탐색하고, 최적의 조합을 찾기 위해 교차 검증을 수행합니다.

    `RandomizedSearchCV`의 주요 매개변수와 동작 방식은 다음과 같습니다:

        - `estimator`: 탐색 대상이 되는 머신러닝 모델을 지정합니다.
        - `param_distributions`: 탐색할 하이퍼파라미터들과 그들의 가능한 값 범위를 딕셔너리 형태로 지정합니다.
        - `n_iter`: 랜덤한 하이퍼파라미터 조합을 몇 번 탐색할지를 지정합니다.
        - `cv`: 교차 검증을 위해 데이터를 몇 개의 폴드로 나눌지를 지정합니다.
        - `scoring`: 모델의 성능을 평가하는 지표를 지정합니다.
        - `random_state`: 랜덤 시드 값으로, 재현 가능한 결과를 얻기 위해 설정할 수
        있습니다.

    `RandomizedSearchCV`는 주어진 하이퍼파라미터 공간에서 무작위로 조합을
    선택하고, 각 조합에 대해 지정된 교차 검증 횟수만큼 모델을 학습 및 평가하여
    최적의 조합을 찾습니다. 이후 최적의 조합으로 모델을 다시 학습시켜 최종
    모델을 얻을 수 있습니다.

    `RandomizedSearchCV`를 사용하면 하이퍼파라미터 튜닝을 자동화하고, 모델의
    성능을 향상시키는 데 도움을 줍니다.