带着爱和梦想去生活

7125messi的博客

last update:

原文来自:http://www.analyticsvidhya.com/blog/2015/06/tuning-random-forest-model/ 为什么要调整机器学习算法? 一个月以前,我在kaggle上参加了一个名为TFI的比赛。 我第一次提交的结果在50%。 我不懈努力在特征工程上花了超过2周的时间,勉强达到20%。 出乎我意料的事是,在调整机器学习算法参数之后,我能够达到前10%。 这就是机器学习算法参数调优的重要性。 随机森林是在工业界中使用的最简单的机器学习工具之一。 在我们以前的文章中,我们已经向您介绍了随机森林和和CART模型进行了对比 。 机器学习工具包正由于这些算法的表现而被人所熟知。 随机森林是什么? 随机森林是一个集成工具,它使用观测数据的子集(BootStraping)和特征变量的子集(随机选择特征变量)来建立一个决策树。 它建立多个这样的决策树,然后将他们合并在一起以获得更准确和稳定的预测。 这样做最直接的事实是,在这一组独立的预测结果中,用投票方式得到一个最高投票结果,这个比单独使用最好模型预测的结果要好。 我们通常将随机森林作为一个黑盒子,输入数据然后给出了预测结果,无需担心模型是如何计算的。这个黑盒子本身有几个我们可以摆弄的杠杆。 每个杠杆都能在一定程度上影响模型的性能或资源时间平衡。 在这篇文章中,我们将更多地讨论我们可以调整的杠杆,同时建立一个随机森林模型。 调整随机森林的参数杠杆 随机森林的参数即可以增加模型的预测能力,又可以使训练模型更加容易。 以下我们将更详细地谈论各个参数(请注意,这些参数,我使用的是Python常规的命名法): 1.使模型预测更好的特征 主要有3类特征可以被调整,以改善该模型的预测能力 A. max_features: 随机森林允许单个决策树使用特征的最大数量。 Python为最大特征数提供了多个可选项。 下面是其中的几个: Auto/None :简单地选取所有特征,每颗树都可以利用他们。这种情况下,每颗树都没有任何的限制。 sqrt :此选项是每颗子树可以利用总特征数的平方根个。 例如,如果变量(特征)的总数是100,所以每颗子树只能取其中的10个。“log2”是另一种相似类型的选项。 0.2:此选项允许每个随机森林的子树可以利用变量(特征)数的20%。如果想考察的特征x%的作用, 我们可以使用“0.X”的格式。 If “auto”, then max_features=sqrt(n_features). If “sqrt”, then max_features=sqrt(n_features) (same as “auto”). If “log2”, then max_features=log2(n_features). If None, then max_features=n_features. max_features如何影响性能和速度? 增加max_features一般能提高模型的性能,因为在每个节点上,我们有更多的选择可以考虑。 然而,这未必完全是对的,因为它 同时也降低了单个树的多样性 ,而这正是随机森林独特的优点。 但是,可以肯定,你通过增加max_features会降低算法的速度。 因此,你需要适当的平衡和选择最佳max_features。

GBDT调优详解

原文地址:Complete Guide to Parameter Tuning in Gradient Boosting (GBM) in Python by Aarshay Jain 1.前言 如果一直以来你只把GBM当作黑匣子,只知调用却不明就里,是时候来打开这个黑匣子一探究竟了! 不像bagging算法只能改善模型高方差(high variance)情况,Boosting算法对同时控制偏差(bias)和方差(variance)都有非常好的效果,而且更加高效。 如果你需要同时处理模型中的方差和偏差,认真理解这篇文章一定会对你大有帮助, 本文会用Python阐明GBM算法,更重要的是会介绍如何对GBM调参,而恰当的参数往往能令结果大不相同。 2.目录 Boosing是怎么工作的? 理解GBM模型中的参数 学会调参(附详例) 3.Boosting是如何工作的? Boosting可以将一系列弱学习因子(weak learners)相结合来提升总体模型的预测准确度。在任意时间t,根据t-1时刻得到的结果我们给当前结果赋予一个权重。之前正确预测的结果获得较小权重,错误分类的结果得到较大权重。回归问题的处理方法也是相似的。 让我们用图像帮助理解: 图一: 第一个弱学习因子的预测结果(从左至右) 一开始所有的点具有相同的权重(以点的尺寸表示)。 分类线正确地分类了两个正极和五个负极的点。 图二: 第二个弱学习因子的预测结果 在图一中被正确预测的点有较小的权重(尺寸较小),而被预测错误的点则有较大的权重。 这时候模型就会更加注重具有大权重的点的预测结果,即上一轮分类错误的点,现在这些点被正确归类了,但其他点中的一些点却归类错误。 对图3的输出结果的理解也是类似的。这个算法一直如此持续进行直到所有的学习模型根据它们的预测结果都被赋予了一个权重,这样我们就得到了一个总体上更为准确的预测模型。 现在你是否对Boosting更感兴趣了?不妨看看下面这些文章(主要讨论GBM): Learn Gradient Boosting Algorithm for better predictions (with codes in R) Quick Introduction to Boosting Algorithms in Machine Learning

