精华内容
下载资源
问答
  • 1、xgboost库的安装比如我是Python3.6,64位操作系统,所以要安装xgboost-0.72-cp36-cp36m-win_amd64.whl。然后将它放到conda文件夹下,用anaconda prompt切换到该路径下,使用pip installxgboost-0.72-cp36-cp36m-...

    1、xgboost库的安装

    比如我是Python3.6,64位操作系统,所以要安装xgboost-0.72-cp36-cp36m-win_amd64.whl。

    然后将它放到conda文件夹下,用anaconda prompt切换到该路径下,使用pip install xgboost-0.72-cp36-cp36m-win_amd64.whl安装文件就可以了。

    be1c3d57e8f6f616ec08160692b88319.png

    2、原理说明

    说明:监督学习与非监督学习

    监督学习是根据带标签的数据进行数据学习。所谓监督学习,就是两步,一是定出模型确定参数,二是根据训练数据找出最佳的参数值,所谓最佳,从应用角度看,就是最大程度地吸收了10万条训练数据中的知识。

    如何寻找最佳参数?

    确定目标函数,根据目标函数的值确定预测模型的好坏,但是存在的问题是:1)预测样本中有错误值;2)样本中可能含有极端值。比如说我们对60岁以上年纪的人的数据预测模型去预测6岁孩子的数据,结果自然是不具有参考性的。那么,如何使得参数最优呢?

    那就是正则化。

    所谓正则化就是对参数施加一定的控制,防止参数走向极端。以上面的例子来说,假如10万条数据中,得癌症的病人都是60岁以上老人,没得癌症的病人都是30岁以下年轻人,检查结果中有一项是骨质密度,通常,老人骨质密度低,年轻人骨质密度高。那么我们学习到的模型很可能是这样的,对骨质密度这项对应的参数θ_j设的非常大,其他的参数都非常小,简单讲,模型倾向于就用这一项检查结果去判断病人是否得癌症,因为这样会让目标函数最小。

    常用的正则化就是L2正则,也就是所有参数的平方和。我们希望这个和尽可能小的同时,模型对训练数据有尽可能好的预测。

    最后,我们将L2正则项加到最初的目标函数上,就得出了最终的目标函数:

    obj = ∑_i(sigmoid(∑_j θ_j*x_ij) - y_i)^2 + ∑_j(θ_j^2)

    能使这个函数值最小的那组参数就是我们要找的最佳参数。这个obj包含的两项分别称为损失函数和正则项。

    这里的正则项,本质上是用来控制模型的复杂度。

    Xgboost就是一个监督模型,可以用于分类和回归,其结构就是一堆CART树,即将每棵树的预测值加到一起作为最终的预测值,可谓简单粗暴。

    CART树与决策树的区别:CART可以用于分类和回归。https://blog.csdn.net/lzzdflg/article/details/78649925

    CART是在给定输入随机变量X条件下输出随机变量Y的条件概率分布,与ID3和C4.5的决策树所不同的是,ID3和C4.5生成的决策树可以是多叉的,每个节点下的叉树由该节点特征的取值种类而定,比如特征年龄分为(青年,中年,老年),那么改节点下可分为3叉。而CART为假设决策树为二叉树,内部结点特征取值为”是”和”否”。左分支取值为”是”,有分支取值为”否”。这样的决策树等价于递归地二分每一个特征,将输入空间划分为有限个单元,并在这些单元上预测概率分布,也就是在输入给定的条件下输出条件概率分布。

    通常目标函数包含两部分:训练误差和正则化

    obj(θ)=L(θ)+Ω(θ)obj(θ)=L(θ)+Ω(θ)

    其中L是损失函数,度量模型预测与真实值的误差。常用的损失函数:

    预测问题的平方损失函数:

    L(θ)=Σi(yi−yi^)2L(θ)=Σi(yi−yi^)2

    logistic 损失:

    L(θ)=Σi[yiln(1+e−yi^)+(1−yi)ln(1+eyi^)]L(θ)=Σi[yiln(1+e−yi^)+(1−yi)ln(1+eyi^)]

    ΩΩ是正则化项,度量模型的复杂度,避免过拟合,常用的正则化有L1 和L2正则化。

    假设有两颗回归树,则两棵树融合后的预测结果如上图。

    用公式表示为:

    yi^=ΣKk=1fk(xi),fk∈Fyi^=Σk=1Kfk(xi),fk∈F

    其中, K 是树的个数, fk(xi)fk(xi)是第k棵树对于输入xixi输出的得分,fkfk是相应函数,FF是相应函数空间。

    则目标函数为:

    obj(θ)=Σnil(yi,yi^)+ΣKk=1Ω(fk)obj(θ)=Σinl(yi,yi^)+Σk=1KΩ(fk)

    函数ll描述yiyi , yi^yi^之间的距离。

    常用的模型融合方法是Random Foreast和Boosting Tree,这两种方法构造树的方式不同。Tree Ensemble中,模型的参数是什么呢?其实就是指树的结构和叶子节点上面分数的预测。如何求参数?定义目标函数,通过优化目标函数进行求解。

    xgboost进一步理解

    传统GBDT以CART作为基分类器,xgboost还支持线性分类器,这个时候xgboost相当于带L1和L2正则化项的逻辑斯蒂回归(分类问题)或者线性回归(回归问题)。

    传统GBDT在优化时只用到一阶导数信息,xgboost则对代价函数进行了二阶泰勒展开,同时用到了一阶和二阶导数。顺便提一下,xgboost工具支持自定义代价函数,只要函数可一阶和二阶求导。

    xgboost在代价函数里加入了正则项,用于控制模型的复杂度。正则项里包含了树的叶子节点个数、每个叶子节点上输出的score的L2模的平方和。从Bias-variance tradeoff角度来讲,正则项降低了模型的variance,使学习出来的模型更加简单,防止过拟合,这也是xgboost优于传统GBDT的一个特性。

    Shrinkage(缩减),相当于学习速率(xgboost中的eta)。xgboost在进行完一次迭代后,会将叶子节点的权重乘上该系数,主要是为了削弱每棵树的影响,让后面有更大的学习空间。实际应用中,一般把eta设置得小一点,然后迭代次数设置得大一点。(补充:传统GBDT的实现也有学习速率)

    列抽样(column subsampling)。xgboost借鉴了随机森林的做法,支持列抽样,不仅能降低过拟合,还能减少计算,这也是xgboost异于传统gbdt的一个特性。

    对缺失值的处理。对于特征的值有缺失的样本,xgboost可以自动学习出它的分裂方向。XGBoost对于确实值能预先学习一个默认的分裂方向

    xgboost工具支持并行。boosting不是一种串行的结构吗?怎么并行的?注意xgboost的并行不是tree粒度的并行,xgboost也是一次迭代完才能进行下一次迭代的(第t次迭代的代价函数里包含了前面t-1次迭代的预测值)。xgboost的并行是在特征粒度上的。我们知道,决策树的学习最耗时的一个步骤就是对特征的值进行排序(因为要确定最佳分割点),xgboost在训练之前,预先对数据进行了排序,然后保存为block结构,后面的迭代中重复地使用这个结构,大大减小计算量。这个block结构也使得并行成为了可能,在进行节点的分裂时,需要计算每个特征的增益,最终选增益最大的那个特征去做分裂,那么各个特征的增益计算就可以开多线程进行。

    我:

    可并行的近似直方图算法。树节点在进行分裂时,我们需要计算每个特征的每个分割点对应的增益,即用贪心法枚举所有可能的分割点。当数据无法一次载入内存或者在分布式情况下,贪心算法效率就会变得很低,所以xgboost还提出了一种可并行的近似直方图算法,用于高效地生成候选的分割点。

    展开全文
  • 我有下面的问题(我在MAC上)我可以用我的终端从python2.7或python3.6导入xgboost,但问题是我无法在我的Jupyter笔记本上导入它 .import xgboost as xgbModuleNotFoundError Traceback(最近一次调用last)in()---->...

    我有下面的问题(我在MAC上)

    我可以用我的终端从python2.7或python3.6导入xgboost,但问题是我无法在我的Jupyter笔记本上导入它 .

    import xgboost as xgb

    ModuleNotFoundError Traceback(最近一次调用last)in()----> 1将xgboost导入为xgb

    ModuleNotFoundError:没有名为'xgboost'的模块

    虽然我写道:

    !pip3 install xgboost

    它打印出:

    要求已经满足:xgboost in /Library/Frameworks/Python.framework/Versions/3.6/lib/python3.6/site-packages/xgboost-0.6-py3.6.egg要求已经满足:numpy in / Library / Frameworks / Python .framework / Versions / 3.6 / lib / python3.6 / site-packages(来自xgboost)要求已经满足:scipy in /Library/Frameworks/Python.framework/Versions/3.6/lib/python3.6/site-packages(from xgboost)

    请帮助我到处搜索:(

    展开全文
  • JAVA训练XGBOOST

    千次阅读 2020-01-02 00:37:22
    2020年开篇,但是好像没啥特别的,参加个公司年会,时间就这么过去了,就这么迎来了2020年。... 一直用python去训练模型,考虑用点不一样的技术,用java去训练一个模型吧,这样也方便和java微服务以及大数据集成在...

           2020年开篇,但是好像没啥特别的,参加个公司年会,时间就这么过去了,就这么迎来了2020年。当然,我们国家传统是过了春节才算是新年,所以原则上2020年还没来到,但是日历上已经变了,现在2020年1月1日,觉得还是要随便写点什么,记录点什么吧。

           一直用python去训练模型,考虑用点不一样的技术,用java去训练一个模型吧,这样也方便和java微服务以及大数据集成在一起了,让模型更好的服务于生产系统当中。其实java也提供了很多机器学习库的,像h20,Weka,Mahout等(虽然我都没用过),Tensorflow也提供了java的api。但是像我这样全技术栈的算法并不多(自吹一下),所以在具体工作配合时候难免会遇到技术栈切换的成本,当然作为工程师,掌握一门工程性比较强的语言也是还是有必要的,只是应用方向不同啦。

           xgboost也提供java的很好的实现,虽然可能不如python用起来顺手,毕竟numpy,pandas这些库天生就是为处理结构化数据而打造的。其实个人之前也分析过,numpy的效率其实很高,但是怎么集成到以java为主流的应用系统是个问题。

    •  创建maven项目

    需要三个jar包,jar包名如图所示。

    • 准备数据
    import numpy as np
    from sklearn.datasets import load_iris
    
    data = load_iris()['data']
    target = load_iris()['target']
    
    x_data = np.hstack((target.reshape(-1, 1), data))
    x_data = x_data [x_data [:, 0] <= 1]
    
    train_index = [i for i in np.random.randint(0, len(x_data), int(len(x_data) * 0.8))]
    test_index = list(set([i for i in range(len(x_data))]) - set(train_index))
    
    train = x_data[train_index]
    test = x_data[test_index]
    
    with open("src/main/resources/train.txt", "w") as f:
        for line in train:
            f.write(",".join([str(x) for x in line]) + "\n")
    
    with open("src/main/resources/test.txt", "w") as f:
        for line in test:
            f.write(",".join([str(x) for x in line]) + "\n")
    
    • 训练并保存模型
    import ml.dmlc.xgboost4j.java.Booster;
    import ml.dmlc.xgboost4j.java.DMatrix;
    import ml.dmlc.xgboost4j.java.XGBoost;
    import ml.dmlc.xgboost4j.java.XGBoostError;
    
    import java.util.HashMap;
    import java.util.Map;
    
    
    public class XgboostTrain {
    
        private static DMatrix trainMat = null;
        private static DMatrix testMat = null;
    
        public static void main(String [] args) throws XGBoostError {
    
            try {
                trainMat = new DMatrix("src/main/resources/train.txt");
            } catch (XGBoostError xgBoostError) {
                xgBoostError.printStackTrace();
            }
            try {
                testMat = new DMatrix("src/main/resources/test.txt");
            } catch (XGBoostError xgBoostError) {
                xgBoostError.printStackTrace();
            }
    
            Map<String, Object> params = new HashMap<String, Object>() {
                {
                    put("eta", 1.0);
                    put("max_depth", 3);
                    put("objective", "binary:logistic");
                    put("eval_metric", "logloss");
                }
            };
    
            Map<String, DMatrix> watches = new HashMap<String, DMatrix>() {
                {
                    put("train",trainMat);
                    put("test", testMat);
                }
            };
            int nround = 10;
            try {
                Booster booster = XGBoost.train(trainMat, params, nround, watches, null, null);
                booster.saveModel("src/main/resources/model.bin");
            } catch (XGBoostError xgBoostError) {
                xgBoostError.printStackTrace();
            }
        }
    
    }
    

    • 进行预测
    import ml.dmlc.xgboost4j.java.Booster;
    import ml.dmlc.xgboost4j.java.DMatrix;
    import ml.dmlc.xgboost4j.java.XGBoost;
    import ml.dmlc.xgboost4j.java.XGBoostError;
    
    public class XgboostPredict {
    
        public static void main(String [] args) throws XGBoostError {
            float[] data = new float[] {5.2f, 3.5f, 1.5f, 0.2f};
            int nrow = 1;
            int ncol = 4;
            float missing = 0.0f;
            DMatrix dmat = new DMatrix(data, nrow, ncol, missing);
            Booster booster = XGBoost.loadModel("src/main/resources/model.bin");
            float[][] predicts = booster.predict(dmat);
            for (float[] array: predicts){
                for (float values: array) {
                    System.out.print(values + " ");
                }
                System.out.println();
            }
        }
    
    }
    

           这样就简单的实现了,xgboost模型的训练和预测,其实直接使用xgboost模型可以直接免去复杂的特征工程操作,不太需要对特征再进行归一化和one-hot编码操作,这样的话,数据准备好,启动一个SpringBoot基于Java实现的模型服务就搭建起来了。

    展开全文
  • xgboost已经提供丰富的java接口,再通过pmml调用显得没多大的意义,java底层用的c++写的预测方法,超级快,不过还是记录下,直接看看python代码,数据还是鸾尾花数据:import pandas as pdfrom xgboost.sklearn ...

    xgboost已经提供丰富的java接口,再通过pmml调用显得没多大的意义,java底层用的c++写的预测方法,超级快,不过还是记录下,直接看看python代码,数据还是鸾尾花数据:

    import pandas as pd

    from xgboost.sklearn import XGBClassifier

    from sklearn2pmml import PMMLPipeline

    from sklearn_pandas import DataFrameMapper

    from sklearn2pmml import sklearn2pmml

    iris_df = pd.read_csv("xml/iris.csv")

    clf = XGBClassifier(

    silent=0 ,#设置成1则没有运行信息输出,最好是设置为0.是否在运行升级时打印消息。

    #nthread=4,# cpu 线程数 默认最大

    learning_rate= 0.3, # 如同学习率

    min_child_weight=1,

    # 这个参数默认是 1,是每个叶子里面 h 的和至少是多少,对正负样本不均衡时的 0-1 分类而言

    #,假设 h 在 0.01 附近,min_child_weight 为 1 意味着叶子节点中最少需要包含 100 个样本。

    #这个参数非常影响结果,控制叶子节点中二阶导的和的最小值,该参数值越小,越容易 overfitting。

    max_depth=6, # 构建树的深度,越大越容易过拟合

    gamma=0, # 树的叶子节点上作进一步分区所需的最小损失减少,越大越保守,一般0.1、0.2这样子。

    subsample=1, # 随机采样训练样本 训练实例的子采样比

    max_delta_step=0,#最大增量步长,我们允许每个树的权重估计。

    colsample_bytree=1, # 生成树时进行的列采样

    reg_lambda=1, # 控制模型复杂度的权重值的L2正则化项参数,参数越大,模型越不容易过拟合。

    objective= 'multi:softmax', #多分类的问题 指定学习任务和相应的学习目标

    n_estimators=100, #树的个数

    seed=1000

    )

    mapper = DataFrameMapper([

    (['sepal_length'], None),

    (['sepal_width'], None),

    (['petal_length'], None),

    (['petal_width'], None)

    ])

    pipeline = PMMLPipeline([('mapper', mapper), ("classifier", clf)])

    pipeline.fit(iris_df[iris_df.columns.difference(["species"])],iris_df["species"])

    sklearn2pmml(pipeline,"./xml/xgboost.pmml",with_repr = True)

    java代码调用上一步生成的xgboost.xml,看下,跟上两篇并没有什么区别:

    package com.meituan.test;

    import java.io.File;

    import java.io.FileInputStream;

    import java.io.InputStream;

    import java.util.HashMap;

    import java.util.LinkedHashMap;

    import java.util.List;

    import java.util.Map;

    import org.dmg.pmml.FieldName;

    import org.dmg.pmml.PMML;

    import org.jpmml.evaluator.Evaluator;

    import org.jpmml.evaluator.FieldValue;

    import org.jpmml.evaluator.InputField;

    import org.jpmml.evaluator.ModelEvaluator;

    import org.jpmml.evaluator.ModelEvaluatorFactory;

    import org.jpmml.evaluator.TargetField;

    public class PMMLPrediction {

    public static void main(String[] args) throws Exception {

    String pathxml="/Users/shuubiasahi/Documents/python/credit-tfgan/xml/xgboost.pmml";

    Map map=new HashMap();

    map.put("sepal_length", 5.1);

    map.put("sepal_width", 3.5);

    map.put("petal_length", 1.4);

    map.put("petal_width", 0.2);

    predictLrHeart(map, pathxml);

    }

    public static void predictLrHeart(Map irismap,String pathxml)throws Exception {

    PMML pmml;

    // 模型导入

    File file = new File(pathxml);

    InputStream inputStream = new FileInputStream(file);

    try (InputStream is = inputStream) {

    pmml = org.jpmml.model.PMMLUtil.unmarshal(is);

    ModelEvaluatorFactory modelEvaluatorFactory = ModelEvaluatorFactory

    .newInstance();

    ModelEvaluator> modelEvaluator = modelEvaluatorFactory

    .newModelEvaluator(pmml);

    Evaluator evaluator = (Evaluator) modelEvaluator;

    List inputFields = evaluator.getInputFields();

    // 过模型的原始特征,从画像中获取数据,作为模型输入

    Map arguments = new LinkedHashMap<>();

    for (InputField inputField : inputFields) {

    FieldName inputFieldName = inputField.getName();

    Object rawValue = irismap

    .get(inputFieldName.getValue());

    FieldValue inputFieldValue = inputField.prepare(rawValue);

    arguments.put(inputFieldName, inputFieldValue);

    }

    Map results = evaluator.evaluate(arguments);

    List targetFields = evaluator.getTargetFields();

    //对于分类问题等有多个输出。

    for (TargetField targetField : targetFields) {

    FieldName targetFieldName = targetField.getName();

    Object targetFieldValue = results.get(targetFieldName);

    System.err.println("target: " + targetFieldName.getValue()

    + " value: " + targetFieldValue);

    }

    }

    }

    }

    结果:

    target: species value: ProbabilityDistribution{result=0, probability_entries=[0=0.9966834381304797, 1=0.0024718368561191103, 2=8.447250134011304E-4]}

    展开全文
  • windows 下配置javaxgboost

    千次阅读 2016-04-01 14:30:53
    在windows下配置java版的xgboost
  • xgboost是一个boosting+decision trees的工具包,看微博上各种大牛都说效果很好,于是下载一个,使用了一下,安装步骤如下。第一步,编译生成xgboost.exe(用于CLI)以及xgboost_wrapper.dll(用于python)。用vs打开...
  • 概述XGBoost是GBDT算法的一种变种,是一种常用的有监督集成学习算法;是一种伸缩性强、便捷的可并行构建模型的Gradient Boosting算法。注意:这里说可以并行构建模型,并不是说XGBoost建立的下一轮基模型不依赖于上...
  • 原标题:模型转代码:XGBoost等模型也能快速转纯C或Java代码机器之心编辑参与:思源你是否常训练炫酷的机器学习模型,用来分析数据或执行某些新奇的任务?你是否发现你的模型只能在一定开发环境上才能跑起来,很难...
  • 资源准备1.1 最新的xgboost4.07 版还没有windows下的编译工程,所以建议大家暂时先使用前一个版本的,官网上已经没有下载地址,下面是下载地址:http://blog.csdn.net/eddy_zheng/article/details/504961941.2 java...
  • XGBoostClassifier xgBoostEstimator=new XGBoostClassifier( ConvertUtil.toScalaImmutableMap(javaMap)) .setFeaturesCol("features").setLabelCol("classIndex"); // 开始训练 XGBoostClassificationModel model...
  • Xgboost4j打包 java Ubuntu安装

    千次阅读 2017-09-20 19:54:29
    Xgboost4j打包 java Ubuntu安装1. 踩过的坑写在最前网上找了几个教程,教程比较少,能用上的不多(1)比如jni.h 和 jni_md.h 用来编译xgboost4j_wrapper.cpp生成打包的动态链接库 (只存在旧版本,但是还是以java文件夹...
  • xgboostjava、python安装 mac为例子

    千次阅读 2017-05-06 14:39:55
    之前用过python下的xgboost,现在想在自己的电脑(os)上折腾下jave版本的xgboost,碰到不少坑,记录下, 1.下载xgboost库 git clone --recursive https://github.com/dmlc/xgboost 2.编译xgboost 查看自己电脑...
  • ERROR ApplicationMaster: User class threw exception: ml.dmlc.xgboost4j.java.XGBoostError: XGBoostModel training failed ml.dmlc.xgboost4j.java.XGBoostError: XGBoostModel training failed at ml.dmlc....
  • xgboost已经提供丰富的java接口,再通过pmml调用显得没多大的意义,java底层用的c++写的预测方法,超级快,不过还是记录下,直接看看python代码,数据还是鸾尾花数据:import pandas as pd from xgboost.sklearn ...
  • Xgboost存储为pmml以及在java中调用

    千次阅读 2018-12-11 11:02:33
    首先,我们构建一个xgboost模型并存储为PMML形式,使用到的包是sklearn2pmml,可以将sklearn中的模型保存为PMML的形式 import pandas as pd from xgboost.sklearn import XGBClassifier from sklearn2pmml import ...
  • 今天我们将介绍一个炫酷的工具,它可以把构建在 scikit-learn 或XGBoost等库上的 ML 模型直接转化为不需要任何依赖项的 Java/Python/C 源代码。项目地址:https://github.com/BayesWitnesses/m2...
  • xgboost用于文本分类预测,java接口

    千次阅读 2017-05-07 21:12:29
    周末花了两天时间从安装xgboost到用于文本预测,记录下,首先是把文本分词,去停顿词,计算tf-idf值,然后模型训练,模型保存,加载模型,模型预测: 模型训练比较简单,先看看模型预测写的代码,准备的两个方法,...
  • xgboost and xgboost4j

    万次阅读 2016-11-18 11:14:03
    XGBoost Scalable, Portable and Distributed Gradient Boosting (GBDT, GBRT or GBM) Library, for Python, R, Java, Scala, C++ and more. Runs on single machine, Hadoop, Spark, Flink and DataFlow 可...
  • XGBoost算法原理小结中,我们...1. XGBoost类库概述XGBoost除了支持Python外,也支持R,Java等语言。本文关注于Python的XGBoost类库,安装使用"pip install xgboost"即可,目前使用的是XGBoost的0.90版本。XGBo...
  • xgboost参数说明在网上找了很多关于xgboost的文章,基本上90%都是以python在说明的,java的很少, xgboost参数说明http://blog.csdn.net/zc02051126/article/details/46711047在这篇文章里面说明的很详细, 在java...
  • Javaxgboost,分linux和win64两种编译版本,linux下另有xgboost4j-spark和xgboost4j-flink的依赖包
  • XGBoost探索

    2017-08-17 15:06:46
    XGBoost可以用来分类,回归,排序。...支持多种语言:C++, Python, R, Java, Scala, Julia。安装参考https://xgboost.readthedocs.io/en/latest/build.html。 注意clone时加--recursive参数。参考官方文档
  • 使用同样的特征和模型,在python和java中输出的预测得分不同。经调研和测试发现,主要是二者missing的默认值不同,python中默认值为np.nan, 而java中默认值为0f。将java中的missing值设置为Float.NaN, 就可以得到和...
  • XGBoost类库使用小结

    千次阅读 2019-12-05 12:25:35
    XGBoost算法原理小结中,我们讨论了XGBoost的算法原理,这一片我们讨论如何使用XGBoost的Python类库,以及一些...XGBoost除了支持Python外,也支持R,Java等语言。本文关注于Python的XGBoost类库,安装使用"pip...

空空如也

空空如也

1 2 3 4 5 ... 8
收藏数 153
精华内容 61
关键字:

javaxgboost

java 订阅