机器学习系列(9)_决策树详解01(下)

简介: 监督学习指:从给定的训练数据集中学习出一个函数(模型参数),当新的数据到来时,可以根据这个函数预测结果。

六、学习曲线判断选择参数



  1. 使用学习曲线判断最佳深度

信息熵:

# 使用学习曲线判断最佳深度——信息熵
import matplotlib.pyplot as plt
test = []
for i in range(10):
    clf = tree.DecisionTreeClassifier(max_depth=i+1  #1-10层
                                    ,criterion="entropy"
                                    ,random_state=30
                                    ,splitter="random"
                                    )
    clf = clf.fit(Xtrain, Ytrain)
    score = clf.score(Xtest, Ytest)  #分别计算测试集上的表现
    test.append(score)
plt.plot(range(1,11),test,color="red",label="max_depth")
plt.legend()
plt.show()


由下图可以看出:使用信息熵得到的最佳深度应该是31634e07ff25349088fb061acdb47781f.png

# 使用学习曲线判断最佳深度——基尼系数
import matplotlib.pyplot as plt
test = []
for i in range(10):
    clf = tree.DecisionTreeClassifier(max_depth=i+1  #1-10层
                                    ,criterion="gini" # 使用gini系数
                                    ,random_state=30
                                    ,splitter="random"
                                    )
    clf = clf.fit(Xtrain, Ytrain)
    score = clf.score(Xtest, Ytest)  #分别计算测试集上的表现
    test.append(score)
plt.plot(range(1,11),test,color="red",label="max_depth")
plt.legend()
plt.show()

由下图可以看出:使用基尼系数得到的最佳深度应该是5

7a15c240cb6f4ef98eeef50d8f554cc7.png

2. 使用学习曲线判断最佳的最小叶子节点样本个数

选取的最小样本从1到30

信息熵:

# 使用学习曲线判断最佳的最小叶子节点样本个数
# 选取的最小样本从1到30
import matplotlib.pyplot as plt
plt.figure(figsize=(15,8))
test = []
for i in range(30):
    clf = tree.DecisionTreeClassifier(min_samples_leaf=i+1  #1-10层
                                    ,criterion="entropy" # 使用gini系数
                                    ,random_state=30
                                    ,splitter="random"
                                    )
    clf = clf.fit(Xtrain, Ytrain)
    score = clf.score(Xtest, Ytest)  #分别计算测试集上的表现
    test.append(score)
plt.plot(range(1,31),test,color="red",label="min_samples_leaf")
plt.legend()
plt.show()

17638193231f4ae7beca33836f9c5fac.png

# 使用学习曲线判断最佳的最小叶子节点样本个数
# 选取的最小样本从1到30
import matplotlib.pyplot as plt
plt.figure(figsize=(15,8))
test = []
for i in range(30):
    clf = tree.DecisionTreeClassifier(min_samples_leaf=i+1  #1-10层
                                    ,criterion="gini" # 使用gini系数
                                    ,random_state=30
                                    ,splitter="random"
                                    )
    clf = clf.fit(Xtrain, Ytrain)
    score = clf.score(Xtest, Ytest)  #分别计算测试集上的表现
    test.append(score)
plt.plot(range(1,31),test,color="red",label="min_samples_leaf")
plt.legend()
plt.show()

78a0347fadc54520a022621ff92b771d.png


3. 使用学习曲线判断最佳的最小分枝样本数

这里如果直接按照最小叶子节点样本个数的方法,会报如下的错误,

4d7d10a6bc6c4f2da013841602eb7d4e.png

因此要把min_samples_split对应的范围调整在0~1之间:

信息熵:

# 使用学习曲线判断最佳的最小分枝样本数
# 选取的最小样本从1到30
import matplotlib.pyplot as plt
plt.figure(figsize=(15,8))
test = []
for i in range(30):
    clf = tree.DecisionTreeClassifier(min_samples_split=float(i+1)/100  #1-10层
                                    ,criterion="entropy" # 使用gini系数
                                    ,random_state=30
                                    ,splitter="random"
                                    )
    clf = clf.fit(Xtrain, Ytrain)
    score = clf.score(Xtest, Ytest)  #分别计算测试集上的表现
    test.append(score)
plt.plot(range(1,31),test,color="red",label="min_samples_split")
plt.legend()
plt.show()

