sklearn入门&决策树在sklearn中的实现

sklearn入门

scikit-learn官网:http://scikit-learn.org/stable/index.html
中文翻译网址:https://sklearn.apachecn.org/docs/master/2.html
算法原理推荐书籍:《数据挖掘导论》、《机器学习》

决策树

1 概述

非参数的有监督学习方法,决策树算法的本质是一种图结构
通过对记录的特征的提问,对样本进行分类

关于决策树的节点概念:
1、根节点:没有进边,有出边,包含最初的,针对特征的提问
2、中间节点:既有进边也有出边,进边只有一条,出边可以有很多条,都是针对特征的提问
3、叶子节点:有进边,没有出边,每个叶子节点都有一个类别标签
4、子节点和父节点:在两个相连的节点中,更接近根节点的是父节点,另一个是子节点
1.1 决策树是如何工作的

决策树算法的核心要解决两个问题:
1、如何从数据表中找出最佳节点和最佳分支?
2、如何让决策树停止生长,防止过拟合?

1.2 sklearn中的决策树
  • 模块sklearn.tree
    包含决策树相关的所有类(不包含集成算法),总共五个类:
  • tree.DecisionTreeClassifier分类树
  • tree.DecisionTreeRegressor回归树
  • tree.export_graphviz将生成的决策树导出为DOT格式,画图专用
  • tree.ExtraTreeClassifier高随机版本的分类树
  • tree.ExtraTreeRegressor高随机版本的回归树
  • sklearn建模的基本流程
    在这里插入图片描述
    对应的代码:
from sklearn import tree	#导入需要的模块

clf = tree.DecisionTreeClassifier()		#实例化,需要使用的参数填入()中
clf = clf.fit(x_train,y_train)			#用训练集数据训练模型,使用fit接口
result = clf.score(x_train,y_train)		#导入测试数据集,利用score接口调用需要的信息

2 DecisionTreeClassifier与红酒数据集

sklearn.DecisionTreeClassifier(criterion=‘gini’,splitter=‘best’,max_depth=None,min_samples_split=2,min_samples_leaf=1,min_weight -raction_leaf=0.0,max_features=None,random_state=None,max_leaf_nodes=None,min_impurity=0.0,min_impurity_split=None,class_weight=None,presort=False)

2.1 重要参数

8个重要的参数

2.1.1 criterion

决策树需要找出最佳节点和最佳的分枝方法,衡量“最佳”的指标叫“不纯度”,不纯度越低,决策树对训练集的拟合越好。
不纯度基于节点计算,书中的每个节点都有一个不纯度,并且子节点的不纯度一定是低于父节点的,可以说,在同一颗决策树上,叶子节点的不纯度是最低的。
criterion是用来决定不纯度的计算方法,可选项

  • entropy:信息熵,实际计算的是基于信息熵的信息增益,即父节点的信息熵和子节点信息熵之差
  • gini:基尼系数
    在这里插入图片描述
    相交于基尼系数,信息熵对不纯度更加敏感,对不纯度的惩罚最强。在使用中,信息熵和基尼系数的效果差不多,只不过信息熵计算速度稍慢。由于信息熵对不纯度敏感,当信息熵作为指标时,决策树生长更精细,对于高维数据或噪声很多的数据,信息熵容易过拟合,使用基尼系数往往会更好。
    选取参数的方法:通常使用基尼系数。数据维度很大、噪音很大的时候使用基尼系数;维度低、数据比较清晰的时候,信息熵和基尼系数没有区别。当决策树的拟合程度不够(欠拟合)的时候,使用信息熵。可以两个都试试,取效果更好的
    在这里插入图片描述
2.1.2 random_state&splitter

random_state用来设置分枝中的随机模式的参数,默认为None,在高维度时随机性会表现更明显,低纬度的数据随机性几乎 不会显现,输入任意整数,会一直长出同一棵树,让模型稳定下来。
splitter也是用来控制决策树中的随机选项的,有两种输入值:输入“best”,决策树在分枝时虽然随机,但会优先选择更重要的特征进行分枝;输入“random”,分枝时会更随机,树会更深,对训练集的拟合将会降低。
当预测到模型会过拟合时,用这两个参数会帮助降低过拟合的可能性。

2.1.3 剪枝参数

