카테고리 없음

머신러닝과 딥러닝(7)_랜덤 포레스트

teminam 2023. 6. 14. 15:30

1. hotel 데이터셋 알아보기

 

    * hotel: 호텔 종류
    * is_canceled: 취소 여부
    * lead_time: 예약 시점으로부터 체크인 될 때까지의 기간(얼마나 미리 예약했는지)
    * arrival_date_year: 예약 연도
    * arrival_date_month: 예약 월
    * arrival_date_week_number: 예약 주
    * arrival_date_day_of_month: 예약 일
    * stays_in_weekend_nights: 주말을 끼고 얼마나 묶었는지
    * stays_in_week_nights: 평일을 끼고 얼마나 묶었는지
    * adults: 성인 인원수
    * children: 어린이 인원수
    * babies: 아기 인원수
    * meal: 식사 형태
    * country: 지역
    * distribution_channel: 어떤 방식으로 예약했는지
    * is_repeated_guest: 예약한적이 있는 고객인지
    * previous_cancellations: 몇번 예약을 취소했었는지
    * previous_bookings_not_canceled: 예약을 취소하지 않고 정상 숙박한 횟수
    * reserved_room_type: 희망한 룸타입
    * assigned_room_type: 실제 배정된 룸타입
    * booking_changes: 예약 후 서비스가 몇번 변경되었는지
    * deposit_type: 요금 납부 방식
    * days_in_waiting_list: 예약을 위해 기다린 날짜
    * customer_type: 고객 타입
    * adr: 특정일에 높아지거나 낮아지는 가격
    * required_car_parking_spaces: 주차공간을 요구했는지
    * total_of_special_requests: 특별한 별도의 요청사항이 있는지
    * reservation_status_date: 예약한 날짜
    * name: 이름
    * email: 이메일
    * phone-number: 전화번호
    * credit_card: 카드번호

 

plt.figure(figsize=(15, 5))
sns.barplot(x=hotel_df['arrival_date_month'], y=hotel_df['is_canceled'], order=months)
# calendar 라이브러리를 사용해서, 달의 영어 이름에 따라 정렬하여 추울때 취소율이 높다는 것을 확인

sns.barplot(x=hotel_df['is_repeated_guest'], y=hotel_df['is_canceled'])
# 처음 온사람들이 취소율이 높고, 다시 왔던 사람들이 취소 율이 낮음. 이는 연관관계가 어는정도 있음

sns.barplot(x=hotel_df['deposit_type'], y=hotel_df['is_canceled'])
# no deposit: 후불
# refundable deposit_type: 환불
# non refund: 환불 안됨(날짜 다 지나서)

plt.figure(figsize=(15,15))
sns.heatmap(hotel_df.corr(), cmap='coolwarm', vmax=1, vmin=-1, annot=True)

    위의 코드는 seaborn 라이브러리를 사용하여 히트맵(heatmap)을 그리는
    것입니다. 히트맵은 데이터 프레임의 각 변수들 간의 상관 관계를 시각화하는 데
    사용됩니다.

    - `plt.figure(figsize=(20,20))`: 그림의 크기를 설정합니다. 여기서는 가로와
    세로가 20인치인 큰 크기의 그림을 생성합니다.

    - `sns.heatmap(hotel_df.corr(), cmap='coolwarm', vmax=1, vmin=-1,
    annot=True)`: `hotel_df` 데이터 프레임의 상관 관계를 계산하고, 이를
    히트맵으로 나타냅니다. `hotel_df.corr()`은 데이터 프레임의 각 변수들 간의
    상관 관계를 계산합니다. `cmap='coolwarm'`은 히트맵의 색상 맵을 설정합니다.
    `vmax=1`과 `vmin=-1`은 색상 맵의 범위를 -1에서 1로 설정합니다.
    `annot=True`는 각 셀에 상관 계수 값을 표시합니다.

    히트맵은 색상을 사용하여 변수 간의 상관 관계를 시각화하므로, 밝은 색(예:
    빨간색)은 양의 상관 관계를, 어두운 색(예: 파란색)은 음의 상관 관계를
    나타냅니다. 주 대각선은 변수 자체의 상관 관계이므로 항상 1입니다. 히트맵을
    통해 변수들 간의 강한 상관 관계 또는 상관 관계가 없는 변수를 시각적으로
    파악할 수 있습니다.

    코드의 상세 설명은 다음과 같습니다:

    1. `hotel_df['arrival_date_month'].apply(lambda x: 'spring' if x in
    ['March', 'April', 'May'] else 'summer' if x in ['June', 'July', 'August']
    else 'fall' if x in ['September', 'October', 'November'] else 'winter')`:
    'arrival_date_month' 열의 각 월 값을 확인하고, `lambda` 함수를 사용하여
    조건문을 적용합니다. 조건문은 월의 값에 따라 계절을 할당합니다. 예를 들어,
    'March', 'April', 'May'는 'spring'으로 매핑됩니다. 이러한 계절 매핑 결과는
    새로운 시리즈로 반환됩니다.

    2. `season_dic = {'spring':[3,4,5], 'summer':[6,7,8], 'fall':[9,10,11],
    'winter':[12,1,2]}`: 계절과 해당하는 월을 매핑하기 위한 딕셔너리를
    정의합니다. 각 계절은 해당하는 월의 리스트로 표현됩니다. 예를 들어,
    'spring'은 3, 4, 5월에 해당합니다.

    3. `new_season_dic = {}`: 빈 딕셔너리를 생성합니다. 이 딕셔너리는 월과
    계절을 매핑하는 새로운 딕셔너리로 사용될 것입니다.

    4. `for i in season_dic: for j in season_dic[i]: new_season_dic[calendar.
    month_name[j]] = i`: `season_dic` 딕셔너리를 순회하면서 각 계절과 해당하는
    월을 매핑하는 새로운 딕셔너리 `new_season_dic`을 생성합니다. 이중 루프를
    사용하여 월을 순회하고, `calendar.month_name[j]`를 사용하여 월의 이름을
    가져옵니다. 이 이름을 키로 사용하여 `new_season_dic[calendar.month_name[j]] = i`와 같이 매핑합니다. 예를 들어, 'March'를 키로 사용하여 `new_season_dic
    ['March'] = 'spring'`과 같이 매핑됩니다.

    5. `new_season_dic`: 최종적으로 생성된 `new_season_dic`은 각 월에 대한 계절
    매핑을 포함하는 딕셔너리입니다. 월의 이름을 키로 사용하여 해당하는 계절을
    확인할 수 있습니다.

 

    위의 코드는 데이터프레임 `hotel_df`의 각 열(column)을 확인하고, 데이터
    타입이 'O' (Object)인 열을 찾아 `obj_list`에 추가하는 과정을 수행합니다.
    `obj_list`는 문자열 데이터를 가지는 열의 이름들을 담고 있습니다.

    1. `obj_list = []`: 빈 리스트 `obj_list`를 생성합니다. 이 리스트는 문자열
    데이터를 가지는 열의 이름들을 저장할 것입니다.

    2. `for i in hotel_df.columns:`: `hotel_df`의 각 열(column)을 순회합니다.

    3. `if hotel_df[i].dtype == 'O':`: 조건문을 사용하여 현재 열 `i`의 데이터
    타입이 'O' (Object)인지 확인합니다. 'O'는 주로 문자열 데이터를 나타내는
    데이터 타입입니다.

    4. `obj_list.append(i)`: 만약 데이터 타입이 'O'라면, 해당 열의 이름 `i`
    `obj_list`에 추가합니다.

    5. `obj_list`: 최종적으로 생성된 `obj_list`는 문자열 데이터를 가지는 열의
    이름들을 담고 있는 리스트입니다. 이 리스트는 데이터프레임에서 문자열
    데이터를 가지는 열들을 식별하는 데 사용될 수 있습니다. 출력된 결과는
    `hotel_df`에서 문자열 데이터를 가지는 열들의 이름들입니다.