原文地址:Complete Guide to Parameter Tuning in XGBoost by Aarshay Jain 1. 简介 如果你的预测模型表现得有些不尽如人意,那就用XGBoost吧。XGBoost算法现在已经成为很多数据工程师的重要武器。它是一种十分精致的算法,可以处理各种不规则的数据。 构造一个使用XGBoost的模型十分简单。但是,提高这个模型的表现就有些困难(至少我觉得十分纠结)。这个算法使用了好几个参数。所以为了提高模型的表现,参数的调整十分必要。在解决实际问题的时候,有些问题是很难回答的——你需要调整哪些参数?这些参数要调到什么值,才能达到理想的输出? 这篇文章最适合刚刚接触XGBoost的人阅读。在这篇文章中,我们会学到参数调优的技巧,以及XGboost相关的一些有用的知识。以及,我们会用Python在一个数据集上实践一下这个算法。 2. 你需要知道的 XGBoost(eXtreme Gradient Boosting)是Gradient Boosting算法的一个优化的版本。在前文章中,基于Python的Gradient Boosting算法参数调整完全指南,里面已经涵盖了Gradient Boosting算法的很多细节了。我强烈建议大家在读本篇文章之前,把那篇文章好好读一遍。它会帮助你对Boosting算法有一个宏观的理解,同时也会对GBM的参数调整有更好的体会。 3. 内容列表 1、XGBoost的优势 2、理解XGBoost的参数 3、调参示例 4. XGBoost的优势 XGBoost算法可以给预测模型带来能力的提升。当我对它的表现有更多了解的时候,当我对它的高准确率背后的原理有更多了解的时候,我发现它具有很多优势: 4.1 正则化 标准GBM的实现没有像XGBoost这样的正则化步骤。正则化对减少过拟合也是有帮助的。 实际上,XGBoost以正则化提升(regularized boosting)技术而闻名。 4.2 并行处理 XGBoost可以实现并行处理,相比GBM有了速度的飞跃。 不过,众所周知,Boosting算法是顺序处理的,它怎么可能并行呢?每一课树的构造都依赖于前一棵树,那具体是什么让我们能用多核处理器去构造一个树呢?我希望你理解了这句话的意思。如果你希望了解更多,点击这个链接。(构造决策树的结构时,样本分割点位置,可以使用并行计算) XGBoost 也支持Hadoop实现。 4.3 高度的灵活性 XGBoost 允许用户定义自定义优化目标函数和评价标准 它对模型增加了一个全新的维度,所以我们的处理不会受到任何限制。 4.4 缺失值处理 XGBoost内置处理缺失值的规则。 用户需要提供一个和其它样本不同的值,然后把它作为一个参数传进去,以此来作为缺失值的取值。XGBoost在不同节点遇到缺失值时采用不同的处理方法,并且会学习未来遇到缺失值时的处理方法。

LightGBM学习