过拟合:在训练集上表现很好,在测试集上表现糟糕
为了使决策树局有更好的泛化性,要对其进行剪枝。剪枝策略对决策树影响巨大,正确的剪枝策略是优化决策树算法的核心。
sklearn提供多种剪枝策略:

  • max_depth:限制数的最大深度,超过设定深度的树枝全部剪掉,是使用最广泛的剪枝参数,在高维度低样本量时非常有效。实际使用时,建议从3开始尝试,根据拟合的效果再决定是否增加设定深度。
  • min_samples_leaf & min_samples_split:min_samples_leaf是限定一个节点在分枝后的每个子节点都必须包含至少min_samples_leaf个训练样本,否则,分枝就不会发生,或者分枝会朝着满足每个子节点都包含min_samples_leaf个样本的方向去发生,一般搭配max_depth使用,在回归树中有神奇的效果,可以让模型更加平滑,这个参数的数量设置的过小会引起过拟合,设置得太大会阻止模型学习数据,一般建议从5开始使用,如果叶节点中含有的样本量变化很大,建议输入浮点数作为样本量的百分比使用(当训练集和测试集的样本量区别很大,使用绝对量限制叶节点中样本数量比较不合理,此时使用相对样本数量更合适),这个参数可以保证每个叶子的最小尺寸,可以在回归问题中避免低方差、过拟合的叶子节点的出现,对于类别不多的分类问题,设置为1通常是最佳选择;min_samples_split限定一个节点必须要包含至少 min_samples_split个训练样本,这个节点才被允许被分枝,否则分枝不会发生。
  • max_features & min_impurity_decrease:max_features限制分枝时考虑的特征个数,超过限制个数的特征都会被舍弃,和max_depth异曲同工,max_features是用来限制高维度数据过拟合的剪枝参数,但方法比较暴力,是直接限制可以使用的特征数量,强行消减数据的信息量来使决策树停下,在不知道决策树中的各个特征的重要性的情况下,情形设定这个参数会导致模型学习不足,如果希望通过降维的方式防止过拟合,建议使用PCA、ICA或者特征选择模块中的降维算法;min_impurity_decrease限制信息增益的大小,信息增益小于设定数值的分枝不会发生。
    确认最优的剪枝参数:使用超参数的曲线来进行判断。超参数的学习曲线是一条以超参数的取值为横坐标,模型的度量指标为纵坐标的曲线,它是用来衡量不同超参数取值下模型的表现曲线。
    Q1:剪枝参数一定能够提升模型在测试集上的表现吗?A1:调参没有绝对的答案,一切都是看数据本身。
    Q2:这么多参数,一个个画学习曲线吗?A2:不是
2.1.4 目标权重参数

class_weight & min_weight_fraction_leaf:都是完成样本标签平衡的参数。样本不平衡是指在一组数据集中,标签的一类天生占有很大的比例。要使用class_weight参数对样本标签进行一定的均衡,给少量的标签更多的权重,让模型偏向少数类,向捕获少数类的方向建模,该参数默认为None,表示自动给予数据集中的所有标签相同的权重。有了权重之后,样本量就不再是单纯地记录数目,而是受输入的权重影响了。此时剪枝就需要搭配min_weight_fraction_leaf这个基于权重的剪枝参数来使用。基于权重的剪枝参数(min_weight_fraction_leaf)将比不知道样本权重的标准(min_samples_leaf)更少偏向主导类。如果样本是加权的,则使用基于权重的预修剪标准更容易优化树结构,这确保叶节点至少包含样本权重总和的一小部分。

2.2 重要属性和接口

属性是在模型训练之后,能够调用查看的模型的各种性质。决策树中最重要的属性是feature_importances_,查看各个特征对模型的重要性。
sklearn中许多算法的接口都是相似的,如fit和score。决策树最常用的接口还有apply和predict,apply中输入测试集的特征返回每个测试样本所在叶子结点的索引,predict输入测试集的特征返回每个测试样本的标签(分类/回归结果)。
**所有接口中要求输入X_train和X_test的部分,输入的特征矩阵必须至少是一个二维矩阵,sklearn不接受任何一维矩阵作为特征矩阵被输入。**如果数据的确只有一个特征,那必须使用reshape(-1,1)来给矩阵增维;如果数据只有一个特征和一个样本,使用reshape(1,-1)来给数据增维。

