最后
不知道你们用的什么环境,我一般都是用的Python3.6环境和pycharm解释器,没有软件,或者没有资料,没人解答问题,都可以免费领取(包括今天的代码),过几天我还会做个视频教程出来,有需要也可以领取~
给大家准备的学习资料包括但不限于:
Python 环境、pycharm编辑器/永久激活/翻译插件
python 零基础视频教程
Python 界面开发实战教程
Python 爬虫实战教程
Python 数据分析实战教程
python 游戏开发实战教程
Python 电子书100本
Python 学习路线规划
网上学习资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。
一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!
- 更新权重 N 接下来的训练实例(吨+1) 模型:
瓦n(吨+1) = 瓦n(吨)*电子Xp(α吨*一世(是n≠H吨(Xn)))
- 之后 吨 迭代,计算最终输出:
F(X) = 秒一世Gn(∑吨吨α吨*H吨(X))
使用 Python 从头开始提升
在之前关于分类树、回归树 和随机森林模型的章节中,我们一直拖着整个“从头开始的树代码”。我想我们现在已经理解了如何在 Python 中从头开始构建树模型(用于回归或分类)的概念,如果没有,只需转到前面的一章并使用代码!由于 Boosting 概念的威力和神秘性更多地在于弱学习器的组合,因为在创建这些弱学习器时,我们将使用sklearn 的 DecisionTreeClassifier 来创建单个弱学习器,但将从头开始编写实际的 boosting 过程。
为了使 sklearn DecisionTreeClassifier 成为*弱*分类器,我们将设置 *max_depth* 参数 == 1 以创建称为 *decision Stump* 的东西,它在原则上(如上所述)没有别的东西作为只有一层的决策树,即也就是说,根节点直接以叶节点结束,因此数据集只分裂一次。与往常一样,我们将使用香农熵作为分割标准。
正如您可能看到的,即使我们在这里不使用我们的自编码决策树算法,我们在实际的树构建算法中唯一必须改变的是我们引入了一个最大深度参数,该参数在第一次分裂后停止生长树 -代码中的这种细微变化实际上不值得拖到这里 - 作为数据集,我们使用UCI 蘑菇数据集, 就像我们在之前的随机森林章节中所做的那样。
让我们首先创建一个决策树桩并测量该决策树桩的准确性,以了解该模型的预测“好”或更“坏”。
“”"
创建一个决策树桩
“”"
import numpy as np
import matplotlib.pyplot as plt
import pandas as pd
from matplotlib import style
style 。使用( ‘fivethirtyeight’ )
from sklearn.tree import DecisionTreeClassifier
from sklearn.preprocessing import LabelEncoder
from sklearn.model_selection import cross_validate
import scipy.stats as sps
# 加载数据并定义列标签
数据集 = pd 。read_csv ( ‘data\mushroom.csv’ , header = None )
dataset = dataset 。样本( frac = 1 )
数据集。列 = [ ‘目标’ , ‘帽形状’ , ‘帽表面’ , ‘帽颜色’ , ‘瘀伤’ , ‘气味’ , ‘鳃附件’ , ‘鳃间距’ ,
‘鳃大小’ , ‘鳃色’ , ‘stalk-root’ , ‘stalk-surface-above-ring’ , ‘stalk-surface-below-ring’ , ‘stalk-color-above-ring’ ,
‘stalk-color-below-ring’ , ‘veil-类型’ ,‘面纱颜色’ ,‘环号’ ,‘环类型’ ,‘孢子打印颜色’ ,‘人口’ ,
‘栖息地’ ]
#编码从字符串到整数的特征值,因为sklearn DecisionTreeClassifier只需数值
为 标签 的 数据集。列:
数据集[标签] = LabelEncoder () 。适合(数据集[标签])。变换(数据集[标签])
Tree_model = DecisionTreeClassifier (标准= “entropy” , max_depth = 1 )
X = 数据集。drop ( ‘target’ , axis = 1 )
Y = dataset [ ‘target’ ] 。其中(数据集[ ‘目标’ ] == 1 ,- 1 )
预测 = np 。均值( cross_validate ( Tree_model , X , Y , cv = 100 )[ ‘test_score’ ])
打印(‘准确度为:’ ,预测* 100 ,‘%’ )
输出:
准确率为:73.06860322953968%
请注意,我们已经使用 100 倍交叉验证在同一数据集(整个数据集)上训练和测试了模型。我们得到的准确度为≈ 73% 这不是很好,但考虑到我们已经使用决策树桩进行分类(仅拆分数据集一次),这也不算太糟糕。
接下来,让我们看看如何使用增强决策树桩方法来改进这个结果。可能有点令人困惑的一件事是,在我们到达最终*增强决策树桩*的路上,我们使用整个数据集作为训练和测试数据集(我们不进行训练测试拆分)。您可能还记得,我们通常想要一个训练集,我们在其上训练模型和一个测试集,我们在其上测试模型 - 然而,对于 Boosting,我们例外并使用整个数据集进行训练和测试 - 只要保持这个例外记-。
类 提升:
def __init__ ( self , dataset , T , test_dataset ):
self 。数据集 = 数据集
自我。T = T
自我。test_dataset = test_dataset
self 。alphas = None
self 。模型 = 无
self 。准确性 = []
自我。预测 = 无
def fit ( self ):
# 设置描述性特征和目标特征
X = self . 数据集。drop ([ ‘target’ ], axis = 1 )
Y = self 。数据集[ ‘目标’ ] 。where ( self . dataset [ ‘target’ ] == 1 , - 1 )
# 用 wi = 1/N 初始化每个样本的权重并创建一个数据框,在其中计算
评估 Evaluation = pd 。数据帧(ý 。复制())
评价[ ‘权重’ ] = 1 / LEN (自我。数据集) #设置初始权重w = 1 / N
# 通过创建 T 个“加权模型”运行 boosting 算法
阿尔法 = []
模型 = []
用于 吨 在 范围(自。Ť ):
# 训练决策树桩
Tree_model = DecisionTreeClassifier ( criteria = “entropy” , max_depth = 1 ) # 注意决策树桩 --> 决策树桩
# 我们知道我们必须在加权数据集上训练我们的决策树桩,其中权重取决于
# 先前决策树桩
的结果_。为了实现这一点,我们使用上面创建的#‘evaluation dataframe’_
的 ‘weights’ 列以及__fit 方法的 sample_weight 参数。__# sample_weights 参数的文档说:“[…] 如果没有,那么样本的权重相等。”
# 因此,如果 NOT None,则样本的权重不同,因此我们创建了一个 WEIGHTED 数据集
# 这正是我们想要的。
模型 = Tree_model 。拟合( X , Y , sample_weight = np. 数组(评估[ ‘权重’ ]))
#将单个弱分类器附加到一个列表中,该列表稍后用于制作
#加权决策
模型。追加(模型)
预测 = 模型。预测( X )
分数 = 模型。得分( X , Y )
# 将值添加到评估数据帧
评估[ ‘predictions’ ] = 预测
评估[ ‘evaluation’ ] = np . 其中( Evaluation [ ‘predictions’ ] == Evaluation [ ‘target’ ], 1 , 0 )
Evaluation [ ‘misclassified’ ] = np 。其中(评估[ ‘预测’ ] != 评估[ ‘目标’ ],1 , 0 )
# 计算误分类率和准确率
accuracy = sum ( Evaluation [ ‘evaluation’ ]) / len ( Evaluation [ ‘evaluation’ ])
misclassification = sum ( Evaluation [ ‘misclassified’ ]) / len ( Evaluation [ ‘misclassified’ ])
# 计算错误
err = np . sum ( Evaluation [ ‘weights’ ] * Evaluation [ ‘misclassified’ ]) / np 。sum (评估[ ‘权重’ ])
# 计算 alpha 值
alpha = np . 记录(( 1 - err ) / err )
alphas 。追加(阿尔法)
# 更新权重 wi --> 这些更新后的权重用于 sample_weight 参数
# 用于训练下一个决策树桩。
评估[ ‘权重’ ] *= np 。exp ( alpha * Evaluation [ ‘misclassified’ ])
#print(‘{0}.模型的准确度为:’.format(t+1),accuracy*100,‘%’)
#print(‘误分类率为:’,misclassification*100,‘%’ )
自我。阿尔法 = 阿尔法
自我。模型 = 模型
def 预测( self ):
X_test = self 。测试数据集。drop ([ ‘target’ ], axis = 1 ) 。reindex ( range ( len ( self . test_dataset )))
Y_test = self 。test_dataset [ ‘目标’ ] 。reindex ( range ( len ( self . test_dataset ))) 。其中(自我。数据集[ ‘目标’ ] == 1 , - 1 )
# 对 self.model 列表中的每个模型进行预测
准确率 = []
预测 = []
为 阿尔法,模型 在 拉链(自我。阿尔法,自我。模型):
预测 = 阿尔法*模型。predict ( X_test ) #我们对列表
预测中_的单个决策树分类器模型使用predict方法_。追加(预测)
自我。准确性。追加( np . sum ( np . sign ( np .总和(NP 。阵列(预测),轴线= 0 ))== Y_test 。values ) / len ( predictions [ 0 ]))
# 上面的代码行可能有点混乱,因此我将完成单个步骤:
# 目标:创建一个准确度列表,可用于绘制准确度用于模型的基础学习器的数量
# 1. np.array(predictions) --> 这是包含单个模型预测的数组。它的形状为 8124xn
# 因此看起来像 [[0.998,0.87,…0.87…],[…],[…],[0.99,1.23,…,1.05,0,99…] ]
# 2. np.sum(np.array(predictions),axis=0) --> 总结列表的第一个元素,即 0,998+…+…+0.99。这是
#做是因为对于预测公式要我们总结了所有模型的预测数据集中每个实例。
# 因此,如果我们有例如 3 个模型,则预测数组的形状为 8124x3(想象一个有 3 列和
#8124 行
的表格_)。_这里第一列包含第一个模型的预测,第二列包含__第二个模型的预测,第三列包含第三个模型的预测(注意
#第二个和第三个模型受第一个结果的影响,尤其是第一个和
#第二个模型)。这是合乎逻辑的,因为列(模型)
#n-1 的结果用于更改第 n 个模型的权重,然后使用第 n 个模型的结果来更改
n+1 模型
的权重_。__# 3. np.sign(np.sum(np.array(predictions),axis=0)) --> 由于我们的测试目标数据是 {-1,1} 的元素,我们希望_
# 在同样的格式,我们使用sign函数。因此,accuracy 数组中的每一列就像
# [-0.998,1.002,1.24,…,-0.89] 并且每个元素代表该列上所有模型的组合和加权预测
#(例如,如果我们在第 5 列中,对于第 4 个实例,我们会找到值 -0.989,该值表示
具有 5 个基学习器的增强模型
的_# 加权预测,用于第 4 个实例。第 6 个实例的第 4 个实例列代表__# 具有 6 个基学习器的增强模型的加权和组合预测,而第 4 列的第 4 个实例代表_
# 具有 4 个基学习器的模型的预测等等…)。长话短说,我们
对这些未来预测的符号
很感兴趣_。如果符号是正的,我们知道真正的预测更有可能是正 (1) 然后# 负 (-1)。值越高(正值或负值),模型返回正确预测的可能性就越大。_
# 4. np.sum(np.sign(np.sum(np.array(predictions),axis=0))==Y_test.values)/len(predictions[0]) --> 最后一步我们有将数组
# 转换为形状 8124x1,其中实例是元素 {-1,1},因此我们现在可以将这个
预测与我们的目标特征值
进行比较_。_目标特征数组的形状为 8124x1,因为对于每一行,它只包含__一个预测 {-1,1},就像我们刚刚在上面创建的数组一样 --> 准备比较;)。
# 比较是通过 == Y_test.values 命令完成的。结果我们得到一个
形状为 8124x1__的_# 数组,其中实例是 {True,False} 的元素(如果我们的预测与_
# 目标特征值,否则为 False)。由于我们要计算百分比值,因此必须计算
已正确分类
的_# 个实例__的比例__。因此,我们简单地将上面的比较数组# 与沿轴 0 的元素 {True,False}_
相加。__# 并将其除以总行数 (8124),因为 True 与 1 相同,而 False 与 0 相同. 因此,正确的预测会
增加总和,而错误的预测不会改变总和。如果我们没有预测正确,则计算结果为 0/8124 并且
#
随之为__0,如果我们预测一切正确,则计算结果为 8124/8124 并因此为 1。__# 5. self.accuracy.append(np.sum(np.sign(np) .sum(np.array(predictions),axis=0))==Y_test.values)/len(predictions[0])) -->
# 计算完以上步骤后,我们将结果添加到 self.accuracy 列表中。这个列表的形状为 nx 1,也就是说,
#对于一个有 5 个基学习器的模型,这个列表有 5 个条目,其中第 5 个条目表示当所有
#5 个基学习器组合
时模型的准确性_,第 4 个元素表示模型的准确性当 4 个基学习器组合时的模型等等。这个# 过程已经在上面解释过了。就是这样,我们可以绘制准确性。_
自我。预测 = np 。符号(np . sum (np . array (预测),轴= 0))
######根据使用的树桩模型数量绘制模型的准确性##########
number_of_base_learners = 50
无花果 = plt 。图( figsize = ( 10 , 10 ))
ax0 = fig . add_subplot ( 111 )
对于 我 在 范围(number_of_base_learners ):
模型 = 助推(数据集,我,数据集)
模型。拟合()
模型。预测()
轴0 。绘图(范围(len (模型。准确度)),模型。准确度,‘-b’ )
ax0 。set_xlabel ( ‘#用于提升的模型’ )
ax0 。set_ylabel (“精度” )
打印(“具有一批” ,number_of_base_learners ,“基本模型我们收到的精度” ,模型。准确性[ - 1 ] * 100, ‘%’ )
PLT 。显示()
感谢每一个认真阅读我文章的人,看着粉丝一路的上涨和关注,礼尚往来总是要有的:
① 2000多本Python电子书(主流和经典的书籍应该都有了)
② Python标准库资料(最全中文版)
③ 项目源码(四五十个有趣且经典的练手项目及源码)
④ Python基础入门、爬虫、web开发、大数据分析方面的视频(适合小白学习)
⑤ Python学习路线图(告别不入流的学习)
网上学习资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。
一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!