ef2893aa7ffc42e79399eb7260d43bef.png

# 使用学习曲线判断最佳的最小分枝样本数
# 选取的最小样本从1到30
import matplotlib.pyplot as plt
plt.figure(figsize=(15,8))
test = []
for i in range(30):
    clf = tree.DecisionTreeClassifier(min_samples_split=float(i+1)/100  #1-10层
                                    ,criterion="gini" # 使用gini系数
                                    ,random_state=30
                                    ,splitter="random"
                                    )
    clf = clf.fit(Xtrain, Ytrain)
    score = clf.score(Xtest, Ytest)  #分别计算测试集上的表现
    test.append(score)
plt.plot(range(1,31),test,color="red",label="max_depth")
plt.legend()
plt.show()


七、目标权重参数



【1】class_weight & min_weight_fraction_leaf


完成样本标签平衡的参数。样本不平衡是指在一组数据集中,标签的一类天生占有很大的比例。


比如说,在银行要判断“一个办了信用卡的人是否会违约”,就是是vs否(1%:99%)的比例。这种分类状况下,即便模型什么也不做,全把结果预测成“否”,正确率也能有99%。


因此我们要使用class_weight参数对样本标签进行一定的均衡,给少量的标签更多的权重,让模型更偏向少数类,向捕获少数类的方向建模。该参数默认None,此模式表示自动给与数据集中的所有标签相同的权重。


有了权重之后,样本量就不再是单纯地记录数目,而是受输入的权重影响了,因此这时候剪枝,就需要搭配min_weight_fraction_leaf这个基于权重的剪枝参数来使用。


另请注意,基于权重的剪枝参数(例如min_weight_fraction_leaf)将比不知道样本权重的标准(比如min_samples_leaf)更少偏向主导类。如果样本是加权的,则使用基于权重的预修剪标准来更容易优化树结构,这确保叶节点至少包含样本权重的总和的一小部分。

643753b1ef5647c7ab449faf8f23e24e.png


【2】class_weight

目标类型的权重,其数据类型为dict或者列表内的dict,或者为"balanced"

【3】min_weight_fraction_leaf

权重剪枝参数,搭配目标权重使用,比min_samples_leaf更偏向于主导类

import matplotlib.pyplot as plt
plt.figure(figsize=(15,8))
test = []
for i in range(10):
    clf = tree.DecisionTreeClassifier(max_depth=i+1  #1-10层
                                    ,criterion="entropy"
                                    ,random_state=30
                                    ,splitter="random"
                                    ,class_weight="balanced"
                                    ,min_weight_fraction_leaf=0.005
                                    )
    clf = clf.fit(Xtrain, Ytrain)
    score = clf.score(Xtest, Ytest)  #分别计算测试集上的表现
    test.append(score)
plt.plot(range(1,11),test,color="red",label="max_depth")
plt.legend()
plt.show()

7fc1811430964197beb40d1252219b01.png


八、重要的属性和接口



属性是在模型训练之后,能够调用查看的模型的各种性质。对决策树来说,最重要的是feature_importances_,能够查看各个特征对模型的重要性。


sklearn中许多算法的接口都是相似的,比如之前已经用到的fit和score,几乎对每个算法都可以使用。


除了这两个接口之外,决策树最常用的接口还有apply和predict。


【1】apply中输入测试集返回每个测试样本所在的叶子节点的索引。


【2】predict输入测试集返回每个测试样本的标签。


所有接口中要求输入X_train和X_test的部分,输入的特征矩阵必须至少是一个二维矩阵。sklearn不接受任何一维矩阵作为特征矩阵被输入。


如果你的数据的确只有一个特征,那必须用reshape(-1,1)来给矩阵增维;如果你的数据只有一个特征和一个样本,使用reshape(1,-1)来给你的数据增维。

Xtest.shape
clf 

80ac287c4e6c4eed93e71f84d8f30c6f.pngdadfd8b27b574e64be0b335f619357f2.png

八个参数:Criterion,两个随机性相关的参数(random_state,splitter),五个剪枝参数(max_depth,

min_samples_split,min_samples_leaf,max_feature,min_impurity_decrease)


一个属性:feature_importances_


四个接口:fit(拟合),score(评分),apply,predict(样本预测)


九、决策树里面做回归



回归树衡量分枝质量的指标,支持的标准有三种:

