Python_机器学习_决策树算法

算法原理

决策树是一个类似于流程图的树结构,分支节点表示对一个特征进行测试,根据测试结果进行分类,叶节点代表类别
决策树的构造过程实际上就是针对于原有数据集,选取一定的属性测试条件,对原数据集进行不断切分的过程
一旦构造完决策树,那么对于检验记录进行分类就很容易了,因为决策树本身生成的就是一系列规则,因此决策树是生成模型的算法

原则上讲,数据集中的所有特征都可以用来分枝,特征上的任意节点又可以自由组合,所以一个数据集上可以发展处非常多棵决策树,在这些决策树中,总会有一棵最好的,这就是全局最优树
对于如何选取全局最优树,业界大佬们研究出了很多有效的算法,这些算法基本都是使用‘贪心策略’来作为思想写出来的,用于衡量分枝好不好的指标,就是不纯度

不纯度:决策树的每个叶子节点中都会包含一组数据,在这组数据中,如果有某一类标签占有较⼤大的⽐例,我们就说叶子节点“纯”,分枝分得好。某⼀类标签占的⽐例越大,叶子就越纯,不纯度就越低,分枝就越好。如果没有哪一类标签的⽐例很大,各类标签都相对平均,则说叶⼦子节点”不纯“,分枝不好,不纯度⾼
误差率越低纯度越高
由不纯度右引导出两个指标:ID3中的信息熵(Entropy),也叫香农熵和CART中的基尼指数(Gini)
信息熵:
在这里插入图片描述
基尼指数:
基尼指数计算公式

算法优点:计算复杂度不高,输出结果易于理解,对中间值缺失不敏感,可以处理不相关特征数据
算法缺点:可能会产生过渡匹配的问题
适用范围:数值型和标称型数据

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
好的,下面是关于决策树的CART算法的Python实现示例。 首先,我们需要导入相关的库: ```python import numpy as np import pandas as pd from sklearn.datasets import load_iris from sklearn.model_selection import train_test_split from sklearn.tree import DecisionTreeClassifier from sklearn.metrics import accuracy_score ``` 接下来,我们需要加载数据集: ```python iris = load_iris() X = pd.DataFrame(iris.data, columns=iris.feature_names) y = pd.DataFrame(iris.target, columns=['target']) ``` 然后,我们将数据集分成训练集和测试集: ```python X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.3, random_state=42) ``` 接下来,我们定义一个函数来计算基尼不纯度: ```python def gini_impurity(y): _, counts = np.unique(y, return_counts=True) probabilities = counts / len(y) return 1 - np.sum(probabilities ** 2) ``` 然后,我们定义一个函数来计算基尼不纯度的加权平均值: ```python def weighted_gini_impurity(groups): total_size = sum(len(group) for group in groups) gini = 0 for group in groups: size = len(group) if size == 0: continue score = gini_impurity(group['target']) gini += score * (size / total_size) return gini ``` 接下来,我们定义一个函数来拆分数据集: ```python def test_split(index, value, X, y): left_mask = X.iloc[:, index] < value right_mask = X.iloc[:, index] >= value left = {'X': X[left_mask], 'y': y[left_mask]} right = {'X': X[right_mask], 'y': y[right_mask]} return left, right ``` 然后,我们定义一个函数来选择最佳的数据集拆分: ```python def get_best_split(X, y): best_index, best_value, best_score, best_groups = None, None, float('inf'), None for index in range(X.shape[1]): for value in X.iloc[:, index]: groups = test_split(index, value, X, y) score = weighted_gini_impurity(list(groups.values())) if score < best_score: best_index, best_value, best_score, best_groups = index, value, score, groups return {'feature_index': best_index, 'feature_value': best_value, 'groups': best_groups} ``` 接下来,我们定义一个函数来创建一个叶节点: ```python def create_leaf_node(y): return y['target'].mode()[0] ``` 然后,我们定义一个函数来创建一个决策树: ```python def create_decision_tree(X, y, max_depth, min_size, depth): best_split = get_best_split(X, y) left, right = best_split['groups'].values() del(best_split['groups']) if not left or not right: return create_leaf_node(pd.concat([left, right], axis=0)) if depth >= max_depth: return create_leaf_node(y) if len(left) < min_size: left = create_leaf_node(left) else: left = create_decision_tree(left['X'], left['y'], max_depth, min_size, depth+1) if len(right) < min_size: right = create_leaf_node(right) else: right = create_decision_tree(right['X'], right['y'], max_depth, min_size, depth+1) return {'left': left, 'right': right, **best_split} ``` 最后,我们定义一个函数来进行预测: ```python def predict(node, row): if row[node['feature_index']] < node['feature_value']: if isinstance(node['left'], dict): return predict(node['left'], row) else: return node['left'] else: if isinstance(node['right'], dict): return predict(node['right'], row) else: return node['right'] ``` 现在我们已经定义了所有必要的函数,我们可以用以下代码来创建并测试我们的决策树模型: ```python tree = create_decision_tree(X_train, y_train, max_depth=5, min_size=10, depth=1) y_pred = np.array([predict(tree, row) for _, row in X_test.iterrows()]) print('Accuracy:', accuracy_score(y_test, y_pred)) ``` 这就是一个基于CART算法决策树的Python实现示例。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值