3 DecisionTreeRegressor

sklearn.DecisionTreeRegressor(criterion=‘mse’,splitter=‘best’,max_depth=None,min_samples_split=2,min_samples_leaf=1,min_weight -raction_leaf=0.0,max_features=None,random_state=None,max_leaf_nodes=None,min_impurity=0.0,min_impurity_split=None,presort=False)
几乎所有的参数、属性和接口都和分类树一模一样。注意:在回归树中,没有标签分布是否均衡的问题,因此没有class_weight这一参数。

3.1 重要参数、属性及接口
  • criterion
    回归树衡量分枝质量的指标,支持的标准有三种:
  • 输入‘mse’使用均方误差,父节点和叶子结点之间的均方误差的差额将被用来作为特征选择的标准,这种方法通过使用叶子结点的均值来最小化L2损失
  • 输入‘friedman_mse’使用费尔德曼均方误差,这种指标是针对潜在分枝中的问题改进后的均方误差
  • 输入‘mae’使用绝对平均误差,这种指标使用叶子结点的中值来最小化L1损失
    在回归树中,MSE不只是分枝质量衡量指标,也是最常用的衡量回归树回归质量的指标。当使用交叉验证或者其他方式获取回归树的结果时,往往选择均方误差作为评估标准(在分类树中这个指标时score,代表预测的准确率)。在回归中,追求MSE越小越好。
  • 属性
    属性中最重要的依然是feature_importances_
  • 接口
    接口依然是apply、fit、predict、score最核心。
    回归树的接口score返回的是R平方,并不是MSE。
    R方可以为正可以为负,MSE永远为正。虽然均方误差永远为正,但sklearn中使用均方误差作为评判标准时,计算的是“负均方误差(neg_mean_squared_error)”。因为sklearn在计算模型评价指标时,会考虑指标本身的性质,均方误差本身是一种误差,所以被sklearn划分为模型的一种损失,因此在sklearn中都以负数表示。真正的均方误差MSE的数值,就是neg_mean_squared_error去掉负号的值。
  • 补充:交叉验证
    交叉验证是用来观察模型的稳定性的一种方法,将数据划分为n份,依次使用其中一份作为测试集,其他n-1份作为训练集,多次计算模型的精确性来评估模型的平均准确程度。训练集和测试集的划分会干扰模型的结果,交叉验证使得模型训练结果更稳定。
    10折交叉验证
#交叉验证cross_val_score的用法
from sklearn.datasets import load_boston
from sklearn.model_selection import cross_val_score
from sklearn.tree import DecisionTreeRegressor
boston = load_boston()
regressor = DecisionTreeRegressor(random_state = 0)
cross_val_score(regressor,boston.data,boston.target,cv = 10
               #,scoring = "neg_mean_squared_error"
               #scoring默认返回R方
               )
'''
结果:
array([ 0.48141081,  0.60461936, -1.32633384,  0.54154398,  0.75705408,
        0.33934083,  0.18757206,  0.40679147, -1.9602183 , -0.32967889])
'''
3.2 实例:一维回归的图像绘制

观察决策树是如何拟合一条曲线的,用回归树来拟合正弦曲线,并添加一些噪声来观察回归树的表现。

#导入需要的库
import numpy  as np
from sklearn.tree import DecisionTreeRegressor
import matplotlib.pyplot as plt

#创建一条含有噪声的正弦曲线
#基本思路:创建一组随机的,分布在0-5上的横坐标的取值(x),然后将这组数据放到sin函数中去生成纵坐标的值(y),接着再到y上去添加噪声
rng = np.random.RandomState(1)#设置随机数种子
x=np.sort(5 * rng.rand(80,1),axis = 0)#80行1列,因为fit不支持一维数据
y = np.sin(x).ravel()
plt.figure()
plt.scatter(x,y,s=20,edgecolor = 'black',c='darkorange',label = 'data')
#结果:<matplotlib.collections.PathCollection at 0x178e9016c40>

在这里插入图片描述

#np.random.rand(数据结构),生成随机数组的函数
#了解降维函数ravel()的用法
np.random.random(
  • 3
    点赞
  • 28
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值