[参考整理] 1 LightGBM原理 1.1 GBDT和 LightGBM对比 GBDT (Gradient Boosting Decision Tree) 是机器学习中一个长盛不衰的模型,其主要思想是利用弱分类器(决策树)迭代训练以得到最优模型,该模型具有训练效果好、不易过拟合等优点。GBDT 在工业界应用广泛,通常被用于点击率预测,搜索排序等任务。GBDT 也是各种数据挖掘竞赛的致命武器,据统计 Kaggle 上的比赛有一半以上的冠军方案都是基于 GBDT。 LightGBM(Light Gradient Boosting Machine)同样是一款基于决策树算法的分布式梯度提升框架。为了满足工业界缩短模型计算时间的需求,LightGBM的设计思路主要是两点: 减小数据对内存的使用,保证单个机器在不牺牲速度的情况下,尽可能地用上更多的数据; 减小通信的代价,提升多机并行时的效率,实现在计算上的线性加速。 由此可见,LightGBM的设计初衷就是提供一个快速高效、低内存占用、高准确度、支持并行和大规模数据处理的数据科学工具。 XGBoost和LightGBM都是基于决策树提升(Tree Boosting)的工具,都拥有对输入要求不敏感、计算复杂度不高和效果好的特点,适合在工业界中进行大量的应用。 主页地址:http://lightgbm.apachecn.org LightGBM (Light Gradient Boosting Machine)是一个实现 GBDT 算法的框架,支持高效率的并行训练,并且具有以下优点: 更快的训练速度 更低的内存消耗 更好的准确率 分布式支持,可以快速处理海量数据 如下图,在 Higgs 数据集上 LightGBM 比 XGBoost 快将近 10 倍,内存占用率大约为 XGBoost 的1/6,并且准确率也有提升。 1.2 LightGBM 的动机 常用的机器学习算法,例如神经网络等算法,都可以以 mini-batch 的方式训练,训练数据的大小不会受到内存限制。 而 GBDT 在每一次迭代的时候,都需要遍历整个训练数据多次。如果把整个训练数据装进内存则会限制训练数据的大小;如果不装进内存,反复地读写训练数据又会消耗非常大的时间。尤其面对工业级海量的数据,普通的 GBDT 算法是不能满足其需求的。 LightGBM 提出的主要原因就是为了解决 GBDT 在海量数据遇到的问题,让 GBDT 可以更好更快地用于工业实践。

