iis服务器助手广告广告
返回顶部
首页 > 资讯 > 后端开发 > Python >Python中如何用XGBoost和scikit-learn进行随机梯度增强
  • 533
分享到

Python中如何用XGBoost和scikit-learn进行随机梯度增强

2023-06-15 12:06:54 533人浏览 独家记忆

Python 官方文档:入门教程 => 点击学习

摘要

这篇文章将为大家详细讲解有关python中如何用XGBoost和scikit-learn进行随机梯度增强,文章内容质量较高,因此小编分享给大家做个参考,希望大家阅读完这篇文章后对相关知识有一定的了解。集成决策树的一种简单技术涉及在训练数据集

这篇文章将为大家详细讲解有关python中如何用XGBoost和scikit-learn进行随机梯度增强,文章内容质量较高,因此小编分享给大家做个参考,希望大家阅读完这篇文章后对相关知识有一定的了解。

集成决策树的一种简单技术涉及在训练数据集的子样本上训练树。可以采用训练数据中行的子集来训练称为袋装的单个树。在计算每个分割点时,如果还使用了训练数据的行的子集,则这称为随机森林。这些技术也可以在称为随机梯度增强的技术中用于梯度树增强模型。

随机梯度提升

梯度增强是一个贪婪的过程。将新的决策树添加到模型中,以更正现有模型的残差。使用贪婪搜索过程创建每个决策树,以选择最能最小化目标函数的分割点。这可能会导致树一次又一次使用相同的属性,甚至使用相同的分割点。

套袋是一种创建决策树集合的技术,每个决策树都来自训练数据中不同的随机行子集。效果是,由于样本的随机性允许创建略有不同的树木,因此从树的集合中获得了更好的性能,从而为集合的预测增加了方差。随机森林通过在选择分割点时对要素(列)进行二次采样,从而进一步扩大了这一步骤,从而进一步增加了树木的整体差异。这些相同的技术可以用于梯度提升中决策树的构建中,这种变化称为随机梯度提升。通常使用训练数据的激进子样本,例如40%到80%。

教程概述

在本教程中,我们将研究不同的二次采样技术在梯度增强中的作用。我们将调整Python的XGBoost库所支持的三种不同的随机梯度增强方式,特别是:

  •  创建每棵树时,对数据集中的行进行二次采样。

  •  创建每棵树时对数据集中的列进行二次采样。

  •  创建每个树时,数据集中每个拆分的列的子采样。

问题描述:Otto数据集

在本教程中,我们将使用“奥托集团产品分类挑战”数据集。该数据集可从Kaggle免费获得(您需要注册到Kaggle才能下载此数据集)。您可以从“数据”页面下载训练数据集train.csv.zip并将解压缩后的train.csv文件放入您的工作目录中。该数据集描述了61,000多种产品的93个混淆细节,这些产品分为10个产品类别(例如,时尚,电子产品等)。输入属性是某种不同事件的计数。目标是对新产品做出预测,将其作为10个类别中每一个类别的概率数组,并使用多类对数损失(也称为交叉熵)对模型进行评估。该竞赛已于2015年5月完成,并且由于示例数量不多,问题难度大,几乎不需要数据准备(除了将字符串类变量编码为整数)的事实,该数据集对于XGBoost还是一个很大的挑战。

在XGBoost中调整行二次采样

行二次抽样涉及选择训练数据集的随机样本而不进行替换。可以在subsample参数的XGBoost类的scikit-learn包装器中指定行子采样。默认值为1.0,该值不进行二次采样。我们可以使用scikit-learn中内置的网格搜索功能来评估从0.1到1.0的不同子样本值对Otto数据集的影响。

[0.1, 0.2, 0.3, 0.4, 0.5, 0.6, 0.7, 0.8, 1.0]

子样本有9个变体,每个模型将使用10倍交叉验证进行评估,这意味着需要训练和测试9×10或90个模型。

下面提供了完整的代码清单。

