끄적이는 기록일지

[머신러닝] 04.지도학습-분류_(1) 분류란 본문

AI실무

[머신러닝] 04.지도학습-분류_(1) 분류란

시시나브로 2021. 10. 3. 02:35
728x90
 

[머신러닝] 03.지도학습-회귀_(1) 회귀

아이스크림 가게를 운영한다고 가정하면 지금까지 판 데이터를 가지고 우리는 예상되는 아이스크림 판매량만 주문하길 원한다. 이 때 평균 기온을 활용하여 판매량을 예측할 수 있다면? 1. 문제

kcy51156.tistory.com

지난 시간엔 회귀에 대해 배웠습니다. 이번에는 지도학습의 분류의 예를 들어보겠습니다.

 

해외여행을 가려고 한다. 이 때 계획에 차질이 없게 항공지연을 피하고자 한다.

기상정보(구름양, 풍속)활용하여 해당 항공의 지연여부예측할 있다면?

0. 문제정의

1) 데이터: 과거 기상 정보(풍속) X과 그에 따른 항공 지연 여부 Y

2) 목표: 현재 풍속에 따른 항공 지연 여부 예측하기

→ 분류 알고리즘 이용

 

1. 분류란?

1) 주어진 입력 값이 어떤 클래스에 속할지에 대한 결괏값을 도출하는 알고리즘

2) 다양한 분류 알고리즘이 존재하며, 예측 목표와 데이터 유형에 따라 적용

3) 분류 문제 다양한 머신러닝 모델 사용

트리 구조 기반 의사결정나무, 랜덤포레스트, ...
확률 모델 기반 나이브 베이즈 분류기, ...
결정 경계 기반 선형 분류기, 로지스틱 회귀, 분류기, SVM, ...
신경망 퍼셉트론, 딥러닝 모델, ...
... ...

→ 여기서는 가장 간단하면서도 성능이 좋은 의사결정나무를 사용해보겠습니다.

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

1) 스무고개와 같이 특정 질문들을 통해 정답을 찾아가는 모델

2) 맨 위(뿌리 마디)에서부터 마지막(끝마디)까지 아래로 내려간다.

3) 항공 지연 알고리즘 해결방안

- 풍속 4m/s (feature X)를 기준으로 지연 여부(lable Y)를 나누면

   • 풍속 4m/s 보다 크면 지연

   • 풍속 4m/s 보다 작으면 지연 없다.

4) 만약 데이터가 한 질문으로 나누어지지 않는 경우라면,

중간 마디를 추가하여 나눈다.

- 먼저 feature X를 2의 기준으로 분리한 후, 2보다 큰 경우의 데이터들을 다시 4 기준으로 나눈다.(질문 2개)

 

5) 두 개이상의 feature 데이터도 마찬가지로, 먼저 X1을 A와 B로 나눈 후, X2기준을 4로 나누면 깔끔하게 나눌 수 있다.

6) 의사결정나무 구조를 정리해보자면, 아래와 같이 설명할 수 있다.

 

5. 실습

항공지연 데이터 
1. binary_tree 함수는 입력하는 threshold 풍속을 기준으로 지연 여부를 예측한 
   결과를 DataFrame 형태로 출력합니다. data의 지연 여부와 예상 지연 여부가 
   같은 값이 나오도록 의사결정나무의 결과물을 data_pred에 저장하세요.

* threshold 에 값을 넣어서 결과를 확인합니다. (ex) 1, 2, 3.5, …)

import numpy as np
import pandas as pd

# 풍속을 threshold 값(binary_tree의 기준값)에 따라 분리하는 의사결정나무 모델 함수
def binary_tree(data, threshold):

    # 빈 리스트 초기화
    yes = []
    no = []
    
    # data로부터 풍속 값마다 비교를 하기 위한 반복문
    # for 변수 in data
    for wind in data['풍속']:
    
        # threshold 값과 비교하여 분리합니다.
        if wind > threshold:
            yes.append(wind) #yes리스트에 추가
        else:
            no.append(wind)  # no리스트에 추가
    
    # 예측한 결과를 DataFrame 형태로 저장합니다.
    data_yes = pd.DataFrame({'풍속': yes, '예상 지연 여부': ['Yes']*len(yes)})
    data_no = pd.DataFrame({'풍속': no, '예상 지연 여부': ['No']*len(no)})
    # 데이터 no에다가 yes 추가
    return data_no.append(data_yes,ignore_index=True) 
    # ignore_index : 새롭게 인덱스 생성(원래는 0,1,2 0,1,2)

# 풍속에 따른 항공 지연 여부 데이터
Wind = [1, 1.5, 2.5, 5, 5.5, 6.5]   #풍속
Delay  = ['No', 'No', 'No', 'Yes', 'Yes', 'Yes']    #지연

# 위 데이터를 DataFrame 형태로 저장합니다.
data = pd.DataFrame({'풍속': Wind, '지연 여부': Delay})
print(data,'\n')

"""
1. binary_tree 모델을 사용하여 항공 지연 여부를 예측합니다.
"""
data_pred = binary_tree(data, threshold = 3) # 3 or 4
print(data_pred,'\n')



>>>     풍속 지연 여부
0  1.0    No
1  1.5    No
2  2.5    No
3  5.0   Yes
4  5.5   Yes
5  6.5   Yes 

    풍속 예상 지연 여부
0  1.0       No
1  1.5       No
2  2.5       No
3  5.0      Yes
4  5.5      Yes
5  6.5      Yes

 

728x90
Comments