根据菜菜的课程进行整理,方便记忆理解
代码位置如下:
DecisionTreeRegressor
class sklearn.tree.DecisionTreeRegressor (
criterion=’mse’,splitter=’best’,max_depth=None,min_samples_split=2,min_samples_leaf=1, min_weight_fraction_leaf=0.0,max_features=None,random_state=None, max_leaf_nodes=None, min_impurity_decrease=0.0,min_impurity_split=None, presort=False)
重要参数
criterion
回归树衡量分枝质量的指标,支持的标准有三种:
- 输入
mse使用均方误差mean squared error(MSE),父节点和叶子节点之间的均方误差的差额将被用来作为特征选择的标准,这种方法通过使用叶子节点的均值来最小化L2损失 - 输入
friedman_mse使用费尔德曼均方误差,这种指标使用弗里德曼针对潜在分枝中的问题改进后的均方误差 - 输入
mae使用绝对平均误差MAE(mean absolute error),这种指标使用叶节点的中值来最小化L1损失
属性中最重要的依然是feature_importances_ ,接口依然是apply, fit, predict, score最核心。
其中N是样本数量,i是每一个数据样本,fi是模型回归出的数值,yi是样本点i实际的数值标签。所以MSE的本质,其实是样本真实数据与回归结果的差异。在回归树中,MSE不只是我们的分枝质量衡量指标,也是我们最常用的衡量回归树回归质量的指标,当我们在使用交叉验证,或者其他方式获取回归树的结果时,我们往往选择均方误差作为我们的评估(在分类树中这个指标是score代表的预测准确率)。在回归中,我们追求的是,MSE越小越好。
然而,回归树的接口score返回的是R平方,并不是MSE。R平方被定义如下:
其中u是残差平方和(MSE * N),v是总平方和,N是样本数量,i是每一个数据样本,fi是模型回归出的数值,yi是样本点i实际的数值标签。y帽是真实数值标签的平均数。R平方可以为正为负(如果模型的残差平方和远远大于模型的总平方和,模型非常糟糕,R平方就会为负) ,而均方误差永远为正。
值得一提的是,虽然均方误差永远为正,但是sklearn当中使用均方误差作为评判标准时,却是计算”负均方误差“(neg_mean_squared_error)。这是因为sklearn在计算模型评估指标的时候,会考虑指标本身的性质,均方误差本身是一种误差,所以被sklearn划分为模型的一种损失(loss) ,因此在sklearn当中,都以负数表示。真正的均方误差MSE的数值,其实就是neg_mean_squared_error去掉负号的数字。
from sklearn import tree
from sklearn.datasets import load_boston
from sklearn.model_selection import cross_val_score
boston = load_boston()
regressor = tree.DecisionTreeRegressor(random_state=0)
cross_val_score(regressor,boston.data,boston.target,cv=10,scoring="neg_mean_squared_error")
# array([-16.41568627, -10.61843137, -18.30176471, -55.36803922, -16.01470588, -44.70117647, -12.2148 , -91.3888 ,-57.764 , -36.8134 ])
交叉验证是用来观察模型的稳定性的一种方法,我们将数据划分为n份,依次使用其中一份作为测试集,其他n-1份作为训练集,多次计算模型的精确性来评估模型的平均准确程度。训练集和测试集的划分会干扰模型的结果,因此用交叉验证n次的结果求出的平均值,是对模型效果的一个更好的度量。
实例:使用回归树拟合正弦曲线
import numpy as np
from sklearn.tree import DecisionTreeRegressor
import matplotlib.pyplot as plt
# 数据的准备过程,首先先定随机种子,只使用一种随机模式,生成数据,然后排序(目的是为了后面画图),ravel是降维的,因为x是二维数据,
# y生成的也是二维的,需要变成一维,用于画图,最后随机的增加一定的扰动,模拟真实的数据的样子
rng = np.random.RandomState(1) # 选定一个随机模式
x = np.sort(5*rng.rand(80,1),axis=0)
y = np.sin(x).ravel()
y[::5] += 3 * (0.5 - rng.rand(16)) # np.random.rand()通过本函数可以返回一个或一组,服从“0~1”均匀分布的随机样本值。随机样本取值范围是[0,1),不包括1
regr_1 = DecisionTreeRegressor(max_depth=2)
regr_2 = DecisionTreeRegressor(max_depth=5)
regr_1.fit(x,y)
regr_2.fit(x,y)
# 注意这个地方生成的x_test是一维的数据,我们需要将其转化成二维, 升维的方式是[:,np.newaxis],或者使用reshape(1,-1)
x_test = np.arange(0.0,5.0,0.01)[:,np.newaxis]
y_1 = regr_1.predict(x_test)
y_2 = regr_2.predict(x_test)
plt.figure()
plt.scatter(x,y,s = 20,edgecolors="black",c="darkorange",label="data")
plt.plot(x_test,y_1,color="cornflowerblue",label="max_depth=2",linewidth=2)
plt.plot(x_test,y_2,color="yellowgreen",label="max_depth=5",linewidth=2)
plt.xlabel("data")
plt.ylabel("target")
plt.title("Decision Tree Regression")
plt.legend()
plt.show()