XGBoost文本分类,多分类二分类10-Fold(K-Fold)

Posted ztabk

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了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+" ")

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)的主要内容,如果未能解决你的问题,请参考以下文章

day03-二分类问题

XGBoost文本多分类记录

XGBoost 中多类分类的损失函数是啥?

分类家族:二分类多分类多标签分类多输出分类

R语言构建文本分类模型:文本数据预处理构建词袋模型(bag of words)构建xgboost文本分类模型基于自定义函数构建xgboost文本分类模型

xgboost多分类原理