机器学习系列(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


相关文章
|
22天前
|
机器学习/深度学习 算法 搜索推荐
Machine Learning机器学习之决策树算法 Decision Tree(附Python代码)
Machine Learning机器学习之决策树算法 Decision Tree(附Python代码)
|
3天前
|
机器学习/深度学习 算法 数据挖掘
PYTHON银行机器学习:回归、随机森林、KNN近邻、决策树、高斯朴素贝叶斯、支持向量机SVM分析营销活动数据|数据分享-2
PYTHON银行机器学习:回归、随机森林、KNN近邻、决策树、高斯朴素贝叶斯、支持向量机SVM分析营销活动数据|数据分享
24 1
|
8天前
|
机器学习/深度学习 存储 算法
PYTHON集成机器学习:用ADABOOST、决策树、逻辑回归集成模型分类和回归和网格搜索超参数优化
PYTHON集成机器学习:用ADABOOST、决策树、逻辑回归集成模型分类和回归和网格搜索超参数优化
30 7
|
1月前
|
机器学习/深度学习 数据采集 算法
实现机器学习算法(如:决策树、随机森林等)。
实现机器学习算法(如:决策树、随机森林等)。
25 0
|
3月前
|
机器学习/深度学习 算法 Python
机器学习 - [源码实现决策树小专题]决策树中,信息增益、信息增益率计算以及最佳特征挑选的Python实现
机器学习 - [源码实现决策树小专题]决策树中,信息增益、信息增益率计算以及最佳特征挑选的Python实现
45 0
|
1月前
|
机器学习/深度学习 存储 搜索推荐
利用机器学习算法改善电商推荐系统的效率
电商行业日益竞争激烈,提升用户体验成为关键。本文将探讨如何利用机器学习算法优化电商推荐系统,通过分析用户行为数据和商品信息,实现个性化推荐,从而提高推荐效率和准确性。
|
1月前
|
机器学习/深度学习 算法 数据可视化
实现机器学习算法时,特征选择是非常重要的一步,你有哪些推荐的方法?
实现机器学习算法时,特征选择是非常重要的一步,你有哪些推荐的方法?
27 1
|
1月前
|
机器学习/深度学习 数据采集 算法
解码癌症预测的密码:可解释性机器学习算法SHAP揭示XGBoost模型的预测机制
解码癌症预测的密码:可解释性机器学习算法SHAP揭示XGBoost模型的预测机制
110 0
|
1月前
|
机器学习/深度学习 数据采集 监控
机器学习-特征选择:如何使用递归特征消除算法自动筛选出最优特征?
机器学习-特征选择:如何使用递归特征消除算法自动筛选出最优特征?
69 0
|
1月前
|
机器学习/深度学习 人工智能 算法
探索机器学习中的支持向量机(SVM)算法
【2月更文挑战第20天】 在数据科学与人工智能的领域中,支持向量机(SVM)是一种强大的监督学习算法,它基于统计学习理论中的VC维理论和结构风险最小化原理。本文将深入探讨SVM的核心概念、工作原理以及实际应用案例。我们将透过算法的数学原理,揭示如何利用SVM进行有效的数据分类与回归分析,并讨论其在处理非线性问题时的优势。通过本文,读者将对SVM有更深层次的理解,并能够在实践中应用这一算法解决复杂的数据问题。
19 0

热门文章

最新文章