# XGBoost on Otto dataset, tune subsample  from pandas import read_csv  from xgboost import XGBClassifier  from sklearn.model_selection import GridSearchCV  from sklearn.model_selection import StratifiedKFold  from sklearn.preprocessing import LabelEncoder  import matplotlib  matplotlib.use('Agg')  from matplotlib import pyplot  # load data  data = read_csv('train.csv')  datadataset = data.values  # split data into X and y  X = dataset[:,0:94]  y = dataset[:,94]  # encode string class values as integers  label_encoded_y = LabelEncoder().fit_transfORM(y)  # grid search  model = XGBClassifier()  subsample = [0.1, 0.2, 0.3, 0.4, 0.5, 0.6, 0.7, 0.8, 1.0]  param_grid = dict(subsamplesubsample=subsample)  kfold = StratifiedKFold(n_splits=10, shuffle=True, random_state=7)  grid_search = GridSearchCV(model, param_grid, scoring="neg_log_loss", n_jobs=-1, cv=kfold)  grid_result = grid_search.fit(X, label_encoded_y)  # summarize results  print("Best: %f using %s" % (grid_result.best_score_, grid_result.best_params_))  means = grid_result.cv_results_['mean_test_score']  stds = grid_result.cv_results_['std_test_score']  params = grid_result.cv_results_['params']  for mean, stdev, param in zip(means, stds, params):   print("%f (%f) with: %r" % (mean, stdev, param))  # plot  pyplot.errorbar(subsample, means, yerr=stds)  pyplot.title("XGBoost subsample vs Log Loss")  pyplot.xlabel('subsample')  pyplot.ylabel('Log Loss')  pyplot.savefig('subsample.png')

运行此示例将打印最佳配置以及每个测试配置的日志丢失。

注意:由于算法或评估程序的随机性,或者数值精度的差异,您的结果可能会有所不同。考虑运行该示例几次并比较平均结果。

我们可以看到,获得的最佳结果是0.3,或者使用30%的训练数据集样本训练树。

Best: -0.000647 using {'subsample': 0.3}  -0.001156 (0.000286) with: {'subsample': 0.1}  -0.000765 (0.000430) with: {'subsample': 0.2}  -0.000647 (0.000471) with: {'subsample': 0.3}  -0.000659 (0.000635) with: {'subsample': 0.4}  -0.000717 (0.000849) with: {'subsample': 0.5}  -0.000773 (0.000998) with: {'subsample': 0.6}  -0.000877 (0.001179) with: {'subsample': 0.7}  -0.001007 (0.001371) with: {'subsample': 0.8}  -0.001239 (0.001730) with: {'subsample': 1.0}

我们可以绘制这些均值和标准偏差对数损失值,以更好地了解性能如何随子样本值变化。

我们可以看到确实有30%的人具有最佳的平均表现,但是我们也可以看到,随着比率的增加,表现的差异会明显增加。有趣的是,所有子样本值的平均性能都优于不进行子抽样的平均性能(子样本= 1.0)。

在XGBoost中按树调整列二次采样

我们还可以在增强模型中创建每个决策树之前,创建要使用的特征(或列)的随机样本。在scikit-learn的XGBoost包装器中,这由colsample_bytree参数控制。默认值为1.0,表示在每个决策树中使用所有列。我们可以在0.1到1.0之间评估colsample_bytree的值,以0.1为增量。

[0.1, 0.2, 0.3, 0.4, 0.5, 0.6, 0.7, 0.8, 1.0]

完整实例如下:

# XGBoost on Otto dataset, tune colsample_bytree  from pandas import read_csv  from xgboost import XGBClassifier  from sklearn.model_selection import GridSearchCV  from sklearn.model_selection import StratifiedKFold  from sklearn.preprocessing import LabelEncoder  import matplotlib  matplotlib.use('Agg')  from matplotlib import pyplot  # load data  data = read_csv('train.csv')  datadataset = data.values  # split data into X and y  X = dataset[:,0:94]  y = dataset[:,94]  # encode string class values as integers  label_encoded_y = LabelEncoder().fit_transform(y)  # grid search  model = XGBClassifier()  colsample_bytree = [0.1, 0.2, 0.3, 0.4, 0.5, 0.6, 0.7, 0.8, 1.0]  param_grid = dict(colsample_bytreecolsample_bytree=colsample_bytree)  kfold = StratifiedKFold(n_splits=10, shuffle=True, random_state=7)  grid_search = GridSearchCV(model, param_grid, scoring="neg_log_loss", n_jobs=-1, cv=kfold)  grid_result = grid_search.fit(X, label_encoded_y)  # summarize results  print("Best: %f using %s" % (grid_result.best_score_, grid_result.best_params_))  means = grid_result.cv_results_['mean_test_score']  stds = grid_result.cv_results_['std_test_score']  params = grid_result.cv_results_['params']  for mean, stdev, param in zip(means, stds, params):   print("%f (%f) with: %r" % (mean, stdev, param))  # plot  pyplot.errorbar(colsample_bytree, means, yerr=stds)  pyplot.title("XGBoost colsample_bytree vs Log Loss")  pyplot.xlabel('colsample_bytree')  pyplot.ylabel('Log Loss')  pyplot.savefig('colsample_bytree.png')

