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_ ...
随机推荐
- VS Code通过code runner插件编译运行多个cpp文件 | 链接编译.h文件
1.多个cpp文件在同一级目录 参考:https://jingyan.baidu.com/article/2f9b480d7ceb3d01ca6cc224.html 此时可通过修改Code Runne ...
- vuex组成和原理?
组成: 组件间通信, 通过store实现全局存取 修改: 唯一途径, 通过commit一个mutations(同步)或dispatch一个actions(异步) 简写: 引入mapState.mapG ...
- 使用 Spring Cloud 有什么优势?
使用 Spring Boot 开发分布式微服务时,我们面临以下问题 与分布式系统相关的复杂性-这种开销包括网络问题,延迟开销,带宽问题,安全问题. 服务发现-服务发现工具管理群集中的流程和服务如何查找 ...
- 面试问题之C++语言:类模板声明与定义为何不能分开
C++中每个对象所占用的空间大小,是在编译的时候就确定的,在模板类没有真正的被使用之前,编译器是无法知道,模板类中使用模板类型的对象的所占用的空间的大小的.只有模板被真正使用的时候,编译器才知道,模板 ...
- jQuery--筛选【查找函数】
查找函数介绍 <A> <B> <C></C> <D></D> <E></E> <F>< ...
- Idea学习之"重启或清理IEDA缓存"
idea的重启 如下图所示:第1步:通过File–>Invalidate Caches进入重启窗口: 第2步:选择自己所需要的重启方式,四个按钮,一共三种重启方式: 四个按钮的说明 Invali ...
- 《自动控制原理》个人笔记(来自ppt课件)
控制的含义 控制(CONTROL)----某个主体使某个客体按照一定的目的动作.主体–人:人工控制: 机器:自动控制客体–指一件物体,一套装置,一个物化过程,一个特定系统. 人工控制与自动控制 人在控 ...
- Visual Studio Code 快捷键大全(最全)
Visual Studio Code 是一款优秀的编辑器,对于开发前端带来了很多便利,熟悉快捷键的使用,能够起到事半功倍的作用,提高工作效率.下面就Visual Studio Code常用快捷键的一些 ...
- 纯干货数学推导_傅里叶级数与傅里叶变换_Part4_傅里叶级数的复数形式
- [译]HTML&CSS Lesson5: 定位
CSS最大的用处之一就是可以将内容和元素定位到任何我们想要的位置,使我们的设计具有结构,使内容更加易懂. CSS有好几种不同的定位属性,每种都有自己的使用场景.在这节课中我们会通过不同的案例--可复用 ...