4.处理数据集
def split_data_set(data_set,axis,value):
"""
ID3算法需要对每个特征计算信息增益,选取最大的,这里就是对特征进行切分,
传入每一列的索引,和值进行切分,返回的值不包括当前的这一个特征列。
:param axis: 特征对应的 列名索引 [0,1,2,3]
:param value: 特征值[id,color,root]对应列名里面所取的值,例如对color特征
进行切分传入value=dark_green,value=light_white,不同特征返回不同的列表
计算香浓熵
:return:
"""
# 例如传入(data_set,1,dark_green),返回包含特征等于dark_green的列表
ret_data_set = []
for featVec in data_set: # feat 合适的
if featVec[axis] ==value:
reduced_featVec = featVec[:axis] # 0:0 的切片是一个[]
reduce_eatVec_list = list(reduced_featVec)
reduce_eatVec_list.extend(featVec[axis+1:])
ret_data_set.append(reduce_eatVec_list)
return ret_data_set
def choose_best_feature_to_split(data_set):
"选择最好的特征"
num_features =len(data_set[0])-1 # 统计有几个特征
base_Entropy = calculation_Shannon_Ent(data_set)
best_info_gain = 0.0
best_feature =-1
# unique 独特的,唯一的
for i in range(num_features):
feat_list = [example[i] for example in data_set]
unique_values = set(feat_list) # 统计每个特征,有几个值
new_Entropy = 0.0
for value in unique_values:
sub_data_set =split_data_set(data_set,i,value) # 特征里面不同的值进行切分数据
prob =len(sub_data_set)/float(len(data_set))
# 计算每个不同值的熵,再乘以概率 H(D|A)
new_Entropy += prob * calculation_Shannon_Ent(sub_data_set)#
# 就是信息增益H(D)-H(D|A)
info_gain = base_Entropy -new_Entropy
if info_gain >best_info_gain:
best_info_gain = info_gain
best_feature =i
return best_feature