xgboost
因为上篇博客介绍到了xgboost的结果,在这里就简单的介绍一下。其原理在这里就不过多介绍了,在应用时主要在其特征构建上面。
特征构造:
在构造特征的时候用到了句子的外在特征,如句子的长度、开头结尾、数字、空白符等特征,也用到了句子的初始的类别信息来刻画句子的语义信息,(我们有一批标注的数据,找五条句与待预测句子的相近的标注数据的标签作为待预测标签),他们共同的构成的训练特征。
xgboost的训练过程:
train = np.array(self.data_train)
params={
'booster':'gbtree',
'objective': 'multi:softprob', #多分类的问题multi:softmax, multi:softprob
'num_class':23,
'gamma':0.1, # 用于控制是否后剪枝的参数,越大越保守,一般0.1、0.2这样子。
'max_depth':10, # 构建树的深度,越大越容易过拟合
'lambda':3, # 控制模型复杂度的权重值的L2正则化项参数,参数越大,模型越不容易过拟合。
'subsample':0.7, # 随机采样训练样本
'colsample_bytree':0.7, # 生成树时进行的列采样
'min_child_weight':3,
# 这个参数默认是 1,是每个叶子里面 h 的和至少是多少,对正负样本不均衡时的 0-1 分类而言
#,假设 h 在 0.01 附近,min_child_weight 为 1 意味着叶子节点中最少需要包含 100 个样本。
#这个参数非常影响结果,控制叶子节点中二阶导的和的最小值,该参数值越小,越容易 overfitting。
'silent':0 ,#设置成1则没有运行信息输出,最好是设置为0.
'eta': 0.01, # 如同学习率
'seed':1000,
# 'nthread':7,# cpu 线程数
# 'eval_metric': 'logloss' #校验数据所需要的评价指标
}
plst = list(params.items())
num_rounds =1000 # 迭代次数
train_xy,val = train_test_split(train, test_size = 0.2,random_state=1)
#random_state is of big influence for val-auc
y = train_xy[:,-1]
X = train_xy[:,0:-2]
val_y = val[:,-1]
val_X = val[:,0:-2]
xgb_val = xgb.DMatrix(val_X,label=val_y)
xgb_train = xgb.DMatrix(X, label=y)
print(type(X))
# print(type(xgb_test))
watchlist = [(xgb_train, 'train'),(xgb_val, 'val')]
# training model
# early_stopping_rounds 当设置的迭代次数较大时,early_stopping_rounds 可在一定的迭代次数内准确率没有提升就停止训练
model = xgb.train(plst, xgb_train, num_rounds, watchlist,early_stopping_rounds=100,feval=self.evalerror)
一些总结:
- 本人做了一个对比试验,就是用xgboost的句子外在特征和LSTM提取的句子语义特征进行结合,和xgboost的训练结果非常接近,如果没有这部分特征就会略微差一点,也给了我LSTM能够表示什么样的特征一些启示。