做机器学习的时候经常用到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)的更多相关文章

  1. 使用sklean进行多分类下的二分类

    #coding:utf-8 import matplotlib.pyplot as plt import numpy as np from sklearn.linear_model import Lo ...

  2. 二分类问题 - 【老鱼学tensorflow2】

    什么是二分类问题? 二分类问题就是最终的结果只有好或坏这样的一个输出. 比如,这是好的,那是坏的.这个就是二分类的问题. 我们以一个电影评论作为例子来进行.我们对某部电影评论的文字内容为好评和差评. ...

  3. Logistic回归二分类Winner or Losser----台大李宏毅机器学习作业二(HW2)

    一.作业说明 给定训练集spam_train.csv,要求根据每个ID各种属性值来判断该ID对应角色是Winner还是Losser(0.1分类). 训练集介绍: (1)CSV文件,大小为4000行X5 ...

  4. 文本分类实战(二)—— textCNN 模型

    1 大纲概述 文本分类这个系列将会有十篇左右,包括基于word2vec预训练的文本分类,与及基于最新的预训练模型(ELMo,BERT等)的文本分类.总共有以下系列: word2vec预训练词向量 te ...

  5. NLP(二十)利用BERT实现文本二分类

      在我们进行事件抽取的时候,我们需要触发词来确定是否属于某个特定的事件类型,比如我们以政治上的出访类事件为例,这类事件往往会出现"访问"这个词语,但是仅仅通过"访问&q ...

  6. NLP(二十二)利用ALBERT实现文本二分类

      在文章NLP(二十)利用BERT实现文本二分类中,笔者介绍了如何使用BERT来实现文本二分类功能,以判别是否属于出访类事件为例子.但是呢,利用BERT在做模型预测的时候存在预测时间较长的问题.因此 ...

  7. Python自然语言处理笔记【二】文本分类之监督式分类的细节问题

    一.选择正确的特征 1.建立分类器的工作中如何选择相关特征,并且为其编码来表示这些特征是首要问题. 2.特征提取,要避免过拟合或者欠拟合 过拟合,是提供的特征太多,使得算法高度依赖训练数据的特性,而对 ...

  8. 采用boosting思想开发一个解决二分类样本不平衡的多估计器模型

    # -*- coding: utf-8 -*- """ Created on Wed Oct 31 20:59:39 2018 脚本描述:采用boosting思想开发一个 ...

  9. xgb, lgb, Keras, LR(二分类、多分类代码)

    preprocess # 通用的预处理框架 import pandas as pd import numpy as np import scipy as sp # 文件读取 def read_csv_ ...

随机推荐

  1. P2P图书馆实践:让知识更好的传播

    人才是每个公司最重要的资产,而人的成长自然就成了最重要的事.苏轼曾经说过:"腹有诗书气自华,代码万行零缺陷",阅读对人成长的影响是巨大的.相信不同的团队都有着自己打造学习氛围.技术 ...

  2. 学习廖雪峰的Git教程4--继续学习分支管理

    查看分支 git branch -a 查看远程分支 git branch 查看本地分支 创建分支 git checkout -b branch-name 在远程创建一个属于自己的分支 删除分支 删除本 ...

  3. 『忘了再学』Shell基础 — 5、Bash基本功能(命令的别名和常用快捷键)

    目录 1.给命令设置别名 (1)设置别名的命令格式 (2)命令别名永久生效 (3)别名的优先级 2.Bash常用快捷键 1.给命令设置别名 Linux系统的命令别名我们之前已经说过了,这里再过一边. ...

  4. Adobe AIR 应用程序图标详细描述

    官方PDF文档: http://help.adobe.com/zh_CN/air/build/WS901d38e593cd1bac1e63e3d129907d2886-8000.html#WS901d ...

  5. jQuery--属性和CSS

    1.属性和CSS介绍 属性(重点掌握) attr(name) 获取指定属性名的值 attr(key,val) 给一个指定属性名设置值 attr(prop) 给多个属性名设置值.参数:prop json ...

  6. ZAB 和 Paxos 算法的联系与区别?

    相同点: 1.两者都存在一个类似于 Leader 进程的角色,由其负责协调多个 Follower 进程的运行 2.Leader 进程都会等待超过半数的 Follower 做出正确的反馈后,才会将一个提 ...

  7. java-設計模式-抽象工場模式

    抽象工廠模式AbstractFactory 一种创建型设计模式, 它能创建一系列相关的对象, 而无需指定其具体类. 工廠方法模式中考虑的是一类产品的生产,如畜牧场只养动物.电视机厂只生产电视机,同种类 ...

  8. springboot-数据库访问之mybatis

    选中mysqldirver,数据库驱动器 选中jdbc ,帮我们配置数据源,连接数据库 选中mybatis,持久层 <!-- 这个不是springboot官方出来的,是mybatis为了设备sp ...

  9. idea问题之"一个或多个listeners启动失败问题"

    org.apache.catalina.core.StandardContext.startInternal 一个或多个listeners启动失败,更多详细信息查看对应的容器日志文件之 "A ...

  10. SringBoot之yaml语法

    ------------恢复内容开始------------ SpringBoot之yaml语法 1.配置文件 官方配置文档太多了,根本记不住! 怎么办呐-->了解原理 SpringBoot使用 ...