[参考总结提炼] 数据和特征决定了机器学习的上限,而模型和算法只是逼近这个上限而已。由此可见,特征工程在机器学习中占有相当重要的地位。在实际应用当中,可以说特征工程是机器学习成功的关键。 那特征工程是什么? 特征工程是利用数据领域的相关知识来创建能够使机器学习算法达到最佳性能的特征的过程。 特征工程又包含了Feature Selection(特征选择)、Feature Extraction(特征提取)和Feature construction(特征构造)等子问题,本文主要讨论特征选择相关的方法及实现。在实际项目中,我们可能会有大量的特征可使用,有的特征携带的信息丰富,有的特征携带的信息有重叠,有的特征则属于无关特征,如果所有特征不经筛选地全部作为训练特征,经常会出现维度灾难问题,甚至会降低模型的准确性。因此,我们需要进行特征筛选,排除无效/冗余的特征,把有用的特征挑选出来作为模型的训练数据。 01 特征选择介绍 1.特征按重要性分类 相关特征: 对于学习任务(例如分类问题)有帮助,可以提升学习算法的效果; 无关特征: 对于我们的算法没有任何帮助,不会给算法的效果带来任何提升; 冗余特征: 不会对我们的算法带来新的信息,或者这种特征的信息可以由其他的特征推断出; 2.特征选择的目的 对于一个特定的学习算法来说,哪一个特征是有效的是未知的。因此,需要从所有特征中选择出对于学习算法有益的相关特征。而且在实际应用中,经常会出现维度灾难问题。如果只选择所有特征中的部分特征构建模型,那么可以大大减少学习算法的运行时间,也可以增加模型的可解释性。 3.特征选择的原则 获取尽可能小的特征子集,不显著降低分类精度、不影响分类分布以及特征子集应具有稳定、适应性强等特点。 02 特征选择的方法 1.Filter方法(过滤式) 先进行特征选择,然后去训练学习器,所以特征选择的过程与学习器无关。相当于先对特征进行过滤操作,然后用特征子集来训练分类器。 主要思想:对每一维特征“打分”,即给每一维的特征赋予权重,这样的权重就代表着该特征的重要性,然后依据权重排序。 主要方法: Chi-squared test(卡方检验) Information gain(信息增益) Correlation coefficient scores(相关系数) 优点:运行速度快,是一种非常流行的特征选择方法。 缺点:无法提供反馈,特征选择的标准规范的制定是在特征搜索算法中完成,学习算法无法向特征搜索算法传递对特征的需求。另外,可能处理某个特征时由于任意原因表示该特征不重要,但是该特征与其他特征结合起来则可能变得很重要。 2.Wrapper方法(封装式) 直接把最后要使用的分类器作为特征选择的评价函数,对于特定的分类器选择最优的特征子集。 主要思想:将子集的选择看作是一个搜索寻优问题,生成不同的组合,对组合进行评价,再与其他的组合进行比较。这样就将子集的选择看作是一个优化问题,这里有很多的优化算法可以解决,尤其是一些启发式的优化算法,如GA、PSO(如:优化算法-粒子群算法)、DE、ABC(如:优化算法-人工蜂群算法)等。 主要方法:递归特征消除算法。 优点:对特征进行搜索时围绕学习算法展开的,对特征选择的标准规范是在学习算法的需求中展开的,能够考虑学习算法所属的任意学习偏差,从而确定最佳子特征,真正关注的是学习问题本身。由于每次尝试针对特定子集时必须运行学习算法,所以能够关注到学习算法的学习偏差/归纳偏差,因此封装能够发挥巨大的作用。 缺点:运行速度远慢于过滤算法,实际应用用封装方法没有过滤方法流行。 3.Embedded方法(嵌入式) 将特征选择嵌入到模型训练当中,其训练可能是相同的模型,但是特征选择完成后,还能给予特征选择完成的特征和模型训练出的超参数,再次训练优化。 主要思想:在模型既定的情况下学习出对提高模型准确性最好的特征。也就是在确定模型的过程中,挑选出那些对模型的训练有重要意义的特征。 主要方法:用带有L1正则化的项完成特征选择(也可以结合L2惩罚项来优化)、随机森林平均不纯度减少法/平均精确度减少法。 优点:对特征进行搜索时围绕学习算法展开的,能够考虑学习算法所属的任意学习偏差。训练模型的次数小于Wrapper方法,比较节省时间。 缺点:运行速度慢。 03 特征选择实现方法一:去掉取值变化小的特征 (Removing features with low variance) 该方法一般用在特征选择前作为一个预处理的工作,即先去掉取值变化小的特征,然后再使用其他特征选择方法选择特征。 考察某个特征下,样本的方差值,可以认为给定一个阈值,抛弃哪些小于某个阈值的特征。

