分类中对连续数据的类划分:
在 C4.5 算法中采用二分法对连续值进行处理。
Markdown Code
对于连续的属性 XX 假设共出现了 n 个不同的取值,将这些取值从小到大排序{x1,x2,x3,…,xn}{x1,x2,x3,…,xn},其中找一点作为划分点 t ,则将数据划分为两类,大于 t 的为一类,小于 t 的为另一类。而 t 的取值通常为相邻两点的平均数
t=xi+xi+12t=xi+xi+12。
则在 n 个连续值之中,可以作为划分点的 t 有 n-1 个。通过遍历可以像离散型一样来考察这些划分点。
Gain(D,X)=Ent(D)−||D
def get_splitpoint(data, base_ent, feature):
"""
参数:
data -- 数据集
base_ent -- 根节点的信息熵
feature -- 需要划分的连续特征
返回:
final_t -- 连续值最优划分点
"""
continues_value = data[feature].sort_values().astype(np.float64) # 将连续值进行排序并转化为浮点类型
continues_value = [i for i in continues_value] # 不保留原来的索引
t_set = []
t_ent = {}
for i in range(len(continues_value)-1): # 得到划分点 t 的集合
temp_t = (continues_value[i]+continues_value[i+1])/2
t_set.append(temp_t)
for each_t in t_set: # 计算最优划分点
temp1_data = data[data[feature].astype(np.float64) > each_t] # 将大于划分点的分为一类
temp2_data = data[data[feature].astype(np.float64) < each_t] # 将小于划分点的分为一类
weight1 = len(temp1_data)/len(data)
weight2 = len(temp2_data)/len(data)
temp_ent = base_ent-weight1 * \
get_Ent(temp1_data)-weight2*get_Ent(temp2_data) # 计算每个划分点的信息增益
t_ent[each_t] = temp_ent
print("t_ent:", t_ent)
final_t = max(t_ent, key=t_ent.get)
return final_t
final_t=get_splitpoint(data,base_ent,'height')
#得到final_t后,对数据进行预处理:
def choice_1(x, t):
if x > t:
return ">{}".format(t)
else:
return "<{}".format(t)
deal_data = data.copy()
# 使用lambda和map函数将 height 按照final_t划分为两个类别
deal_data["height"] = pd.Series(
map(lambda x: choice_1(int(x), final_t), deal_data["height"]))
deal_data