【1】使用均方误差MSE,父节点和叶子节点之间的均方误差的差额将被用来作为特征选择的标准,这种方法通过使用叶子结点的均值来最小化损失。


【2】在回归树当中,MSE不仅是我们分枝质量衡量指标,也是我们最常用的衡量回归树回归质量的指标,当我们在使用交叉验证,或者其他方式获取回归树的结果时,我们往往选择均方误差作为评估。


【3】MSE的本质其实是样本真实数据与回归结果的差异。


CART算法:Classification And Regression Tree


CART,分类与回归树,是一个二分类法,结点的内部特征取值只有是与否。


回归树就是将特定的空间划分为若干个单元,每个特定的单元都有特定的输出。


因为只有是与否两个取值,因此是平行于坐标轴的。


使用波士顿房价的数据:

#简单用法——波士顿房价
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")

一维回归的图像绘制

# 一维回归的图像绘制
from sklearn.datasets import load_boston
from sklearn.model_selection import cross_val_score
from sklearn.tree import DecisionTreeRegressor
boston.data.shape

26f54727444842baa0990c4de10f8f49.png


实例化,得到第一次交叉验证的平均值

regressor = DecisionTreeRegressor(random_state=0) #实例化
cross_val_score(regressor, boston.data, boston.target, cv=10).mean()
#### 01 导入库
import numpy as np
from sklearn.tree import DecisionTreeRegressor
import matplotlib.pyplot as plt

创建含有噪声的正弦曲线

先创建一组随机的,分布在0~5上的横坐标轴的取值(x),然后将这一组值放到sin函数中去生成纵坐标的值(y),接着再到y上去添加噪声。全程使用numpy库来生成这个正弦曲线。

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.random((2,1))
np.random.random((2,1)).ravel() # ravel将多维数组变成一维数组
np.random.random((2,1)).ravel().shape
plt.figure()
plt.scatter(X, y, s=20, edgecolor="black",c="darkorange", label="data")

2b5d51dbfb174084b1b82620fac771a9.png

将这句话注释掉,则绘制出来的就是没有噪声的正弦曲线
# y[::5] += 3 * (0.5 - rng.rand(16)) #噪声

25c32911ac60454cbc579c8afbef015f.png

#### 03 实例化&训练模型  
#创建两个模型,在不同拟合情况下的观察
regr_1 = DecisionTreeRegressor(max_depth=1) # 最大深度为2
regr_2 = DecisionTreeRegressor(max_depth=3)
regr_1.fit(X, y) # y是存在噪声的
regr_2.fit(X, y)
# (4)测试集导入模型,预测结果
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)
#(5)绘制图像
plt.figure(figsize=(16,13))
plt.scatter(X, y, s=20, edgecolor="black",c="darkorange", label="data")
plt.plot(X_test, y_1, color="cornflowerblue",label="max_depth=1", linewidth=2)
plt.plot(X_test, y_2, color="yellowgreen", label="max_depth=3", linewidth=2)
plt.xlabel("data")
plt.ylabel("target")
plt.title("Decision Tree Regression")
plt.legend()
plt.show()

0aa77efb86a74ce686f3512c5fb8b276.pngd614b5aa33604eec8ae357284480a069.png


