C4.5算法是一种基于决策树的分类算法,它通过对数据集进行递归分裂,构建一棵决策树模型,用于分类任务。与ID3算法相比,C4.5算法具有更高的效率和更好的处理连续型属性的能力。
C4.5算法的实现原理如下:
1. 构建决策树:从根节点开始,选择最优的属性进行分裂,将数据集划分为若干子集,每个子集对应一个子节点。对每个子集递归执行该过程,直到所有子集都属于同一类别或无法再分。
2. 属性选择:选择最优的属性进行分裂,使得划分后的子集纯度更高。在C4.5算法中,使用信息增益比来评估属性的重要性,同时考虑属性的取值数目对信息增益的影响。
3. 剪枝处理:对构建好的决策树进行剪枝,以避免过拟合。剪枝处理可以通过预留一部分数据作为验证集,计算决策树的泛化误差来实现。
C4.5算法的应用实例包括:
1. 信用风险评估:根据客户的个人信息和历史还款记录等,构建一棵决策树来预测客户的信用风险等级。
2. 医学诊断:根据患者的症状、体征等信息,构建一棵决策树来对疾病进行诊断和治疗方案推荐。
3. 商品推荐:根据用户的历史购买记录、浏览记录等信息,构建一棵决策树来推荐用户感兴趣的商品。
下面是一个使用Python实现C4.5算法的示例代码:
```python
from math import log
from collections import Counter
def calc_entropy(data):
"""
计算数据集的信息熵
"""
labels = [d[-1] for d in data]
counter = Counter(labels)
entropy = 0.0
for label in counter.keys():
prob = counter[label] / len(labels)
entropy -= prob * log(prob, 2)
return entropy
def split_data(data, axis, value):
"""
按照给定特征划分数据集
"""
sub_data = []
for d in data:
if d[axis] == value:
sub_d = d[:axis] + d[axis+1:]
sub_data.append(sub_d)
return sub_data
def choose_feature(data):
"""
选择最优划分特征
"""
num_features = len(data[0]) - 1
base_entropy = calc_entropy(data)
best_info_gain_ratio = 0.0
best_feature = -1
for i in range(num_features):
values = [d[i] for d in data]
unique_values = set(values)
new_entropy = 0.0
split_info = 0.0
for value in unique_values:
sub_data = split_data(data, i, value)
prob = len(sub_data) / len(data)
new_entropy += prob * calc_entropy(sub_data)
split_info -= prob * log(prob, 2)
info_gain = base_entropy - new_entropy
info_gain_ratio = info_gain / split_info
if info_gain_ratio > best_info_gain_ratio:
best_info_gain_ratio = info_gain_ratio
best_feature = i
return best_feature
def majority_vote(labels):
"""
多数表决决定叶子节点类别
"""
counter = Counter(labels)
majority_label = counter.most_common(1)[0][0]
return majority_label
def create_tree(data, features):
"""
递归构建决策树
"""
labels = [d[-1] for d in data]
if len(set(labels)) == 1:
return labels[0]
if len(data[0]) == 1:
return majority_vote(labels)
best_feature = choose_feature(data)
best_feature_name = features[best_feature]
del(features[best_feature])
tree = {best_feature_name: {}}
feature_values = [d[best_feature] for d in data]
unique_values = set(feature_values)
for value in unique_values:
sub_features = features[:]
sub_data = split_data(data, best_feature, value)
sub_tree = create_tree(sub_data, sub_features)
tree[best_feature_name][value] = sub_tree
return tree
data = [['青年', '否', '否', '一般', '否'],
['青年', '否', '否', '好', '否'],
['青年', '是', '否', '好', '是'],
['青年', '是', '是', '一般', '是'],
['青年', '否', '否', '一般', '否'],
['中年', '否', '否', '一般', '否'],
['中年', '否', '否', '好', '否'],
['中年', '是', '是', '好', '是'],
['中年', '否', '是', '非常好', '是'],
['中年', '否', '是', '非常好', '是'],
['老年', '否', '是', '非常好', '是'],
['老年', '否', '是', '好', '是'],
['老年', '是', '否', '好', '是'],
['老年', '是', '否', '非常好', '是'],
['老年', '否', '否', '一般', '否']]
features = ['年龄', '有工作', '有自己的房子', '信贷情况']
tree = create_tree(data, features)
print(tree)
```
上述代码实现了一个简单的决策树构建算法,并使用C4.5算法选择最优划分特征。