CART—最小二乘回归树Python实现

这篇博客介绍了如何使用Python实现CART(最小二乘回归树)算法。通过遍历寻找最佳切分点来最小化平方损失函数,构建二叉决策树。文中以输入数据x和对应目标值y为例,展示了CART算法的具体应用。
摘要由CSDN通过智能技术生成

CART—最小二乘回归树Python实现

关于CART算法可以参考李航的《统计学习方法》这里不详细叙述,核心思想就是遍历寻找最优切分点来最小化平方损失函数,构建二叉决策树,这里采用递归算法。

假设输入数据为

x     0            1          2         3         4         5         6         7         8         9

y    4,5       4.75      4.91    5.34    5.80    7.05    7.90    8.23    8.70      9.00

  • 3
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 3
    评论
下面是一个简单的 Python 实现 CART 回归的例子: ```python import numpy as np class CARTRegressionTree: def __init__(self, max_depth=5, min_samples_split=2, min_samples_leaf=1): self.max_depth = max_depth self.min_samples_split = min_samples_split self.min_samples_leaf = min_samples_leaf def fit(self, X, y): self.n_features_ = X.shape[1] self.tree_ = self._build_tree(X, y, depth=0) def predict(self, X): return np.array([self._predict(inputs) for inputs in X]) def _build_tree(self, X, y, depth): n_samples, n_features = X.shape if depth >= self.max_depth or n_samples < self.min_samples_split: return self._make_leaf_node(y) best_feature, best_threshold = self._find_split(X, y, n_samples, n_features) if best_feature is None: return self._make_leaf_node(y) left_indices = X[:, best_feature] < best_threshold right_indices = ~left_indices left_tree = self._build_tree(X[left_indices], y[left_indices], depth+1) right_tree = self._build_tree(X[right_indices], y[right_indices], depth+1) return self._make_decision_node(best_feature, best_threshold, left_tree, right_tree) def _find_split(self, X, y, n_samples, n_features): best_feature, best_threshold, best_mse = None, None, np.inf for feature in range(n_features): thresholds = np.unique(X[:, feature]) for threshold in thresholds: left_indices = X[:, feature] < threshold right_indices = ~left_indices if sum(left_indices) >= self.min_samples_leaf and sum(right_indices) >= self.min_samples_leaf: left_mse = self._mean_squared_error(y[left_indices]) right_mse = self._mean_squared_error(y[right_indices]) mse = left_mse + right_mse if mse < best_mse: best_feature, best_threshold, best_mse = feature, threshold, mse return best_feature, best_threshold def _mean_squared_error(self, y): return np.mean((y - np.mean(y))**2) def _make_decision_node(self, feature, threshold, left_tree, right_tree): return {'feature': feature, 'threshold': threshold, 'left_tree': left_tree, 'right_tree': right_tree} def _make_leaf_node(self, y): return {'leaf': np.mean(y)} def _predict(self, inputs): node = self.tree_ while isinstance(node, dict): if inputs[node['feature']] < node['threshold']: node = node['left_tree'] else: node = node['right_tree'] return node['leaf'] ``` 在上面的代码中,`CARTRegressionTree` 类实现CART 回归的训练和预测方法。其中,`max_depth`、`min_samples_split` 和 `min_samples_leaf` 是可调参数,分别控制的最大深度、节点分裂所需的最小样本数和叶节点所需的最小样本数。`fit` 方法用于训练模型,`predict` 方法用于预测新样本。 在 `_build_tree` 方法中,我们递归地构建决策。如果当前节点样本数少于 `min_samples_split` 或者的深度达到了 `max_depth`,则返回当前节点的平均值作为叶节点。否则,我们尝试在所有特征和阈值的组合中找到一个最优的分裂点,使得分裂后的左右子的均方误差之和最小。如果无法找到合适的分裂点,则返回当前节点的平均值作为叶节点。 在 `_find_split` 方法中,我们遍历所有特征和阈值的组合,计算分裂后的左右子的均方误差之和。如果左右子的样本数都大于等于 `min_samples_leaf`,则更新最优的分裂点。 在 `_make_decision_node` 和 `_make_leaf_node` 方法中,我们分别创建决策节点和叶节点。 在 `_predict` 方法中,我们遍历决策,根据当前节点的特征和阈值判断向左还是向右走,直到到达叶节点,返回叶节点的平均值作为预测值。
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值