Python 의사 결정 트 리 의 정보 이득 기반 특징 선택 예시
정보 이득 을 바탕 으로 하 는 특징 선택 은 결정 트 리(decisiontree)분류 알고리즘 에 광범 위 하 게 사용 되 는 특징 선택 이다.이 특징 을 선택 하 는 방법 은 모든 특징 값 을 계산 하여 데이터 세트 를 나 누 어 정보 이득 을 얻 고 정보 이득 의 크기 를 비교 하여 적당 한 특징 값 을 선택 하 는 것 이다.
정의
1.1 엔트로피
정보의 기대 치 는 데이터 세트 의 무질서 도 로 이해 할 수 있 고 엔트로피 의 값 이 클 수록 데이터 가 무질서 하 다 는 것 을 나타 내 며 공식 은 다음 과 같다.
그 중에서 H 는 이 데이터 집합의 엔트로피 값 을 나타 내 고 pi 는 분류 i 의 확률 을 나타 낸다.만약 에 모든 데이터 집합 이 하나의 분류 만 있다 면
pi=1
,H=0
.따라서H=0
엔트로피 의 최소 값 은 이 데이터 세트 가 완전히 질서 가 있 음 을 나타 낸다.1.2 정보 이득
엔트로피 의 감소 또는 데이터 무질서 도의 감소.
절차
1.원시 데이터 의 정보 엔트로피 계산
H1
2.하나의 특징 을 선택 하고 특징 값 에 따라 데 이 터 를 분류 한 다음 에 각 유형 에 대해 정보 엔트로피 를 계산 하고 비례 에 따라 합 을 구하 여 이런 구분 방식 의 정보 엔트로피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.550977500433
3.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 프로 그래 밍 에 도움 이 되 기 를 바 랍 니 다.
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
Python의 None과 NULL의 차이점 상세 정보그래서 대상 = 속성 + 방법 (사실 방법도 하나의 속성, 데이터 속성과 구별되는 호출 가능한 속성 같은 속성과 방법을 가진 대상을 클래스, 즉 Classl로 분류할 수 있다.클래스는 하나의 청사진과 같아서 하나의 ...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.