机器学习:02.sklearn-回归

回归树几乎所有参数,属性及接口都和分类树一模一样,但是回归树中没有标签分布是否均衡的问题

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)

1. 重要参数 criterion, 属性和接口

属性中最重要的依然是feature_importances_,接口依然是apply, fit, predict, score最核心。

回归树衡量分枝质量的指标:

  1. mse"使用均方误差mean squared error(MSE),父节点和叶子节点之间的均方误差的差额将被用来作为特征选择的标准。
  2. MSE的本质是样本真实数据与回归结果的差异。在回归树中,MSE最常用的衡量回归树回归质量的指标(在分类树中这个指标是score代表的预测准确率)。
  3. MSE越小越好。
  4. 值得一提的是,虽然均方误差永远为正,但是sklearn当中使用均方误差作为评判标准时,却是计算”负均方误差“(neg_mean_squared_error)。真正的
    均方误差MSE的数值,其实就是neg_mean_squared_error去掉负号的数字

回归树是怎么工作的

#回归处理的是连续性变量,决策树处理的是分类变量
from sklearn.datasets import load_boston #用波士顿房价数据
from sklearn.model_selection import cross_val_score  #cross_val_score在model_selection模块中
from sklearn.tree import DecisionTreeRegressor

boston = load_boston()
#第一步实例化
regressor = DecisionTreeRegressor(random_state=0) #random_state设置随机参数 

#cross_val_score的参数5个:
#regressor:1是模型评估器,不一定是回归,分类,SVM等,只要是实例化后的模型都可以
#2,3是属性数据和标签:是完整的不需要划分训练集和测试集的数据
#4cv=10,是将数据分为10分,每次取一份作为测试集,其余9分作为训练集,循环10次;默认是5;
#scoring 是用neg_mean_squared_error(负的均方误差)作为衡量指标,评估模型;MSE越小,模型越好。
cross_val_score(regressor, boston.data, boston.target, cv=10,
scoring = "neg_mean_squared_error")

array([-18.08941176, -10.61843137, -16.31843137, -44.97803922,
-17.12509804, -49.71509804, -12.9986 , -88.4514 ,
-55.7914 , -25.0816 ]) #生成的就是-MSE,可以看到MSE越小代表模型越好。

其中,交叉验证是cross_val_score,用交叉验证n次的结果求出的平均值,是对模型效果的一个更好的度量。

交叉验证

2. 一维回归图像,观察噪声对于回归树的影响

import numpy as np
from sklearn.tree import DecisionTreeRegressor
import matplotlib.pyplot as plt

创建一条含有噪声的正弦曲线

rng = np.random.RandomState(1) #生成固定的随机数种子
X = np.sort(5 * rng.rand(80,1), axis=0) #rand是随机生成0-1之间的数 (80,1)是数据的格式是80行,1列;通过np.sort对数据进行按照axis的行进行排序
y = np.sin(X).ravel() #生成正弦曲线
y[::5] += 3 * (0.5 - rng.rand(16)) # 加噪声  #这里就是y切片后的数据每一个加上一个随机的-1.5到1.5的数
y.shape

下面是代码的理解

#了解降维函数ravel()的用法
np.random.random((2,1))
np.random.random((2,1)).ravel()
np.random.random((2,1)).ravel().shape

(2,)

rng = np.random.RandomState(1) #生成固定的随机数种子
rng.rand(8,1) #rand是随机生成0-1之间的数 生成8行一列的二维数据
x = np.sort(5 * rng.rand(8,1), axis=0)
x 

array([[0.13693797],
[1.02226125],
[1.98383737],
[2.09597257],
[2.69408367],
[3.35233755],
[3.4260975 ],
[4.39058718]])

y = np.sin(x).ravel()
y[::5] #对y进行切片,每5个取一个数字
0.5 - rng.rand(16) #生成的数据就是-0.5到0.5之间

array([-0.19187711, 0.18448437, -0.18650093, -0.33462567, 0.48171172,
-0.25014431, -0.48886109, -0.24816565, 0.21955601, -0.28927933,
0.39677399, 0.05210647, -0.4085955 , 0.20638585, 0.21222466,
0.36997143])

绘制图像

plt.figure()
plt.scatter(X, y, s=20, edgecolor="black",c="darkorange", label="data") #可以看到绘制出的图形有很多噪声
image.png

实例化和训练模型 做两个模型,最大深度小可以防止模型的过拟合

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.arange(0.0, 5.0, 0.01)[:, np.newaxis] #这里就是生成一个二维的500行一列的数据
y_1 = regr_1.predict(X_test) #predict返回每个测试样本的回归结果
y_2 = regr_2.predict(X_test)

下面是对代码的解释

#np.arrange(开始点,结束点,步长) 生成有序的一维数组的函数
np.arange(0.0, 5.0, 0.1) 

#了解增维切片np.newaxis的用法 其实就是和ravel()相反
l = np.array([1,2,3,4])
l
l.shape #一维数据
l[:,np.newaxis]
l[:,np.newaxis].shape #升维后变成4行1列数据
l[np.newaxis,:].shape #升维后变成1行4列数据
代码理解

绘制图像

plt.figure() #打开一个画布
plt.scatter(X, y, s=20, edgecolor="black",c="darkorange", label="data") # edgecolor边框,c是点颜色,s是点的大小,label是点的名字
plt.plot(X_test, y_1, color="cornflowerblue",label="max_depth=2", linewidth=2) #plot是画折线图,label是线的名字
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() #展示图片

可以看到max_depth=5受到噪声影响,发生过拟合

我们可以看到,如果树的最大深度(由max_depth参数控制)设置得太高,则决策树学习得太精细,它从训练数据中学了很多细节,包括噪声得呈现,从而使模型偏离真实的正弦曲线,形成过拟合。

参考菜菜老师的sklearn课程

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 206,602评论 6 481
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 88,442评论 2 382
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 152,878评论 0 344
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 55,306评论 1 279
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 64,330评论 5 373
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 49,071评论 1 285
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,382评论 3 400
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 37,006评论 0 259
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 43,512评论 1 300
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,965评论 2 325
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,094评论 1 333
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,732评论 4 323
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,283评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,286评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,512评论 1 262
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 45,536评论 2 354
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,828评论 2 345

推荐阅读更多精彩内容