运行此示例将打印最佳配置以及每个测试配置的日志丢失。

注意:由于算法或评估程序的随机性,或数值精度的差异,您的结果可能会有所不同。

我们可以看到,模型的最佳性能是colsample_bytree = 1.0。这表明该问题进行二次采样不会增加价值。

Best: -0.001239 using {'colsample_bytree': 1.0}  -0.298955 (0.002177) with: {'colsample_bytree': 0.1}  -0.092441 (0.000798) with: {'colsample_bytree': 0.2}  -0.029993 (0.000459) with: {'colsample_bytree': 0.3}  -0.010435 (0.000669) with: {'colsample_bytree': 0.4}  -0.004176 (0.000916) with: {'colsample_bytree': 0.5}  -0.002614 (0.001062) with: {'colsample_bytree': 0.6}  -0.001694 (0.001221) with: {'colsample_bytree': 0.7}  -0.001306 (0.001435) with: {'colsample_bytree': 0.8}  -0.001239 (0.001730) with: {'colsample_bytree': 1.0}

绘制结果,我们可以看到模型平稳段的性能(至少在此比例下),值为0.5到1.0。

通过拆分在XGBoost中调整列二次采样

不必为每个树对列进行一次子采样,我们可以在决策树的每个拆分中对它们进行子采样。原则上,这是随机森林中使用的方法。我们可以在scikit-learn的XGBoost包装器类的colsample_bylevel参数中设置每个拆分所使用的列样本的大小。和以前一样,我们将比率从10%更改为默认值100%。

下面提供了完整的代码清单。

# XGBoost on Otto dataset, tune colsample_bylevel  from pandas import read_csv  from xgboost import XGBClassifier  from sklearn.model_selection import GridSearchCV  from sklearn.model_selection import StratifiedKFold  from sklearn.preprocessing import LabelEncoder  import matplotlib  matplotlib.use('Agg')  from matplotlib import pyplot  # load data  data = read_csv('train.csv')  datadataset = data.values  # split data into X and y  X = dataset[:,0:94]  y = dataset[:,94]  # encode string class values as integers  label_encoded_y = LabelEncoder().fit_transform(y)  # grid search  model = XGBClassifier()  colsample_bylevel = [0.1, 0.2, 0.3, 0.4, 0.5, 0.6, 0.7, 0.8, 1.0]  param_grid = dict(colsample_bylevelcolsample_bylevel=colsample_bylevel)  kfold = StratifiedKFold(n_splits=10, shuffle=True, random_state=7)  grid_search = GridSearchCV(model, param_grid, scoring="neg_log_loss", n_jobs=-1, cv=kfold)  grid_result = grid_search.fit(X, label_encoded_y)  # summarize results  print("Best: %f using %s" % (grid_result.best_score_, grid_result.best_params_))  means = grid_result.cv_results_['mean_test_score']  stds = grid_result.cv_results_['std_test_score']  params = grid_result.cv_results_['params']  for mean, stdev, param in zip(means, stds, params):   print("%f (%f) with: %r" % (mean, stdev, param))  # plot  pyplot.errorbar(colsample_bylevel, means, yerr=stds)  pyplot.title("XGBoost colsample_bylevel vs Log Loss")  pyplot.xlabel('colsample_bylevel')  pyplot.ylabel('Log Loss')  pyplot.savefig('colsample_bylevel.png')

运行此示例将打印最佳配置以及每个测试配置的日志丢失。

注意:由于算法或评估程序的随机性,或者数值精度的差异,您的结果可能会有所不同。考虑运行该示例几次并比较平均结果。

我们可以看到,通过将colsample_bylevel设置为70%可获得最佳结果,导致(倒置)对数损失为-0.001062,这比将每棵树的列采样设置为100%时看到的-0.001239好。

如果每棵树的结果建议使用100%的列,则建议不要放弃列二次采样,而应尝试按拆分的列二次采样。

