카테고리 없음
머신러닝과 딥러닝(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출력