决策树的关键问题
这么多特征,使用哪个特征先进行子表划分?
CART回归树
- 原始数据集S,此时树的深度depth=0;
- 针对集合S,遍历每一个特征的每一个value,
用该value将原数据集S分裂成2个集合:左集合left(<=value的样本)、右集合right(>value的样本),分别计算这2个集合的mse,找到使(left_mse+right_mse))最小的那个value,记录下此时的特征名称和value,这个就是最佳分割特征以及最佳分割值; - 找到最佳分割特征以及最佳分割value之后,用该value将集合S分裂成2个集合,depth+=1;
- 针对集合left、right分别重复步骤2,3,直到达到终止条件。
CART回归树的终止条件
- 特征已经用完了:没有可供使用的特征再进行分裂了,则树停止分裂;
- 子节点中没有样本了:此时该结点已经没有样本可供划分,该结点停止分裂;
- 树达到了人为预先设定的最大深度:depth >= max_depth,树停止分裂;
- 节点的样本数量达到了人为设定的阈值:样本数量
<min_samples_split,则树停止分裂;
决策树回归器模型相关API:
import sklearn.tree as st
model = st.DecisionTreeRegressor(max_depth=4)
model.fit(train_x, train_y)
pred_test_y = model.predict(test_x)
预测波士顿地区房屋价格
- 读取数据,打断原始数据集。 划分训练集和测试集
import sklearn.datasets as sd
import sklearn.utils as su
boston = sd.load_boston()
print(boston.feature_names)
x, y = su.shuffle(boston.data, boston.target, random_state=7)
train_size = int(len(x) * 0.8)
train_x, test_x, train_y, test_y = \
x[:train_size], x[train_size:], \
y[:train_size], y[train_size:]
- 创建决策树回归器模型,使用训练集训练模型。使用测试集测试模型。
import sklearn.tree as st
import sklearn.metrics as sm
model = st.DecisionTreeRegressor(max_depth=4)
model.fit(train_x, train_y)
pred_test_y = model.predict(test_x)
print(sm.r2_score(test_y, pred_test_y))
|