[原创] 常见的处理非线性关系的方法有数据转换方法和神经转换、SVM、投影寻踪和基于树的方法等高计算强度方法。实际在应用回归问题有很大的局限性,模型的可解释性差。使用非参数和半参数回归方法来处理非线性关系一定程度可避免这些问题。 从数据本身出发来估计适合数据本身的函数形式。 1.忽略非线性的后果 对模型所有的连续自变量都进行检验来判断是否具有非线性作用(xy),通过数据变换解决非线性问题。 2.数据变换 幂转换:仅能够对正数取值的变量才能使用。所以才使用非参数和半参数回归方法。 3.非参数和半参数回归方法 从数据本身出发来估计适合数据本身的函数形式。用局部估计取代全局估计。 非参数回归的局部估计是通过数据估计两个变量之间的函数形式,而全局估计通过假设来对函数形式作出规定。 半参数回归模型:利用多元模型把全局估计和局部估计结合起来。 半参数回归模型:广义可加模型(GAM)(特殊:加性模型)。 GAM指自变量为离散或连续变量的半参数回归模型,可对自变量做非参数估计,对一些自变量采取标准的方式估计。 GAM中怀疑具有非线性函数形式的连续自变量可以用非参数估计,而模型中其他变量仍以参数形式估计。 GAM依赖非参数回归,X与Y之间的全局拟合被局部拟合取代,放弃了全部拟合的假设,仍保留了加性的假设。 GAM的加性假设使得模型比神经网络、支持向量机等更容易解释,比完全的参数模型更灵活。 GAM可以适用于许多类型的因变量:连续的、计数的、二分类的,定序的和时间等等。 GAM提供了诊断非线性的框架,简单线性模型和幂转换模型是嵌套在GAM中。 GAM的局部估计可以使用F检验或似然比检验来检验线性,二次项或任何其他幂转换模型的拟合效果。如果半参数回归模型优于线性模型或幂转换模型,它就应该被采用。 半参数回归模型的检验非线性和模型比较作用给予了半参数回归模型的强大功能,对于任意的连续自变量,都应采用半参数方法进行诊断或建模。 1 非参数估计 参数回归与非参数回归的优缺点比较 > 参数模型 > > 优点: > (1)模型形式简单明确,仅由一些参数表达 > (2)在经济中,模型的参数具有一般都具有明确的经济含义 > (3)当模型参数假设成立,统计推断的精度较高,能经受实际检验 > (4)模型能够进行外推运算 > (5)模型可以用于小样本的统计推断 > > 缺点: > (1)回归函数的形式预先假定 > (2)模型限制较多:一般要求样本满足某种分布要求,随机误差满足正态假设,解释变量间独立,解释变量与随机误差不相关等 > (3)需要对模型的参数进行严格的检验推断,步骤较多 > (4)模型泛化能力弱,缺乏稳健性,当模型假设不成立,拟合效果不好,需要修正或者甚至更换模型 > > 非参数模型 > > 优点: > > (1)**回归函数形式自由,受约束少,对数据的分布一般不做任何要求** > (2)**适应能力强,稳健性高,回归模型完全由数据驱动** > (3)**模型的精度高 ;** > (4)**对于非线性、非齐次问题,有非常好的效果** 使用非参数回归时,利用数据来估计F的函数形式。 事先的线性假设被更弱的假设光滑总体函数所代替。这个更弱的假设的代价是两方面的: * 第一,计算方面的代价是巨大的,但考虑到现代计算技术的速度,这不再是大问题; * 第二,失去了一些可解释性,但同时也得到了一个更具代表性的估计。

[参考整理] 具体可以参考我的Google云盘 https://drive.google.com/drive/folders/1cRk1d592TY3IywA6I4hWthks0QTDeTRh 下面简要介绍一下功能介绍 Introduction: Feature Selector Usage 在这个笔记本中,我们将使用FeatureSelector类来选择要从数据集中删除的要素。 此类有五种方法可用于查找要删除的功能: 具有高missing-values百分比的特征 具有高相关性的特征 对模型预测结果无贡献的特征(即zero importance) 对模型预测结果只有很小贡献的特征(即low importance) 具有单个值的特征(即数据集中该特征取值的集合只有一个元素) requirements: lightgbm==2.1.1 matplotlib==2.1.2 seaborn==0.8.1 numpy==1.14.5 pandas==0.23.1 scikit-learn==0.19.1 from feature_selector.selector import FeatureSelector import pandas as pd Example Dataset 该数据集被用作[Kaggle的[Home Credit Default Risk Competition]竞赛的一部分(https://www.kaggle.com/c/home-credit-default-risk/)。 它适用于受监督的机器学习分类任务,其目标是预测客户是否违约贷款。 整个数据集可以[这里]下载,我们将使用10,000行的小样本。 特征选择器设计用于机器学习任务,但可以应用于任何数据集。基于特征重要性的方法确实需要受监督的机器学习问题。 train = pd.read_csv('../data/credit_example.csv') train_labels = train['TARGET'] train.head() 数据集中有几个分类列。 使用基于特征重要性的方法时,FeatureSelector使用独热编码处理这些。 train = train.drop(columns = ['TARGET']) train.head() Implementation FeatureSelector有五个函数用于识别要删除的列: identify_missing identify_single_unique identify_collinear identify_zero_importance identify_low_importance 这些方法根据指定的标准查找要删除的功能。 标识的特征存储在FeatureSelector的ops属性(Python字典)中。 我们可以手动删除已识别的功能,或使用FeatureSelector中的remove功能来实际删除功能。

