XGBoost文本分类,多分类、二分类、10-Fold(K-Fold)
做机器学习的时候经常用到XGB,简单记录一下
K折交叉验证也是模型常用的优化方法。一起记录。。。
K折交叉验证:类似三个臭皮匠,顶个诸葛亮。我的理解是,就是用民主投票的方式,选取票数最高的那个当结果。K折就是分成K份数据来进行。K= 5就是5折交叉验证,K= 7就是7折交叉验证,K=10就是10折。。。
先把每个模型训练出来,才能进行选票。至于怎么投票,就看你像想怎么设置了,我这是投的准确率。
acc = [] # 记录每个模型的准确率
models = [] # 记录每个模型
随机抽取200条数据出来当测试集
random_index =set()
while(len(random_index )<200):
random_index .add(random.randint(0,len(x_train_weight)-1))
random_index = list(random_index)
random_index.sort(reverse=True)
my_test = [x_train_weight[i] for i in random_index]
my_labels = list([labels["labels"][i] for i in random_index])
for i in random_index:
x_train_weight = np.delete(x_train_weight, i, 0)
labels = labels.drop(index=i)
# 开始训练
le = len(x_train_weight)//10
for i in range(10):
print("-"*5+"第"+str(i+1)+"个模型"+"-"*5)
left = i*le
right = (i+1)*le
Kx_train = np.concatenate((x_train_weight[:left],x_train_weight[right:]),axis=0)
Kx_label = np.concatenate((labels["labels"][:left],labels["labels"][right:]),axis=0)
Ky_train = x_train_weight[left:right]
Ky_label = labels["labels"][left:right]
dtrain = xgb.DMatrix(Kx_train, label=Kx_label)
dval = xgb.DMatrix(Ky_train, label=Ky_label)
params = {
'booster': 'gbtree',
'objective': 'multi:softmax', # 多分类的问题
'num_class': 16, # 类别数,与 multisoftmax 并用
# 'gamma': 0.1, # 用于控制是否后剪枝的参数,越大越保守,一般0.1、0.2这样子。
'max_depth': 6, # 构建树的深度,越大越容易过拟合
# 'lambda': 2, # 控制模型复杂度的权重值的L2正则化项参数,参数越大,模型越不容易过拟合。
# 'subsample': 0.7, # 随机采样训练样本
# 'colsample_bytree': 0.7, # 生成树时进行的列采样
# 'min_child_weight': 1,
# 这个参数默认是 1,是每个a叶子里面 h 的和至少是多少,对正负样本不均衡时的 0-1 分类而言
# ,假设 h 在 0.01 附近,min_child_weight 为 1 意味着叶子节点中最少需要包含 100 个样本。
# 这个参数非常影响结果,控制叶子节点中二阶导的和的最小值,该参数值越小,越容易 overfitting。
'silent': 0, # 设置成1则没有运行信息输出,最好是设置为0.
'eta': 0.3, # 如同学习率
'seed': 666, # 随机数种子,如果固定,则每次产生相同训练结果
# 'nthread': 4, # cpu 线程数
'class_weight': 'balanced',
'n_estimators': 100,
'eval_metric': 'merror'
}
num_rounds = 40 # 迭代次数
watchlist = [(dtrain, 'train'), (dval, 'val')]
# 训练模型并保存
# early_stopping_rounds 当设置的迭代次数较大时,early_stopping_rounds 可在一定的迭代次数内准确率没有提升就停止训练
model = xgb.train(params, dtrain, num_rounds, watchlist, early_stopping_rounds=50)
# 模型预测
y_predict = model.predict(dval)
models.append(model)
acc.append(metrics.accuracy_score(Ky_label, y_predict))
print("acc:", acc)
pred = []
for i in range(10):
pred.append(models[i].predict(xgb.DMatrix(np.array(my_test))))
print("pred: ", pred)
my_jieguo = []
for i in range(len(my_labels)):
t = [0 for _ in range(len(categories))] # 记录票数
tg = [int(pred[j][i]) for j in range(10)] # 获取10个模型的预测结果
# 统计票数
for i in range(10):
t[tg[i]] += acc[i]
my_jieguo.append(t.index(max(t))) # 选出最高,加入结果
print("实际:", my_labels)
print("预测:", my_jieguo)
Ts = 0 # 预测正确的数量
error = [] # 预测储物的数据
for i in range(len(my_labels)):
if my_labels[i] == my_jieguo[i]:
Ts += 1
# else:
# error.append(features[random_index[i]])
print("准确率:%f" % (Ts/len(my_labels)))
with open("error.txt", "a", encoding="utf-8") as f:
for i in error:
f.write(i+"\n")
for i in range(10):
models[i].save_model('xgb_model/xgb%d.model' % i) # 用于存储训练出的模型
二分类
也基本上是查不多的,前面都一样
这里二分类的结果输出不是0,1,而是小数,我以0.5为分割,小于为0,大于为1(1表示是,反之0表示否)
params = {
'booster': 'dart',
'objective': 'binary:logistic',
'max_depth': 6, # 构建树的深度,越大越容易过拟合
'eta': 0.06, # 学习率
'n_estimators': 100,
'class_weight': 'balanced',
'seed': 1001, # 随机数种子,如果固定,则每次产生相同训练结果
}
num_rounds = 20 # 迭代次数
watchlist = [(dtrain, 'train'),(dval, 'val')]
#训练模型并保存
# early_stopping_rounds 当设置的迭代次数较大时,early_stopping_rounds 可在一定的迭代次数内准确率没有提升就停止训练
model = xgb.train(params, dtrain, num_rounds, watchlist)
# model.save_model('/xgb.model') # 用于存储训练出的模型
# 模型预测
y_predict = model.predict(dval) # 模型预测
predictions = [round(value) for value in y_predict]
accuracy = accuracy_score(Ky_lable, predictions)
acc.append(accuracy)
models.append(model)
XGBoost文本分类,多分类、二分类、10-Fold(K-Fold)的更多相关文章
- 使用sklean进行多分类下的二分类
#coding:utf-8 import matplotlib.pyplot as plt import numpy as np from sklearn.linear_model import Lo ...
- 二分类问题 - 【老鱼学tensorflow2】
什么是二分类问题? 二分类问题就是最终的结果只有好或坏这样的一个输出. 比如,这是好的,那是坏的.这个就是二分类的问题. 我们以一个电影评论作为例子来进行.我们对某部电影评论的文字内容为好评和差评. ...
- Logistic回归二分类Winner or Losser----台大李宏毅机器学习作业二(HW2)
一.作业说明 给定训练集spam_train.csv,要求根据每个ID各种属性值来判断该ID对应角色是Winner还是Losser(0.1分类). 训练集介绍: (1)CSV文件,大小为4000行X5 ...
- 文本分类实战(二)—— textCNN 模型
1 大纲概述 文本分类这个系列将会有十篇左右,包括基于word2vec预训练的文本分类,与及基于最新的预训练模型(ELMo,BERT等)的文本分类.总共有以下系列: word2vec预训练词向量 te ...
- NLP(二十)利用BERT实现文本二分类
在我们进行事件抽取的时候,我们需要触发词来确定是否属于某个特定的事件类型,比如我们以政治上的出访类事件为例,这类事件往往会出现"访问"这个词语,但是仅仅通过"访问&q ...
- NLP(二十二)利用ALBERT实现文本二分类
在文章NLP(二十)利用BERT实现文本二分类中,笔者介绍了如何使用BERT来实现文本二分类功能,以判别是否属于出访类事件为例子.但是呢,利用BERT在做模型预测的时候存在预测时间较长的问题.因此 ...
- Python自然语言处理笔记【二】文本分类之监督式分类的细节问题
一.选择正确的特征 1.建立分类器的工作中如何选择相关特征,并且为其编码来表示这些特征是首要问题. 2.特征提取,要避免过拟合或者欠拟合 过拟合,是提供的特征太多,使得算法高度依赖训练数据的特性,而对 ...
- 采用boosting思想开发一个解决二分类样本不平衡的多估计器模型
# -*- coding: utf-8 -*- """ Created on Wed Oct 31 20:59:39 2018 脚本描述:采用boosting思想开发一个 ...
- xgb, lgb, Keras, LR(二分类、多分类代码)
preprocess # 通用的预处理框架 import pandas as pd import numpy as np import scipy as sp # 文件读取 def read_csv_ ...
随机推荐
- Docker容器内连接宿主机即CentOS的Mysql服务器
docker的宿主机是虚拟机下的CentOS 博主最近遇到一种情况,从服务器拷贝了一份数据库在宿主机Mysql服务器上,想要用本地的数据库测试自己的代码正确性,但是项目程序都是靠docker一键部署的 ...
- python django对数据表的增删改查操作
新增操作:方式1:book = BookInfo(title='西游记',price=99)book.save() 方式2:BookInfo.objects.create(title='西游记',pr ...
- zk 节点宕机如何处理?
Zookeeper 本身也是集群,推荐配置不少于 3 个服务器.Zookeeper 自身也要保 证当一个节点宕机时,其他节点会继续提供服务. 如果是一个 Follower 宕机,还有 2 台服务器提供 ...
- Spring-boot-菜鸟-配置-简介
SpringBoot使用一个全局的配置文件,配置文件名是固定的: •application.properties •application.yml 配置文件的作用:修改SpringBoot自动配置的默 ...
- lombok的使用。
今天学习spring event,无意中看到lombok插件,以前也见同事用过,特此看了下用法.觉得还挺好用,记录下. 网上找到的一个比较术语化的解释:lombok是一个基于LGPL的开源J2EE综合 ...
- 遇到的错误之“Cannot find module 'XXX’的错误”
一.问题: 在进行webpack打包的时候,会出现Cannot find module 'XXX'的错误,找不到某个模块的错误 二.解决方法: (1)方法1: 直接进行npm install重新打包: ...
- python办公自动化系列之金蝶K3(三)
小爬在之前的两篇文章 [python办公自动化系列之金蝶K3自动登录(一)].[python办公自动化系列之金蝶K3自动登录(二)]带大家系统搞定了K3客户端的自动登录难题,但是搞定[自动登录]只是我 ...
- Docker镜像构建之Dockerfile
在 Docker 中构建镜像最常用的方式就是使用 Dockerfile.Dockerfile 是一个用来构建镜像的文本文件. 官方文档:https://docs.docker.com/engine/r ...
- 更改spinner字体大小
做下拉框的时候,我采用的是spinner和string-array,因为比较简单. 可是整个界面的字体大小与下拉框里面的字体大小不符合,所以我们要更改spinner里面的字体大小. 方法是: 在布局中 ...
- DOS控制台
:win+r--cmd--回车* A:d: 回车 盘符切换* B:dir(directory):列出当前目录下的文件以及文件夹* C:cd (change directory)改变指定目录(进入指定目 ...