网站推广应该怎么做无锡网站制作.
网站推广应该怎么做,无锡网站制作.,怎么拿到百度推广的代理,成都企业展厅设计成都企业展厅设计公司目录 1 背景
2 原理
2.1 类别特征处理
2.1.1 传统目标编码#xff1a; TS
2.1.2 Greedy TS
2.1.3 ordered TS编码
2.1.4 CatBoost处理Categorical features总结
2.2.预测偏移处理
2.2.1 梯度无偏估计
2.3 树的构建
3 优缺点
优点
4 代码 1 背景 终于到了CatBoost&…目录1 背景2 原理2.1 类别特征处理2.1.1 传统目标编码 TS2.1.2 Greedy TS2.1.3 ordered TS编码2.1.4 CatBoost处理Categorical features总结2.2.预测偏移处理2.2.1 梯度无偏估计2.3 树的构建3 优缺点优点4 代码1 背景终于到了CatBoost这个模型我在打比赛的时候相对于lightGBM用的少一些但是我一般都会进行尝试尤其是类别型特征很多的时候。曾依赖这个模型单模干到了top8那时候还不懂的继承的优雅。我们开始这个模型介绍吧。CatBoost是一种基于对称决策树oblivious trees为基学习器实现的参数较少、支持类别型变量和高准确性的GBDT框架主要解决的痛点是高效合理地处理类别型特征这一点从它的名字中可以看出来CatBoost是由Categorical和Boosting组成。此外CatBoost还解决了梯度偏差Gradient Bias以及预测偏移Prediction shift的问题从而减少过拟合的发生进而提高算法的准确性和泛化能力。上面做了一个概述那么黑体的名字如何理解呢另外与其提升算法不同CatBoost使用对称全二叉树这种树的特点是每一层使用相同的分割特征。这样一来树是更简单的结构我们也就避免了过度拟合的危险。此外由于我们的基础模型结构简单我们有更快的预测器。2 原理2.1 类别特征处理CatBoost算法的设计初衷是为了更好的处理GBDT特征中的categorical features比如性别【男女】。在处理 GBDT特征中的categorical features的时候最简单的方法是用 categorical feature 对应的标签的平均值来替换target encoding 这个在比赛中我也是常用,但是存在问题。在决策树中标签平均值将作为节点分裂的标准。这种方法被称为 Greedy Target-based Statistics , 简称 Greedy TS2.1.1 传统目标编码 TS用公式来表达就是 groupby(cat)[label].mean()TS编码有一个缺点极端情况下当训练集中某类取值只有一个样本、或者没有样本时计算的编码值就失真了也就是容易受噪声数据影响。如果强行用标签的平均值来表示特征的话当训练数据集和测试数据集数据结构和分布不一样的时候会出条件偏移问题。2.1.2 Greedy TS一个标准的改进 TS的方式是添加先验分布项这样可以减少噪声和低频率类别型数据对于数据分布的影响直接上公式其中p是添加的先验项a通常是大于0的权重系数。添加先验项是一个普遍做法针对类别数较少的特征它可以减少噪声数据。对于回归问题一般情况下先验项可取数据集label的均值。对于二分类先验项是正例的先验概率。Greedy TS编码也存在一个问题即目标泄露。也需要训练预测集合数据分布一致2.1.3 ordered TS编码它是catboost的主要思想依赖于排序受online learning algorithms的启发得到对于某一个样本TS的值依赖于观测历史【时间序列的思想】为了在离线的数据上应用该思想我们将数据随机排序对于每一个样本利用该样本之前数据计算该样本类别值的TS值。如果仅仅使用一个随机序列那么计算得到值会有较大的方差因此我们使用不同的随机序列来计算。在某种排序状态 下样本在分类特征 下的值为的ordered TS编码值是基于排在其前面的样本计算的在中计算分类特征 下取值与相同的样本的Greedy TS编码值该值即为的ordered TS编码值。举例说明在上图中经过样本排序后样本的排序情况为{4,3,7,2,6,1,5}计算样本4的ordered TS编码值时由于没有样本排在其前面因此其ordered TS编码值计算方式为计算样本6的ordered TS编码值时排在其前面的样本为{4,3,7,2}在这4个样本中特征取值为D的只有样本4因此其ordered TS编码值计算方式为:2.1.4 CatBoost处理Categorical features总结首先会计算一些数据的statistics。计算某个category出现的频率加上超参数生成新的numerical features。这一策略要求同一标签数据不能排列在一起即先全是之后全是这种方式训练之前需要打乱数据集。第二使用数据的不同排列。在每一轮建立树之前先扔一轮骰子决定使用哪个排列来生成树。第三考虑使用categorical features的不同组合。例如颜色和种类组合起来可以构成类似于blue dog这样的特征。当需要组合的categorical features变多时CatBoost只考虑一部分combinations。在选择第一个节点时只考虑选择一个特征例如A。在生成第二个节点时考虑A和任意一个categorical feature的组合选择其中最好的。就这样使用贪心算法生成combinations。第四除非向gender这种维数很小的情况不建议自己生成One-hot编码向量最好交给算法来处理。2.2.预测偏移处理在GBDT算法中每一棵树都是为了拟合前一棵树上的梯度构造树时所有的样本都参与了一个样本参与了建树然后又用这棵树去估计样本值这样的估计就不是无偏估计当测试集和训练集上的样本分布不一致时模型就会因过拟合而性能不佳即在测试集上产生了预测偏移。2.2.1 梯度无偏估计对于样本 ,如果用一个不包含它的模型去估计它的梯度估计结果可以视为无偏估计。基于这种思路CatBoost算法中采用了如下策略在每一轮迭代时将样本集排序然后训练 个模型 ,1,..., 为样本数量其中 是由前 个样本训练得到(基于本轮样本的排序包含样本)然后估计样本的梯度时使用模型−1 来估计因为−1是由不包含样本的样本训练得到因此该估计结果是无偏估计。这种方式尽管得到了无偏估计但是对于排序靠前的样本它的梯度估计结果可能并不太准确具有较大的方差因为估计它的模型是由较少的样本训练的而且是基于本轮迭代中的样本排序计算的为了减少预测方差CatBoost在每轮迭代中都会对样本进行重新排序然后按照相同的思路估计本轮中样本的梯度这样多轮迭代的最终结果就可以获取一个较小的方差。当然如果每轮迭代都要训练 个模型那是一个比较大的工作量CatBoost算法对这个过程做了些简化来提升训练速度详情后面分析树的创建过程时再说明。2.3 树的构建得到树结构也是节点分裂的过程。在GBDT、XGBoost、LightGBM等算法中节点分类时需要遍历所有候选特征及分裂阈值CatBoost算法也采用了这种策略但有两点不同分类型特征处理数值型特征的空值处理。在CatBoost算法中将空值全部转换为最小值(默认)或者最大值每一轮迭代都会创建 个模型也就是创建棵树在CatBoost算法中并不是棵树而是 [2] 这个只是为了减少计算量因此在阐述CatBoost算法的原理时仍然使用训练树是比较耗时的过程在整个模型训练的时间中占很大的比重如果每一轮都要重新训练棵树那将会非常耗时CatBoost算法在这点上做了调整具体做是:1 在第一轮迭代中在选定样本排序状态 下分别用前 个样本训练模型 , 也就是得到 棵树。一个树的训练过程包含两部分第一步得到树结构第二步计算叶子节点的值。第一步中得到的树结构也即是每一层选用什么分裂特征分裂阈值是多少2 得到模型,的树结构后CatBoost会使将该树结构复用到后续的所有迭代过程中。例如在第一轮迭代中由前100个样本训练得到了模型 ,100 的树结构后续的迭代过程中会直接使用该树结构然后将对应排序状态 ′ 下的前100个样本直接应用该树结构将样本划分到对应的叶子节点上得到完整的模型而不用再重新遍历样本的特征来寻找最佳划分特征和划分阈值。 那么在每一层中如何评判用哪种特征分裂最好呢CatBoost算法采用这样的策略基本本轮样本排序状态得到每一棵树上的样本首先依据前面迭代轮次的结果计算每个样本的梯度也就是得到根节点中每个样本的梯度向量 。遍历候选特征来分裂根节点得到多种分裂结果分别计算每个样本的叶子值增量 Δ() 其中 指第 个样本(这个增量值的含义原论文中也没有明确说明只是说是一个增量值这里也参照原文进行说明)Δ()的计算方式为在样本 所属的叶子节点上计算排在样本 前面的样本的梯度的平均值该平均值即为Δ()。这里要说明一下上面说的叶子节点是相对于上一层的节点来说的并不是整棵树的叶子节点这样就得到每个样本的增量值Δ()这些增量值可以组成一个向量 Δ采用余弦相似度方法计算各种候选特特征下节点分裂的损失 (,Δ) ,选择损失最小的方式来分裂树。余弦相似度的计算方式为其中 标识样本的权重这个权重是CatBoost算法中为每个样本随机赋予的起到样本抽样的效果目的是为了减少过拟合 标识样本在树上的输出值这里也就是Δ()值 即第一步中计算的样本的梯度值。3 优缺点优点性能卓越 在性能方面可以匹敌任何先进的机器学习算法鲁棒性/强健性 无需调参即可获得较高的模型质量采用默认参数就可以获得非常好的结果减少在调参上面花的时间,减少了对很多超参数调优的需求易于使用 提供与scikit集成的Python接口以及R和命令行界面实用 可以处理类别型、数值型特征支持类别型变量无需对非数值型特征进行预处理可扩展 支持自定义损失函数快速、可扩展的GPU版本可以用基于GPU的梯度提升算法实现来训练你的模型支持多卡并行提高准确性快速预测即便应对延时非常苛刻的任务也能够快速高效部署模型缺点对于类别型特征的处理需要大量的内存和时间不同随机数的设定对于模型预测结果有一定的影响4 代码import re import os import pandas as pd import numpy as np import warnings warnings.filterwarnings(ignore) import sklearn from sklearn.model_selection import train_test_split from sklearn.metrics import roc_curve,roc_auc_score import matplotlib.pyplot as plt import gc from bayes_opt import BayesianOptimization from catboost import Pool, cv n_fold 5 folds KFold(n_splitsn_fold, shuffleTrue, random_state1314) oof np.zeros(len(train_df)) prediction np.zeros(len(test_df)) for fold_n, (train_index, valid_index) in enumerate(folds.split(train_df)): X_train, X_valid train_df[features].iloc[train_index], train_df[features].iloc[valid_index] y_train, y_valid train_df[label].iloc[train_index], train_df[label].iloc[valid_index] cate_features[] # [corss_卧室_床的数量, corss_床的类型_床的数量, # corss_房产类型_卧室数量, corss_房产类型_洗手间数量] train_pool Pool(X_train, y_train, cat_featurescate_features) eval_pool Pool(X_valid, y_valid, cat_featurescate_features) cbt_model catboost.CatBoostRegressor(iterations600, # 注baseline 提到的分数是用 iterations60000 得到的但运行时间有点久 learning_rate0.1, # 注事实上好几个 property 在 lr0.1 时收敛巨慢。后面可以考虑调大 eval_metricmse, # n_estimators3000, # reg_lambda5, use_best_modelTrue, random_seed42, logging_levelVerbose, #task_typeGPU, devices0, gpu_ram_part0.5) cbt_model.fit(train_pool, eval_seteval_pool, verbose1000) y_pred_valid cbt_model.predict(X_valid) print(valid RMSE) print(print(np.sqrt(np.mean(np.square(y_pred_valid - train_df.loc[valid_index,label]))))) y_pred cbt_model.predict(test_df[features]) oof[valid_index] y_pred_valid.reshape(-1, ) prediction y_pred prediction / n_fold from sklearn.metrics import mean_squared_error score mean_squared_error(oof, train_df[label].values) print(score) #test[价格] prediction #test[[数据ID, 价格]].to_csv(./{}_sub_cat.csv.format(np.sqrt(score)), indexNone)ref:安全验证 - 知乎安全验证 - 知乎