Best: -0.001062 using {'colsample_bylevel': 0.7}  -0.159455 (0.007028) with: {'colsample_bylevel': 0.1}  -0.034391 (0.003533) with: {'colsample_bylevel': 0.2}  -0.007619 (0.000451) with: {'colsample_bylevel': 0.3}  -0.002982 (0.000726) with: {'colsample_bylevel': 0.4}  -0.001410 (0.000946) with: {'colsample_bylevel': 0.5}  -0.001182 (0.001144) with: {'colsample_bylevel': 0.6}  -0.001062 (0.001221) with: {'colsample_bylevel': 0.7}  -0.001071 (0.001427) with: {'colsample_bylevel': 0.8}  -0.001239 (0.001730) with: {'colsample_bylevel': 1.0}

我们可以绘制每个colsample_bylevel变化的性能。结果表明,在此比例下的值为0.3后,方差相对较低,并且性能似乎处于平稳状态。

关于Python中如何用XGBoost和scikit-learn进行随机梯度增强就分享到这里了,希望以上内容可以对大家有一定的帮助,可以学到更多知识。如果觉得文章不错,可以把它分享出去让更多的人看到。

--结束END--

本文标题: Python中如何用XGBoost和scikit-learn进行随机梯度增强

本文链接: https://www.lsjlt.com/news/280210.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • Python中如何用XGBoost和scikit-learn进行随机梯度增强
    这篇文章将为大家详细讲解有关Python中如何用XGBoost和scikit-learn进行随机梯度增强,文章内容质量较高,因此小编分享给大家做个参考,希望大家阅读完这篇文章后对相关知识有一定的了解。集成决策树的一种简单技术涉及在训练数据集...
    99+
    2023-06-15
  • 如何使用SMOD和CMOD进行SD的用户增强
    如何使用SMOD和CMOD进行SD的用户增强关于增强的简单介绍1 SMOD包含具体的增强,而CMOD是包含一组SMOD编写的增强.  2 User exits (Function module exits)是sap提供出口,它的命...
    99+
    2023-06-05
  • 如何在Fedora中使用SELinux进行安全增强
    在Fedora中使用SELinux进行安全增强可以通过以下步骤实现: 确保SELinux已启用:在Fedora中,默认情况下SEL...
    99+
    2024-04-02
  • 如何在PHP中进行虚拟现实和增强现实?
    随着虚拟现实(VR)和增强现实(AR)技术的不断发展,越来越多的开发者开始探究在Web开发中如何运用这些技术。PHP 作为一种常用的 Web 开发语言,也在逐渐发展它的 VR 和 AR 工具包,这极大地丰富了 PHP 在构建高交互性、高体验...
    99+
    2023-05-21
    虚拟现实 PHP编程 增强现实
  • 如何用XGBoost在Python 中进行特征重要性分析和特征选择
    如何用XGBoost在Python 中进行特征重要性分析和特征选择,很多新手对此不是很清楚,为了帮助大家解决这个难题,下面小编将为大家详细讲解,有这方面需求的人可以来学习下,希望你能有所收获。使用诸如梯度增强之类的决策树方法的集成的好处是,...
    99+
    2023-06-15
  • 如何在 Golang 中使用随机数进行模拟?
    使用 math/rand 包进行随机数模拟:导入 math/rand 包。使用 time.now().unixnano() 初始化随机数生成器。使用 rand.intn(n) 生成 0 ...
    99+
    2024-05-13
    模拟 随机数 golang
  • PHP中如何进行深度强化学习和自然语言翻译?
    在现代技术的发展中,深度强化学习和自然语言翻译是两个最具代表性的应用领域。而PHP,作为一门简单易学的编程语言,也能够参与到这两个领域中来,为AI技术的广泛应用提供更多的可能性。一、深度强化学习深度强化学习是人工智能领域中的一个热门研究方向...
    99+
    2023-05-22
    深度强化学习 PHP 自然语言翻译
  • 如何进行python中pyautogui的安装和使用
    本篇文章给大家分享的是有关如何进行python中pyautogui的安装和使用,小编觉得挺实用的,因此分享给大家学习,希望大家阅读完这篇文章后可以有所收获,话不多说,跟着小编一起来看看吧。前言以下是我对python中编写脚本最重要的库之一p...
    99+
    2023-06-22
  • 如何使用Python在Linux中进行脚本编写和执行
    如何使用Python在Linux中进行脚本编写和执行在Linux操作系统中,我们可以使用Python编写并执行各种脚本。Python是一种简洁而强大的编程语言,它提供了丰富的库和工具,使得脚本编写变得更加简单和高效。下面我们将介绍在Linu...
    99+
    2023-10-22
    linux脚本 执行 Python编程
  • PHP中如何进行无人机数据处理和应用?
    PHP中如何进行无人机数据处理和应用?随着无人机技术的快速发展和普及,无人机在各行各业中的应用也越来越广泛。无人机可以进行各种类型的数据采集,包括视频、图像、声音、气象等,产生的数据量也越来越大。在数据处理和应用方面,PHP编程语言作为一种...
    99+
    2023-05-24
    PHP 无人机 数据处理
  • 如何在Python中使用numpy和django进行数据处理?
    Python是一种面向对象的编程语言,广泛用于数据处理、科学计算和Web开发等领域。其中,numpy和django是Python中非常流行的两个库,分别用于数值计算和Web开发。在本文中,我们将介绍如何在Python中使用numpy和dja...
    99+
    2023-11-01
    numpy django numy
  • PHP中如何进行打印机和扫描仪应用开发?
    随着信息技术的不断发展,打印机和扫描仪已经成为了现代商务与生活中不可缺少的设备之一。而为了更好地满足用户的需求,开发一款能够优化打印和扫描操作的应用程序,也成为了每个开发者都想要实现的目标。本文将介绍如何在 PHP 中进行打印机和扫描仪应用...
    99+
    2023-05-14
    PHP 打印机应用开发 扫描仪应用开发
  • 如何在Python中利用机器学习算法进行数据挖掘和预测
    如何在Python中利用机器学习算法进行数据挖掘和预测引言随着大数据时代的到来,数据挖掘和预测成为了数据科学研究的重要组成部分。而Python作为一种简洁优雅的编程语言,拥有强大的数据处理和机器学习库,成为了数据挖掘和预测的首选工具。本文将...
    99+
    2023-10-22
    机器学习 预测 Python 数据挖掘
  • python如何使用sample()函数从指定序列中随机获取指定长度的片段
    这篇文章给大家分享的是有关python如何使用sample()函数从指定序列中随机获取指定长度的片段的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。sample(sequence,k)从指定序列中随机获取指定长度的...
    99+
    2023-06-08
  • 如何在Python和Spring中使用NumPy接口进行数据处理?
    Python和Spring是两个非常流行的编程语言和框架,它们在数据处理方面都有很强大的功能。而使用NumPy接口可以进一步增强数据处理的能力。本文将介绍如何在Python和Spring中使用NumPy接口进行数据处理。 一、Python中...
    99+
    2023-10-20
    spring numy 接口
  • 如何使用Python和NPM在Unix中进行自然语言处理?
    自然语言处理(NLP)是一种计算机科学和人工智能的领域,它涉及了计算机如何与自然语言进行交互和处理。Python和NPM是两个非常流行的工具,它们可以被用来进行自然语言处理。在本文中,我们将探讨如何使用Python和NPM在Unix系统中...
    99+
    2023-10-01
    unix npm 自然语言处理
  • LINUX中如何利用远程管理命令进行关机和重启
    这篇文章给大家分享的是有关LINUX中如何利用远程管理命令进行关机和重启的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。方法如下打开LINUX,这里用UBUNTU操作系统,打开左边的终端窗口。直接输入shutdow...
    99+
    2023-06-13
  • 如何在Java中使用Numpy进行图像处理和计算机视觉?
    Java是一种广泛使用的编程语言,用于开发各种类型的应用程序,包括图像处理和计算机视觉应用程序。Numpy是一个广泛使用的Python库,用于数值计算和科学计算。虽然Java和Python之间存在一些差异,但Java开发人员可以使用Num...
    99+
    2023-06-14
    http numpy 索引
  • 如何使用Python中的pickle和JSON进行对象序列化和反序列化
    如何使用Python中的pickle和JSON进行对象序列化和反序列化Python是一种简单而强大的编程语言,其内置了许多有用的库和模块,使开发人员能够快速进行各种任务。其中,pickle和JSON是两个常用的模块,用于对象序列化和反序列化...
    99+
    2023-10-22
    序列化 JSON pickle
  • 如何在Python中使用数组容器对象进行机器学习任务?
    Python作为一种高级编程语言,其功能强大,灵活多变,被广泛应用于机器学习领域。在机器学习任务中,数组容器对象是经常被使用的工具。本文将介绍如何在Python中使用数组容器对象进行机器学习任务,并提供一些实用的代码示例。 一、NumPy数...
    99+
    2023-08-20
    数组 容器 对象
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作