做机器学习的时候经常用到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. [bzoj3585] Rmq Problem / mex

    [bzoj3585] Rmq Problem / mex bzoj luogu 看上一篇博客吧,看完了这个也顺理成章会了( (没错这篇博客就是这么水) #include<cstdio> # ...

  2. 基于COLA架构的电商财务系统-总

    财务 清算-clearing 对账-check 结算-settle 平账-correct 划拨-remit 包划分 按照COLA规则进行划分,综合考虑功能和领域两个维度包结构定义 技术参考 dddpl ...

  3. Spring AOP统一日志 全量日志

    Spring AOP 切面@Around注解的具体使用 lichuangcsdn 2019-02-19 23:21:36 63936 收藏 61分类专栏: Spring 文章标签: Spring AO ...

  4. 为什么 char 数组比 Java 中的 String 更适合存储密码?

    另一个基于 String 的棘手 Java 问题,相信我只有很少的 Java 程序员可以正确回答这个问题.这是一个真正艰难的核心Java面试问题,并且需要对 String 的扎实知识才能回答这个问题. ...

  5. 两个相同的对象会有不同的的 hash code 吗?

    不能,根据 hash code 的规定,这是不可能的.

  6. 初识mybatis(为什么是mybatis?)

    对原生态的 jdbc 中的问题总结 1.数据库连接,使用就创建,不使用立即释放,对数据库进行频繁连接开启和关闭,造成数据库资源浪费,影响数据库性能. 设想:使用数据库连接池管理数据库连接 2.将sql ...

  7. mysql常见命令参数(一)

    1.mysql命令常用参数 1.--auto-rehash (tab键自动补全,表名及表字段) # mysql -u root --auto-rehash # vim my.cnf [mysql] a ...

  8. Netty学习摘记 —— 再谈EventLoop 和线程模型

    本文参考 本篇文章是对<Netty In Action>一书第七章"EventLoop和线程模型"的学习摘记,主要内容为线程模型的概述.事件循环的概念和实现.任务调度和 ...

  9. python-使用函数输出指定范围内Fibonacci数的个数

    本题要求实现一个计算Fibonacci数的简单函数,并利用其实现另一个函数,输出两正整数m和n(0<m<n≤100000)之间的所有Fibonacci数的数目. 所谓Fibonacci数列 ...

  10. python-汇率兑换

    按照1美元=6人民币的汇率编写一个美元和人民币的双向兑换程序 输入格式: 输入人民币或美元的金额,人民币格式如:R100,美元格式如:$100 输出格式: 输出经过汇率计算的美元或人民币的金额,格式与 ...