[原创] 最近在github看到了一个项目: https://github.com/dbiir/UER-py 貌似是腾讯出品,良心之作,特地去Colab撸了一下,确实可以,封装了很多模块,后续估计还要迭代,直至打成包就更好了。 有兴趣的同学可以去我的Colab上,玩一下。 https://colab.research.google.com/drive/1N81AYxPolDWPMdbZpYO1NnfV4T403Bxz

[原创] 1 利用手机信令数据计算人口流动数据 手机信令数据是研究人口的整体流动情况的重要数据来源。移动运营商在为手机用户提供实时通讯服务时,积累了大量的基站与设备的服务配对数据。根据配对和唤醒发生的时间以及基站的地理位置,可以很自然划定一定时间和空间范围,统计每一个时间范围内在特定空间区域内手机设备的停留,进入和离开数据,并据此估算相应的人流数据。 传统的人口网格分析过程一般只关注单个网格内某个时间点人口流动的截面数据以及城市当中不同区域的人口分布统计情况;没有将时间和空间融合考虑,不能对城市整体的人口流动形成一个完整连续的直观描述。但是,作为城市安全运营管理者和规划人员职责是需要把握好城市人口流动规律,建立有效的时空数据分析模型,从而为城市安全运行管理做好相应的人口短时预测与应急管理服务。 2 人口流动数据网格图像流处理 2.1 流处理思路 原始手机信令数据,按照一定的时间间隔(例如15分钟),划分出每个时间段的信令数据情况。主要包括:时间,格网ID,格网中心点经度,格网中心点维度,时间段内格网的停留人数,进入人数,离开人数。 根据原始数据的时空关系,将原始数据转化为4维向量空间矩阵,维度分别为时间维度、空间维度横坐标,空间维度纵坐标以及停留,进入或离开的类别:Matrix[t,i,j,k]=p意味着在t时刻,第i行第j列的空间栅格位置,k=0时则停留人数为p,k=1时则进入人数为p,k=2时则离开人数为p。 在这样的转换关系下,可以将源数据处理为3通道的时空数据。考虑到单个人员流动的时空连续性,可以认为表示人口流通的整体统计量的时空矩阵也具备一定局部关联性,换而言之,一个栅格点的人口流动数据会与该栅格附近的人口流行数据相互关联,也会与前后时间段该栅格的人口流动数据相互关联。而具体的关联形式和影响强度,则需要我们利用卷积神经,对历史数据进行学习来发现和记录相应的关联关系。 更进一步地,通过数据洞察注意到,不同栅格网络间人口流动的时间变化曲线往往倾向于若干种固定模式,直观上,商业区,住宅区,办公区域会呈现出不同的人流曲线变化模式。这种模式与地理位置,用地规划,交通路网信息等属性息息相关。本模型后续将进一步讨论不同用地类型的栅格人口流动模式的比较分析。 TIME TAZID STAY ENTER EXIT 2017-04-05 00:00:00 1009897 460 460 52 2.2 人口栅格数据矢量化 基于一定的空间距离间隔(例如250m),将分析的目标空间划分为若干网格(141*137)。统计T时间内,属于网格M_(p,q)的手机设备停留、进入和离开的数据。按照业务需求,将手机设备数扩样为人口数量,将停留、进入和离开的数据标准化到(0,255)的空间,并将标准化后的数据作为图像的3个颜色通道,据此将T时间的整体网格数据转化为一张三通道格式的图片数据。按照时间维度将经过上述处理的图像作为视频的每一帧图像。 import pandas as pd import numpy as np import h5py # 数据转换成张量类型 data_enter_exit_sz = pd.read_csv('data/sz/data/TBL_ENTER_EXIT_SZ20170401-20170431.csv') time_list = data_enter_exit_sz['TIME'].unique() N = len(time_list) string_to_ix = {string:i for i,string in enumerate(time_list)} tensor_data = np.zeros([N,141,137,3]) for _,line in data_enter_exit_sz.

[原创] 欢迎浏览我的Google云盘 https://drive.google.com/drive/folders/1XHvA5hoMNfBmfvFllD9-KUYY58KjB4v4?usp=sharing