반응형
간단한 이진트리 분류기 만들기
이번 실습에서는 연예인들의 직업, 성별, 키 데이터를 기반으로 간단한 이진트리 분류기를 구현한 후, 이를 통해 그들의 이름을 구분해보겠습니다.
- job, height, sex : 분류를 위한 변수
- name : 분류 클래스
위의 그림과 같은 트리구조를 만들어 데이터를 분류해보겠습니다.
import numpy as np
import pandas as pd
# 직업, 키, 성별로 이름을 구분하는 간단한 이진트리 분류기를 만들어보겠습니다.
name = ['하하', '김범수', '다현', '아이유', '최민식', '김혜수']
job = ['가수', '가수' , '가수', '가수' , '배우' , '배우']
height = [171, 182, 158, 160, 177, 170]
sex = ['M', 'M', 'F', 'F', 'M', 'F']
# Node 번호를 지정해주기 위한 변수
num = 0
# Node 정보를 저장하기 위한 딕셔너리 생성
node_list = {}
# 데이터 프레임 만들기
data = pd.DataFrame({'이름': name, '직업': job, '키': height,'성별': sex})
print(data,'\n')
"""
1. 성별에 따라 사람을 분류하는 함수를 구현합니다.
"""
def Sex_Node(df, depth):
# 전역 변수를 함수 내에서 사용하기 위해 Global 선언
global num
global node_list
# Node num, Depth, Node Name 출력
num +=1
print('Node_num : {} | Node Depth : {} | Sex_Node'.format(num, depth))
node_list[num] = 'Sex_Node'
male = []
female = []
# 처음 성별 데이터 전체로 분류
for idx, sex in enumerate(df['성별']):
# 남자인 경우 Index 저장
if sex == 'M':
male.append(idx)
# 여자인 경우 Index 저장
elif sex == 'F':
female.append(idx)
# Index 확인
print('남자 Index : ',male)
print('여자 Index : ',female)
# 성별 분류 후 직업을 분류하는 Node를 호출합니다.
Job_Node(data, male , 2)
Job_Node(data, female, 2)
"""
2. 직업에 따라 사람을 분류하는 함수를 구현합니다.
"""
def Job_Node(df,idx, depth):
# 전역 변수를 함수 내에서 사용하기 위해 Global 선언
global num
global node_list
num +=1
# Node num, Depth, Node Name 출력
print('Node_num : {} | Node Depth : {} | Job_Node'.format(num, depth))
node_list[num] = 'Job_Node'
# Index 저장을 위한 리스트
singer = []
for i in idx:
# 가수인 경우 Index 저장
if job[i] == '가수':
singer.append(i)
# 배우인 경우 Node 번호와 해당 배우의 이름 출력
else:
num += 1
print('Node_num : {} | Node Depth : {} | Name : {}'.format(num, depth+1 ,data['이름'][i]))
node_list[num] = data['이름'][i]
# 가수인 경우 분류가 끝나지 않았으므로 Index 출력
print('가수 Index : ',singer)
# 마지막 분류 기준인 키를 통해 가수를 분류
Height_Node(data, singer, 3)
"""
3. 키에 따라 사람을 분류하는 함수를 구현합니다.
"""
def Height_Node(df,idx, depth):
# 전역 변수를 함수 내에서 사용하기 위해 Global 선언
global num
global node_list
num +=1
# Node num, Depth, Node Name 출력
print('Node_num : {} | Node Depth : {} | Height_Node'.format(num, depth))
node_list[num] = 'Height_Node'
for i in idx:
num +=1
# 성별에 따라 키의 기준이 다르기 때문에 성별을 우선 분류
if sex[i] == 'M':
# 남자의 경우 키에 따라 분류
# 키가 180보다 작은 경우
if height[i] < 180 :
print('Node_num : {} | Node Depth : {} | Name : {}'.format(num, depth+1,data['이름'][i]))
node_list[num] = data['이름'][i]
# 키가 180보다 큰 경우
else:
print('Node_num : {} | Node Depth : {} | Name : {}'.format(num, depth+1,data['이름'][i]))
node_list[num] = data['이름'][i]
else:
# 여자의 경우 키에 따라 분류
# 키가 160보다 작은 경우
if height[i] < 160 :
print('Node_num : {} | Node Depth : {} | Name : {}'.format(num, depth+1,data['이름'][i]))
node_list[num] = data['이름'][i]
# 키가 160보다 큰 경우
else:
print('Node_num : {} | Node Depth : {} | Name : {}'.format(num, depth+1,data['이름'][i]))
node_list[num] = data['이름'][i]
def main():
# 첫 번째 분류 기준으로 성별을 설정합니다.
Sex_Node(data, 1)
print(node_list)
if __name__=="__main__":
main()
반응형
'AI & 머신러닝 coding skill' 카테고리의 다른 글
머신러닝 Decision tree - 앙상블(Ensemble) 기법 - Bagging (0) | 2022.05.24 |
---|---|
머신러닝 Decision tree - 앙상블(Ensemble) 기법 - Voting (0) | 2022.05.24 |
머신러닝 의사결정 나무(DecisionTree Classifier) - 분류 (0) | 2022.05.24 |
머신러닝 의사결정 나무(DecisionTree Regressor) - 회귀 (0) | 2022.05.24 |
머신러닝 - t-SNE (0) | 2022.05.23 |
머신러닝 - 주성분 분석(PCA) (0) | 2022.05.23 |
머신러닝 Clustering - K-Means VS GMM (0) | 2022.05.23 |
머신러닝 Clustering - Gaussian Mixture Model (GMM) (0) | 2022.05.23 |