2. 랜덤 포레스트(Random Forest)

  • Decision Tree는 매우 훌륭한 모델이지만 학습 데이터 오버피팅 하는 경향이 있음(가지치기 같은 방법을 통해 부작용을 최소화할 수 있지만 부족함)
  • 학습을 통해 구성해 놓은 다수의 나무들(Decision Tree)로부터 분류 결과를 취합해서 결론을 얻는 방식의 모델
  • Decision Tree 기반의 Bagging 앙상블 모델
  • 굉장히 인기있는 모델이며, 사용성이 쉽고 성능도 꽤 우수한 편

2-1. 앙상블(Ensemble) 모델

  • 여러개의 머신러닝 모델을 이용해 최적의 답을 찾아내는 기법
  • 보팅(Voting):
    • 다른 알고리즘 model을 조합해서 사용
    • 모델에 대해 투표로 결과를 도출
  • 배깅(Bagging):
    • 같은 알고리즘 내에서 다른 sample 조합을 사용
    • 샘플 중복생성을 통해 결과를 도출
  • 부스팅(Boosting):
    • 이전 오차를 보완해가면서 가중치를 부여
    • 성능이 매우 우수하지만, 잘못된 레이블이나 아웃라이어에 대해 필요 이상으로 민감
  • 스태킹(Stacking):
    • 여러 모델을 기반으로 예측된 결과를 통해 meta 모델이 다시 한번 예측
    • 성능을 극으로 끌어올릴 때 활용하지만, 과대적합을 유발할 수 있음(특히 데이터셋이 적은 경우)

3. ROC Curve

  • 이진분류의 성능을 측정하는 도구
  • 민감도와 특이도로 그려지는 곡선을 의미
* FPR(False Positive Rate)
        - 특이도(거짓 양성 비율)
        - FP / TN + FP
        - 실제값은 음성이지만 양성으로 잘못 분류한 것
* TPR(True Positive Rate)
        - 민감도(참인 양성비율)
        - TP / FN + TP
        - 실제로 양성이고 양성으로 잘 부류한 것

4. AUC(Area Under the ROC Curve)

  • ROC 커브와 직선 사이의 면적을 의미
  • AUC 값의 범위는 0.5~1이며 값이 클수록 예측의 정확도가 높음

5. 하이퍼 파라미터 최적의 값을 찾는 방법

  • Grid Search CV: 원하는 모든 하이퍼 파라미터를 적용해서 최적의 값을 찾아줌

6. 피쳐 중요도(Feature Importances)

  • Decision Tree에서 노드를 분기할 때 해당 피쳐가 클래스를 나누는데 얼마나 영향을 미쳤는지를 표기하는 척도
  • 0이면 클래스를 구분하는데 해당 피쳐가 선택되지 않았다는 것이며, 1이면 해당 피쳐가 클래스를 완벽하게 나눴다는 것을 의미

plt.figure(figsize=(5, 10))
sns.barplot(x='importances', y='features', data=top10)
# 가장 영향력 있는 피쳐값 탑10출력