1.回归树几乎所有参数,属性,接口都和分类树一样,只是回归树里没有标签分布是否均衡的问题
2.参数:criterion
回归树衡量分枝质量的指标,支持的标准有三种:
1) 输入"mse"使用均方误差mean squared error(MSE),父节点和叶子节点之间的均方误差的差额被用来作为特征选择的标准,这种方法通过使用叶子节点的均值来最小化损失
2)输入"friedman_mse"使用费尔德曼均方误差,这种指标是用费里德曼对潜在分支中的问题改进后的均方误差
3)输入 "mae"使用绝对平均误差MAE(mean absolute error),这种指标使用叶节点的中指来最小化L1的损失
属性中最重要的是feature_importances_,接口依然是apply,fit,predict,score最核心
注:
N是样本数量
i是每个数据样本
fi是模型回归出的数值
yi是样本i实际的数据标签。
MSE本质:样本真实数据与回归结果的差异
在回归树中,MSE不只是我们分枝质量衡量标准,也就是我们常用的衡量回归树质量的标准
预测准确率
分类树中:指标score
回归树中:MSE(越小越好)(注意:回归树的接口score返回的是,不是MSE)
定义
u是残差平方和(MSE*N)
v是总平方和
y帽是真实数值标签的平方数
sklearn中使用均方误差时计算的是“负均方误差”,均方误差的真实值是去掉负号的
交叉验证
用来观察模型稳定性的一种方法
1.数据划分为n份
2.依次使用其中一份做为测试集,其他n-1份作为训练集
3.多次计算模型的精确性来评估模型的平均准确程度。
训练集和测试集的划分会干扰模型的结果,因此用交叉验证n次的结果求出一个平均值,是对模型效果的一个更好的度量
交叉验证理解:波斯顿房价
from sklearn.datasets import load_boston
from sklearn.model_selection import cross_val_score
from sklearn.tree import DecisionTreeRegressor
boston = load_boston()
print(boston) #查看boston房价数据集,包括特征和标签
#print(boston.data) #数据集特征
#print(boston.target) #数据集标签
from sklearn.datasets import load_boston
from sklearn.model_selection import cross_val_score
from sklearn.tree import DecisionTreeRegressor
boston = load_boston()
print(boston) #查看boston房价数据集,包括特征和标签
#print(boston.data) #数据集特征
#print(boston.target) #数据集标签
regressor = DecisionTreeRegressor(random_state=0) #实例化
#交叉验证
print(cross_val_score(regressor,boston.data,boston.target,cv=10,
scoring = "neg_mean_squared_error"
#若不写scoring则默认返回R平方,scoring则返回负的均方误差,
))
创建一条正弦曲线
import numpy as np #生成图上所需数据点,生成正弦曲线
from sklearn.tree import DecisionTreeRegressor
import matplotlib.pyplot as plt #画图
#创建一条含有噪声的正弦曲线
rng = np.random.RandomState(1)#生成随机数种子
#rang.rand(10) 生成10个0到1之间的随机数
#rang.rand(2,3) 生成2行3列的随机数的数组
X = np.sort(5 * rng.rand(80,1),axis=1)#生成0~5之间随机数,二维80行1列的矩阵,升序由axis=0控制
y = np.sin(X).ravel()
#X是二维的,因而生成的Y也是二维的,但是二维的Y会报错,因而要使用ravel降维,变成一维
y[::5] += 3 *(0.5 - rng.rand(16))#给某些数据加噪声
#y[::5]切片,步长为5,取80/5=16个,切片加上16个 3*(-0.5~0.5)的值(即为噪声)
plt.figure()
plt.scatter(X,y,s=20)#scatter专门来画散点图
#plt.scatter(X,y,s=20,edgecolor="black",c="darkorange",lable="data")#scatter专门来画散点图
print(plt.show()) #画出有噪音的散点图
有加噪声的图像,和没见加噪声的图像
y[::5] += 3 *(0.5 - rng.rand(16))#给某些数据加噪声
绘制图像
import numpy as np #生成图上所需数据点,生成正弦曲线
from sklearn.tree import DecisionTreeRegressor
import matplotlib.pyplot as plt #画图
#创建一条含有噪声的正弦曲线
rng = np.random.RandomState(1)#生成随机数种子
#rang.rand(10) 生成10个0到1之间的随机数
#rang.rand(2,3) 生成2行3列的随机数的数组
X = np.sort(5 * rng.rand(80,1),axis=1)#生成0~5之间随机数,二维80行1列的矩阵,升序由axis=0控制
y = np.sin(X).ravel()
#X是二维的,因而生成的Y也是二维的,但是二维的Y会报错,因而要使用ravel降维,变成一维
y[::5] += 3 *(0.5 - rng.rand(16))#给某些数据加噪声
#y[::5]切片,步长为5,取80/5=16个,切片加上16个 3*(-0.5~0.5)的值(即为噪声)
plt.figure()
plt.scatter(X,y,s=20)#scatter专门来画散点图
#plt.scatter(X,y,s=20,edgecolor="black",c="darkorange",lable="data")#scatter专门来画散点图
#print(plt.show()) #画出有噪音的散点图
#实例化,训练模型
regr_1 = DecisionTreeRegressor(max_depth=2) #不同深度的树来拟合曲线
regr_2 = DecisionTreeRegressor(max_depth=5)
regr_1=regr_1.fit(X,y)
regr_2=regr_2.fit(X,y)
#导入测试集,预测结果
X_test = np.arange(0.0,5.0,0.01)[:,np.newaxis]
#生成测试集,从0到5之间步长为0.01取数的函数
#np.arrange(开始点,结束点,步长) 生成有序数组的函数
#增维,l[:,np.newaxis]把l增维,l[np.newaxis,:]把l降维 (要增维的原因是把测试集放到回归树里面必须是2维)
#print(np.arange(0.0,5.0,0.01)[:,np.newaxis])检测数据已成二维
#print(X_test.shape)
y_1 = regr_1.predict(X_test)#预测结果,输入x得到y
y_2 = regr_2.predict(X_test)
#print(y_1,y_2)
#画图
plt.figure()#生成画布
#scatter画散点图
plt.scatter(X, y, s=20, edgecolor="black",c="darkorange", label="data")
#s:画散点图点的大小,edgecolor:边框de颜色,c:点的颜色,lable:标签数据,纵坐标
plt.plot(X_test, y_1, color="cornflowerblue",label="max_depth=2", linewidth=2)
#plot画线,label线的名字,linewidth线宽,线的名字和线宽可以不要,颜色可以默认
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()
print(plt.show()) #显示图'''
结果图像
回归树学习近似正弦曲线的局部线性回归
可见树的最大深度设置过高决策树会学习的太精细,造成过拟合