【数据竞赛】“达观杯”文本智能处理挑战赛5
一、LightGBM模型
1、XGBoost缺点
- 每轮迭代时,都需要遍历整个训练数据多次。如果把整个训练数据装进内存则会限制训练数据的大小;如果不装进内存,反复地读写训练数据又会消耗非常大的时间。
- 预排序方法(pre-sorted):首先,空间消耗大。这样的算法需要保存数据的特征值,还保存了特征排序的结果(例如排序后的索引,为了后续快速的计算分割点),这里需要消耗训练数据两倍的内存。其次时间上也有较大的开销,在遍历每一个分割点的时候,都需要进行分裂增益的计算,消耗的代价大。
- 对cache优化不友好。在预排序后,特征对梯度的访问是一种随机访问,并且不同的特征访问的顺序不一样,无法对cache进行优化。同时,在每一层长树的时候,需要随机访问一个行索引到叶子索引的数组,并且不同特征访问的顺序也不一样,也会造成较大的cache miss。
2、LightGBM简介
LightGBM模型是一种boosting框架,包含两个关键点:light即轻量级,GBM 梯度提升机。它可以说是分布式的,高效的,有以下优势:
- 更快的训练效率
- 低内存使用
- 更高的准确率
- 支持并行化学习
- 可处理大规模数据
3、LightGBM的特点
- 基于Histogram的决策树算法
- 带深度限制的Leaf-wise的叶子生长策略
- 直方图做差加速
- 直接支持类别特征(Categorical Feature)
- Cache命中率优化
- 基于直方图的稀疏特征优化
- 多线程优化
(1)Histogram算法
基本思想:先把连续的浮点特征值离散化成k个整数,同时构造一个宽度为k的直方图。遍历数据时,根据离散化后的值作为索引在直方图中累积统计量,当遍历一次数据后,直方图累积了需要的统计量,然后根据直方图的离散值,遍历寻找最优的分割点。
(2)带深度限制的Leaf-wise的叶子生长策略
Level-wise过一次数据可以同时分裂同一层的叶子,容易进行多线程优化,也好控制模型复杂度,不容易过拟合。但实际上Level-wise是一种低效算法,因为它不加区分的对待同一层的叶子,带来了很多没必要的开销,因为实际上很多叶子的分裂增益较低,没必要进行搜索和分裂。
Leaf-wise则是一种更为高效的策略:每次从当前所有叶子中,找到分裂增益最大的一个叶子,然后分裂,如此循环。因此同Level-wise相比,在分裂次数相同的情况下,Leaf-wise可以降低更多的误差,得到更好的精度。
Leaf-wise的缺点:可能会长出比较深的决策树,产生过拟合。因此LightGBM在Leaf-wise之上增加了一个最大深度限制,在保证高效率的同时防止过拟合。
二、LightGBM参数
LightGBM参数包括:核心参数,学习控制参数,IO参数,目标参数,度量参数,网络参数,GPU参数,模型参数,这里常修改的便是核心参数,学习控制参数,度量参数等。
所有的参数含义,参考:http://lightgbm.apachecn.org/cn/latest/Parameters.html
调参过程:
num_leaves
- LightGBM使用的是
leaf-wise
的算法,因此在调节树的复杂程度时,使用的是num_leaves
而不是max_depth
。 - 大致换算关系:numleaves=2(maxdepth)num_leaves = 2^(max_depth)numleaves=2(maxdepth)
- LightGBM使用的是
- 样本分布非平衡数据集:可以
param[‘is_unbalance’]=’true’
- Bagging参数:
bagging_fraction+bagging_freq
(必须同时设置)、feature_fraction
min_data_in_leaf
、min_sum_hessian_in_leaf
三、lightGBM实现
# -*- coding: utf-8 -*-
import pickle
import lightgbm as lgb
import pandas as pd
from sklearn.metrics import mean_squared_error
from sklearn.model_selection import GridSearchCV
from sklearn.model_selection import train_test_split
from sklearn.metrics import accuracy_score, precision_score, recall_score, f1_scorefp = open('./features/data_tfidf_train.pkl', 'rb')
x_train,y_train = pickle.load(fp)
x_train, x_test, y_train, y_test = train_test_split(x_train, y_train, test_size=0.3, random_state=2019)print('Start training...')
# 创建模型,训练模型
estimator=lgb.sklearn.LGBMClassifier(num_leaves=31,learning_rate=0.05,n_estimators=20)
estimator.fit(x_train,y_train)
print('Start predicting...')
y_pred = estimator.predict(x_test) # 模型评估
print('The rmse of prediction is:', mean_squared_error(y_test, y_pred) ** 0.5)
#f1_score
label = []
for i in range(1, 20):label.append(i)
f1 = f1_score(y_test, y_pred, labels=label, average='micro')
print('The F1 Score of lightgbm classifier: ' + str("%.2f" % f1))
输出结果
Start training...
Start predicting...
The rmse of prediction is: 5.1609562285
The F1 Score of lightgbm classifier: 0.59
【数据竞赛】“达观杯”文本智能处理挑战赛5相关推荐
- 【数据竞赛】“达观杯”文本智能处理挑战赛1
一.数据竞赛简介 "达观杯"文本智能处理挑战赛 1.任务 建立模型通过长文本数据正文(article),预测文本对应的类别(class) 2.数据 传送门:链接: https:// ...
- “达观杯”文本智能处理挑战赛代码示例
达观杯介绍: 类似kaggle的数据科学比赛,任何人可以参加 网址:http://www.dcjingsai.com/ 可以用支付宝实名注册 项目名称: "达观杯"文本智能处理挑战 ...
- 达观杯”文本智能处理挑战赛
竞赛信息 1.网址 http://www.dcjingsai.com/common/cmpt/"达观杯"文本智能处理挑战赛_竞赛信息.html 2.任务 建立模型通过长文本数据正文 ...
- “达观杯”文本智能处理挑战赛,季军带你飞
来自AI小白入门 前段时间和朋友何从庆(AI算法之心)等队友一起组队参加了这个比赛,本来以为小比赛人少,没想到参加的人会有几千人.最后我们队伍取得季军(4st/3131),虽有些许遗憾,但是也很荣幸认 ...
- “达观杯”文本智能处理挑战赛
(本内容转载自公众号"科技与Python") 2018年人工智能的发展在运算智能和感知智能已经取得了很大的突破和优于人类的表现.而在以理解人类语言为入口的认知智能上,目前 ...
- 【数据竞赛】“达观杯”文本智能处理挑战赛3
一.语言模型 在统计自然语言处理中,语言模型指的是计算一个句子的概率模型. 传统的语言模型 词的表示是原始的.面向字符串的. 向量角度:更高维.更稀疏的向量.若词汇表大小为 NNN,每个字符串形式的词 ...
- 【数据竞赛】“达观杯”文本智能处理挑战赛2
文章目录 一.TF_IDF原理 1.TF(item frequency) 2.逆向文件频率IDF(inverse document frequency) 3.TF-IDF 二.TF-IDF算法实现 1 ...
- 【数据竞赛】“达观杯”文本智能处理挑战赛4
一.逻辑回归 逻辑回归(Logistic Regression, LR)是一种常用的处理两类分类问题的线性模型. 1.概率估计 LR 模型计算输入特征的加权和(加上偏差项),之后将中间结果输入 log ...
- 【数据竞赛】“达观杯”文本智能处理挑战赛6——模型优化
文章目录 一.超参数 1.网格搜索 2.随机搜索 3.贝叶斯优化 二.Stacking 1.核心图解 (1)构建新的训练集 (2)构建新的测试集 (3)最终的训练与预测 2.示例 (1)构建新的训练集 ...
最新文章
- python中函数可以赋值给一个变量_python中函数赋值给变量时的问题注意详解
- SaaS市场普及 网络推广策略最有效
- linux 关闭句柄,主库出现大量的未关闭句柄,对应linux命令 : lsof -p 28314|grep CLOSE_WAIT...
- 您应该知道的ES2020中的10个JavaScript新功能
- linux sh 字符串split,linux shell之字符串的更具字符分割和删除字符和文本内容的删除以及内容是否匹配成功...
- js中使用new Date(str)创建时间对象不兼容firefox和ie的解决方式
- Golang的调度模型
- 使用 PDB 避免 Kubernetes 集群中断
- go-plugin入门
- 前端开发 2018 回顾
- Ubuntu 16.04 LTS误删系统内核或驱动导致无法上网解决方案
- SQL Server 新增数据表数据
- android c++标准命名空间demo
- nginx 配置php
- 陆振波的svm的matlab代码的解释,陆振波SVM的MATLAB代码解释
- java 生成pem_生成pem文件 - The NoteBook of EricKong - BlogJava
- C/C++ abs 函数 - C语言零基础入门教程
- AS移动开发 类微信界面2_Activity的生命周期与跳转(持续更新中)
- 安装DCOS,关于docker异常引发的调查
- 笔记本Max-Q架构CPU到底有什么秘密
热门文章
- 「后端小伙伴来学前端了」Vuex进阶操作,让你的代码更加高效(简称如何学会偷懒 【手动狗头】)
- Mybatis-入门篇-根据官方文档搭建
- Linux CenOS7下安装ActivetMQ
- 二十年后我发明了保姆机器人作文_我想发明保姆机器人作文700字
- linux设置挂载服务端防火墙_Linux Tomcat使用之前预配置(端口开放关闭 防火墙设置 硬盘挂载 安装文件)...
- pythoncsv数据怎么读_python如何读写csv数据
- mysql数据库各表、数据库数据容量查询
- signature=806a32b3c900efe2c25fc19c92754ca3,Signature de câble électronique
- 如何用php采集照片,使用PHP采集远程图片
- 正在安装虚拟网络驱动程序卡住了_如何在Hyper-V、Virtual PC等虚拟机中使用USB设备...