상세 컨텐츠

본문 제목

머신러닝과 딥러닝(4)_의사결정 나무

카테고리 없음

by teminam 2023. 6. 13. 10:43

본문

1. bike 데이터셋 살펴보기

    0. datetime: 관측 일시
    1. count: 해당 일시의 자전거 대여 횟수
    2. holiday: 공휴일 여부 (1은 공휴일, 0은 공휴일이 아님)
    3. workingday: 근무일 여부 (1은 근무일, 0은 근무일이 아님)
    4. temp: 섭씨 온도
    5. feels_like: 체감 온도
    6. temp_min: 최저 온도
    7. temp_max: 최고 온도
    8. pressure: 대기 압력을 헥토파스칼(hPa) 단위로 나타낸 값
    9. humidity: 상대 습도를 백분율로 나타낸 값
    10. wind_speed: 풍속을 초당 미터 단위로 나타낸 값
    11. wind_deg: 풍향을 도 단위로 나타낸 값
    12. rain_1h: 최근 1시간 동안의 강우량을 밀리미터 단위로 나타낸 값(일부 값은 null로 표시될 수 있음)
    13. snow_1h: 최근 1시간 동안의 적설량을 밀리미터 단위로 나타낸 값 (일부 값은 null로 표시될 수 있음)
    14. clouds_all: 구름 덮개의 백분율
    15. weather_main: 해당 일시의 주요 날씨 카테고리 (예: 맑음, 흐림, 비)

 

 

 

 

    위의 코드는 'bike_df' 데이터프레임에 'covid'라는 새로운 열(column)을
    추가하는 코드입니다. 'date' 열을 기준으로 조건문을 사용하여 'covid' 열의
    값을 지정합니다.

    해당 코드는 람다(lambda) 함수를 활용하여 'date' 열의 각 날짜를 비교하여
    'precovid', 'covid', 'postcovid'로 분류합니다.

      - 'date'가 '2020-04-01' 이전인 경우, 'precovid'로 분류합니다.
      - 'date'가 '2020-04-01' 이후이고 '2021-04-01' 이전인 경우, 'covid'로 분류합니다.
      - 'date'가 '2021-04-01' 이후인 경우, 'postcovid'로 분류합니다.

    따라서 'covid' 열은 각 날짜에 따라 'precovid', 'covid', 'postcovid'로
    분류된 값들을 가지게 됩니다. 이를 활용하여 데이터프레임의 날짜에 따른
    COVID-19 팬데믹 전후를 구분할 수 있습니다.

 

# 파생변수 season
# 3월 ~ 5월: spring
# 6월 ~ 8월: summer
# 9월 ~ 11월: fall
# 12월 ~ 2월: winter

import pandas as pd

# 월(Month) 정보를 추출하여 'month' 열 생성
bike_df['month'] = pd.to_datetime(bike_df['datetime']).dt.month

# 'season' 파생변수 생성
bike_df['season'] = bike_df['month'].apply(lambda x: 'spring' if x in [3, 4, 5]
                                           else 'summer' if x in [6, 7, 8]
                                           else 'fall' if x in [9, 10, 11]
                                           else 'winter')

 

    위의 코드는 'season'이라는 파생변수를 생성하는 부분입니다. 해당 코드는
    'month' 열의 값을 기반으로 계절을 판단하여 'season' 열에 할당하는 작업을
    수행합니다.

    설명을 자세히 드리자면 다음과 같은 과정이 진행됩니다:

    1. `bike_df['month'] = pd.to_datetime(bike_df['datetime']).dt.month`:
    'datetime' 열을 날짜 형식으로 변환한 후, 해당 날짜의 월(Month) 정보를
    추출하여 'month' 열을 생성합니다. 예를 들어, 'datetime' 열이
    '2021-05-10'이라면, 'month' 열은 5로 설정됩니다.

    2. `bike_df['season'] = bike_df['month'].apply(lambda x: 'spring' if x in
    [3, 4, 5] else 'summer' if x in [6, 7, 8] else 'fall' if x in [9, 10, 11]
    else 'winter')`: 'month' 열의 각 값에 대해 lambda 함수를 적용합니다. 해당
    lambda 함수는 입력된 월 값을 기반으로 해당 월이 어떤 계절에 속하는지
    판단하여 'season' 열에 할당합니다. 예를 들어, 'month' 값이 4라면
    'spring'으로 설정됩니다.

    즉, 'season' 열은 'month' 열의 값에 따라서 다음과 같이 설정됩니다:
   
    - 3, 4, 5: 'spring'
    - 6, 7, 8: 'summer'
    - 9, 10, 11: 'fall'
    - 그 외의 값: 'winter'

    이를 통해 'bike_df' 데이터프레임에 'season' 열이 추가되고, 각 행에 해당하는
    월에 따라 계절이 할당됩니다.

 

 

2. 의사결정나무(Decision Tree)

  • 데이터를 분석하여 그 사이에 존재하는 패턴을 예측 가능한 규칙들의 조합으로 나타내며, 그 모양이 '나무'와 같다고 해서 의사결정나무 라고 부름
  • 분류(Classification)과 회귀(Regression) 모두 가능
  • 지니계수(Gini Index): 0에 가까울 수록 클래스에 속한 불순도가 낮음.
  • 엔트로피(Entropy): 결정을 내릴만한 충분한 정보가 데이터에 없다고 보는 것 (0에 가까울 수록 결정을 내릴만한 충분한 정보가 있다)
  • 엔트로피와 지니계수는 반대개념
  • 오버피팅(과적합): 훈련데이터에서는 정확하나 테스트에서는 성과가 나쁜 현상을 말함. 훈련 데이터가 적거나 노이즈가 있을 때, 또는 알고리즘 자체가 나쁠 때 발생. 의사결정나무 에서는 나무의 가지가 너무 많거나 크기가 클 때 발생
    • 의사결정나무에서 오버피팅을 피하는 방법
      • 사전 가지치기: 나무가 다 자라기 전에 알고리즘을 멈추는 방법
      • 사후 가지치기: 의사결정나무를 끝까지 다 돌린 후, 밑에서부터 가지를 쳐나가는 방법

3. 선형회귀 vs 의사결정나무