Python 의사 결정 트 리 의 정보 이득 기반 특징 선택 예시

5387 단어 Python결정 트 리
본 논문 의 사례 는 Python 결정 트 리 의 정보 이득 에 기반 한 특징 선택 을 서술 하 였 다.여러분 께 참고 하도록 공유 하 겠 습 니 다.구체 적 으로 는 다음 과 같 습 니 다.
정보 이득 을 바탕 으로 하 는 특징 선택 은 결정 트 리(decisiontree)분류 알고리즘 에 광범 위 하 게 사용 되 는 특징 선택 이다.이 특징 을 선택 하 는 방법 은 모든 특징 값 을 계산 하여 데이터 세트 를 나 누 어 정보 이득 을 얻 고 정보 이득 의 크기 를 비교 하여 적당 한 특징 값 을 선택 하 는 것 이다.
정의
1.1 엔트로피
정보의 기대 치 는 데이터 세트 의 무질서 도 로 이해 할 수 있 고 엔트로피 의 값 이 클 수록 데이터 가 무질서 하 다 는 것 을 나타 내 며 공식 은 다음 과 같다.

그 중에서 H 는 이 데이터 집합의 엔트로피 값 을 나타 내 고 pi 는 분류 i 의 확률 을 나타 낸다.만약 에 모든 데이터 집합 이 하나의 분류 만 있다 면pi=1,H=0.따라서H=0엔트로피 의 최소 값 은 이 데이터 세트 가 완전히 질서 가 있 음 을 나타 낸다.
1.2 정보 이득
엔트로피 의 감소 또는 데이터 무질서 도의 감소.
절차
1.원시 데이터 의 정보 엔트로피 계산H12.하나의 특징 을 선택 하고 특징 값 에 따라 데 이 터 를 분류 한 다음 에 각 유형 에 대해 정보 엔트로피 를 계산 하고 비례 에 따라 합 을 구하 여 이런 구분 방식 의 정보 엔트로피H2를 얻 을 수 있다.
3.계산 정보 이득:
infoGain = H1 - H2
4.2,3 에 따라 모든 특징 속성 에 대응 하 는 정보 이득 을 계산 하고 정보 이득 이 비교적 큰 특징 속성 을 보류 합 니 다.
실례
해양 생물 데이터
피 분류 항목\특징
수면 위로 떠 오 르 지 않 고 살아 남 을 수 있 을 까?
물갈퀴 가 있 는 지 없 는 지
어류 에 속 하 다
1
예.
예.
예.
2
예.
예.
예.
3
예.
아니.
아니.
4
아니.
예.
아니.
5
아니.
예.
아니.
3.1 원시 데이터 정보 엔트로피
p(어류 다)=p1=0.4
p(비어 류)=p 2=0.6
정보 엔트로피 공식 을 통 해 원시 데이터 정보 엔트로피H1 = 0.97095를 얻 을 수 있 습 니 다.
3.2 특징 분류 에 따라 정보 엔트로피 를 계산한다.
'수면 에 불복 하여 생존 할 수 있 는 지'를 분석 하 는 특징 속성 으로 선택 하 다.
데이터 세트 를[1,2,3]과[4,5]로 나 눌 수 있 는데 각각 0.6 과 0.4 를 차지한다.
[1,2,3]이러한 데이터 정보 엔트로피 를 계산 할 수 있다h1=0.918295834054[4,5]이러한 데이터 정보 엔트로피 를 계산 할 수 있 습 니 다h2=0.
구분 후의 정보 엔트로피 계산H2 = 0.6 * h1 + 0.4 * h2 = 0.5509775004333.3 계산 정보 이득
infoGain_0 = H1-H2 = 0.419973094022
3.4 특징 선택
같은 이치 로 특징 에 대해'물갈퀴 가 있 는 지'라 는 특징 에 대해 정보 이득 을 계산 할 수 있다infoGain_1 = 0.170950594455.
비교적 얻 을 수 있 는 것 은'수면 에서 생존 할 수 있 는 지 없 는 지'로 얻 은 정보의 이득 이 더욱 크기 때문에 이 실례 에서 이 특징 은 데이터 집합의 특징 을 구분 하 는 데 가장 좋다 는 것 이다
코드

# -*- coding:utf-8 -*-
#! python2
import numpy as np
from math import log
data_feature_matrix = np.array([[1, 1],
                [1, 1],
                [1, 0],
                [0, 1],
                [0, 1]]) #     
category = ['yes', 'yes', 'no', 'no', 'no'] # 5          
def calc_shannon_ent(category_list):
  """
  :param category_list:     
  :return:         
  """
  label_count = {} #              
  num = len(category_list) #      
  for i in range(num):
    try:
      label_count[category_list[i]] += 1
    except KeyError:
      label_count[category_list[i]] = 1
  shannon_ent = 0.
  for k in label_count:
    prob = float(label_count[k]) / num
    shannon_ent -= prob * log(prob, 2) #      
  return shannon_ent
def split_data(feature_matrix, category_list, feature_index, value):
  """
                  
  :param category_list:     
  :param feature_matrix:     
  :param feature_index:       
  :param value:           
  :return:                  
  """
  # feature_matrix = np.array(feature_matrix)
  ret_index = np.where(feature_matrix[:, feature_index] == value)[0] #             
  ret_category_list = [category_list[i] for i in ret_index] #              ,     
  return ret_category_list
def choose_best_feature(feature_matrix, category_list):
  """
              
  :param feature_matrix:     
  :param category_list:     
  :return:          
  """
  feature_num = len(feature_matrix[0]) #     
  data_num = len(category_list) #       
  base_shannon_ent = calc_shannon_ent(category_list=category_list) #         
  best_info_gain = 0 #       
  best_feature_index = -1 #          
  for f in range(feature_num):
    uni_value_list = set(feature_matrix[:, f]) #             
    new_shannon_ent = 0.
    for value in uni_value_list:
      sub_cate_list = split_data(feature_matrix=feature_matrix, category_list=category_list, feature_index=f, value=value)
      prob = float(len(sub_cate_list)) / data_num
      new_shannon_ent += prob * calc_shannon_ent(sub_cate_list)
    info_gain = base_shannon_ent - new_shannon_ent #     
    print '      :', base_shannon_ent, '    %i        :' % f, new_shannon_ent, '     :', info_gain
    if info_gain > best_info_gain:
      best_info_gain = info_gain
      best_feature_index = f
  return best_feature_index
if __name__ == '__main__':
  best_feature = choose_best_feature(data_feature_matrix, category)
  print '             :', best_feature

실행 결과:
초기 정보 엔트로피:0.97095059455 특징 0 에 따라 분 류 된 정보 엔트로피:0.550977500433 정보 이득:0.419973094022
초기 정보 엔트로피:0.97095059455 특징 1 에 따라 분 류 된 정보 엔트로피:0.8 정보 이득:0.17095059455
데이터 세트 를 구분 하 는 데 가장 좋 은 특징 은 0 입 니 다.
더 많은 파 이 썬 관련 내용 에 관심 이 있 는 독자 들 은 본 사이트 의 주 제 를 볼 수 있다.
본 논문 에서 말 한 것 이 여러분 의 Python 프로 그래 밍 에 도움 이 되 기 를 바 랍 니 다.

좋은 웹페이지 즐겨찾기