相关文章
|
2月前
|
机器学习/深度学习 存储 算法
决策树和随机森林在机器学习中的应用
在机器学习领域,决策树(Decision Tree)和随机森林(Random Forest)是两种非常流行且强大的分类和回归算法。它们通过模拟人类决策过程,将复杂的数据集分割成易于理解和处理的子集,从而实现对新数据的准确预测。
99 10
|
2月前
|
机器学习/深度学习 数据采集 监控
探索机器学习:从数据到决策
【9月更文挑战第18天】在这篇文章中,我们将一起踏上一段激动人心的旅程,穿越机器学习的世界。我们将探讨如何通过收集和处理数据,利用算法的力量来预测未来的趋势,并做出更加明智的决策。无论你是初学者还是有经验的开发者,这篇文章都将为你提供新的视角和思考方式。
|
2月前
|
机器学习/深度学习 算法 Python
从菜鸟到大师:一棵决策树如何引领你的Python机器学习之旅
【9月更文挑战第9天】在数据科学领域,机器学习如同璀璨明珠,吸引无数探索者。尤其对于新手而言,纷繁复杂的算法常让人感到迷茫。本文将以决策树为切入点,带您从Python机器学习的新手逐步成长为高手。决策树以其直观易懂的特点成为入门利器。通过构建决策树分类器并应用到鸢尾花数据集上,我们展示了其基本用法及效果。掌握决策树后,还需深入理解其工作原理,调整参数,并探索集成学习方法,最终将所学应用于实际问题解决中,不断提升技能。愿这棵智慧之树助您成为独当一面的大师。
44 3
|
2月前
|
机器学习/深度学习 算法 Python
决策树下的智慧果实:Python机器学习实战,轻松摘取数据洞察的果实
【9月更文挑战第7天】当我们身处数据海洋,如何提炼出有价值的洞察?决策树作为一种直观且强大的机器学习算法,宛如智慧之树,引领我们在繁复的数据中找到答案。通过Python的scikit-learn库,我们可以轻松实现决策树模型,对数据进行分类或回归分析。本教程将带领大家从零开始,通过实际案例掌握决策树的原理与应用,探索数据中的秘密。
47 1
|
3月前
|
机器学习/深度学习 算法 数据挖掘
【白话机器学习】算法理论+实战之决策树
【白话机器学习】算法理论+实战之决策树
|
3月前
|
机器学习/深度学习 算法 自动驾驶
揭秘机器学习模型的决策之道
【8月更文挑战第22天】本文将深入浅出地探讨机器学习模型如何从数据中学习并做出预测。我们将一起探索模型背后的数学原理,了解它们是如何被训练以及如何对新数据进行预测的。文章旨在为初学者提供一个清晰的机器学习过程概述,并启发读者思考如何在自己的项目中应用这些技术。
|
3月前
|
机器学习/深度学习 算法 搜索推荐
基于机器学习的用户行为分析:深入洞察与精准决策
【8月更文挑战第3天】基于机器学习的用户行为分析为企业提供了深入了解用户需求、优化产品设计和制定精准营销策略的有力工具。随着人工智能和大数据技术的不断发展,用户行为分析将更加智能化和个性化。未来,我们可以期待更加高效、精准的机器学习算法和模型的出现,以及更多创新性的应用场景的拓展。同时,也需要关注数据隐私和安全性问题,确保用户数据的安全和合规使用。
|
3月前
|
机器学习/深度学习 算法 Python
决策树下的智慧果实:Python机器学习实战,轻松摘取数据洞察的果实
【8月更文挑战第3天】在数据的海洋中探寻真知,决策树犹如智慧之树,以其直观易懂的强大功能,引领我们逐步缩小决策范围,轻松获取数据洞察。本篇将带您踏上Python机器学习之旅,从理解决策树为何受青睐开始,通过scikit-learn库实现鸢尾花数据集分类,解析其决策机制,并掌握调参技巧,最终优化模型性能,共同摘取数据科学的甜美果实。
50 1
|
3月前
|
机器学习/深度学习 数据可视化 算法
决策树VS世界:掌握Python机器学习中的这棵树,决策从此不再迷茫
【8月更文挑战第2天】在数据驱动时代,决策树作为一种直观且易于解释的机器学习方法,因其强大的分类与回归能力备受青睐。本文介绍决策树的基础概念:通过属性测试划分数据,优化选择以提高预测准确度。使用Python的scikit-learn库,我们演示了如何加载鸢尾花数据集,构建并训练决策树模型,评估其准确性,以及利用`plot_tree`函数可视化决策过程,从而更好地理解模型的工作原理。掌握这些技能,你将在面对复杂决策时更加自信。
25 2
|
3月前
|
机器学习/深度学习 算法 Python
从菜鸟到大师:一棵决策树如何引领你的Python机器学习之旅
【8月更文挑战第1天】在数据科学领域,机器学习如同璀璨明珠,而决策树则以其直观易懂成为入门利器。本文引导初学者利用Python的`scikit-learn`库构建决策树模型。以鸢尾花数据集为例,展示了从加载数据、划分训练/测试集、创建`DecisionTreeClassifier`、训练模型到评估准确率的全过程。掌握这些基本操作后,还需深入理解信息增益、基尼不纯度等原理,学会调参优化,并探索集成学习方法如随机森林和梯度提升树,最终将理论应用于实践,成长为真正的机器学习大师。
36 2