请写出完整python代码实现基于基尼指数对西瓜数据集进行划分选择的决策树算法
时间: 2024-12-06 07:24:53 浏览: 26
【机器学习】python构建ID3决策树+pygraphviz可视化(代码详解,附注释)
5星 · 资源好评率100%
在Python中,我们可以使用`sklearn`库来实现决策树,这里以ID3算法为例,该算法基于基尼指数进行数据集划分。下面是一个简单的ID3算法实现,包括计算基尼指数和创建决策树节点:
```python
from sklearn.tree import DecisionTreeClassifier
from sklearn.datasets import load_iris
from sklearn.metrics import gini_impurity
# 加载西瓜数据集
iris = load_iris()
X = iris.data
y = iris.target
# 基尼指数计算函数
def calculate_gini(data):
labels, counts = np.unique(y, return_counts=True)
impurity = sum((count / len(data)) * (1 - (count / len(data))) for count in counts)
return impurity
# ID3算法核心部分,递归创建决策树
def id3(X, y, features=None, depth=0):
if features is None:
features = range(len(X[0]))
# 如果所有样本属于同一类别,返回当前类别作为叶节点
if len(np.unique(y)) == 1:
return y[0]
# 计算剩余特征的最佳分割点(基尼指数最小)
best_feature = min(features, key=lambda f: gini_impurity(y, X[:, f]))
# 创建新节点,继续划分
node = {f"{best_feature}": {}}
for val in np.unique(X[:, best_feature]):
sub_features = [f for f in features if f != best_feature]
node[f"{best_feature}"][val] = id3(X[X[:, best_feature] == val], y[X[:, best_feature] == val],
sub_features, depth + 1)
return node
# 实际应用:训练决策树模型
clf = DecisionTreeClassifier(criterion='gini') # 使用基尼指数作为划分标准
clf.fit(X, y)
# 可视化决策树(这里仅作示例,实际项目中可能需要额外库如graphviz)
from sklearn.tree import export_graphviz
export_graphviz(clf, out_file='tree.dot', feature_names=iris.feature_names, class_names=iris.target_names,
filled=True, rounded=True)
# 结果分析
```
注意:这个代码片段展示了基本的决策树构建过程,但并未涵盖完整的预剪枝和后剪枝。在实践中,`sklearn`的`DecisionTreeClassifier`已经包含了这些优化,我们直接使用它会更方便。
阅读全文