lightgbm文本分类

 

 

 LightGBM原理

1 单边梯度采样算法(Grandient-based One-Side Sampling,GOSS)

LightGBM使用GOSS算法进行训练样本采样的优化。在AdaBoost算法中,采用了增加被错误分类的样本的权重来优化下一次迭代时对哪些样本进行重点训练。然而GBDT算法中没有样本的权重,但是LightGBM采用了基于每个样本的梯度进行训练样本的优化,具有较大梯度的数据对计算信息增益的贡献比较大。当一个样本点的梯度很小,说明该样本的训练误差很小,即该样本已经被充分训练。然而在计算过程中,仅仅保留梯度较大的样本(例如:预设置一个阈值,或者保留最高若干百分位的梯度样本),抛弃梯度较小样本,会改变样本的分布并且降低学习的精度。GOSS算法的提出很好的解决了这个问题。

GOSS算法的基本思想是首先对训练集数据根据梯度排序,预设一个比例,保留在所有样本中梯度高于的数据样本;梯度低于该比例的数据样本不会直接丢弃,而是设置一个采样比例,从梯度较小的样本中按比例抽取样本。为了弥补对样本分布造成的影响,GOSS算法在计算信息增益时,会对较小梯度的数据集乘以一个系数,用来放大。这样,在计算信息增益时,算法可以更加关注“未被充分训练”的样本数据。

2 Exclusive Feature Bundling 算法(EFB)

LightGBM算法不仅通过GOSS算法对训练样本进行采样优化,也进行了特征抽取,以进一步优化模型的训练速度。但是这里的特征抽取与特征提取还不一样,并不减少训练时数据特征向量的维度,而是将互斥特征绑定在一起,从而减少特征维度。该算法的主要思想是:假设通常高维度的数据往往也是稀疏的,而且在稀疏的特征空间中,大量的特征是互斥的,也就是,它们不会同时取到非0值。这样,可以安全的将互斥特征绑定在一起形成一个单一的特征包(称为Exclusive Feature Bundling)。这样,基于特征包构建特征直方图的复杂度由O(#data*#feature)变为O(#data*#bundle),由于#bundle

 

 

 

 

 

code:

import pandas as pd
from sklearn.model_selection import train_test_split
from sklearn.feature_extraction.text import TfidfVectorizer
from sklearn.linear_model import LogisticRegression
from sklearn import svm
import lightgbm as lgb
from sklearn.metrics import f1_score
from sklearn.externals import joblib
from sklearn.model_selection import GridSearchCV

dataPath = 'H:/nlp/new_data/train_set_0.csv'

df_train = pd.read_csv(dataPath)

vectorizer = TfidfVectorizer(ngram_range=(1, 2), min_df=3, max_df=0.9, sublinear_tf=True)
vectorizer.fit(df_train['word_seg'])
x_train = vectorizer.transform(df_train['word_seg'])

x_train,x_test,y_train,y_test = train_test_split(x_train,df_train['class'],test_size=0.3)

clf = LogisticRegression(C=120, dual=True)

#clf = svm.LinearSVC(C=5, dual=False)

clf.fit(x_train, y_train)
y_prediction = clf.predict(x_test)
f1 = f1_score(y_test, y_prediction, average='micro')
print('The F1 Score: ' + str("%.2f" % f1))


gbm = lgb.sklearn.LGBMClassifier(num_leaves=31,learning_rate=0.05,n_estimators=20)
gbm.fit(x_train,y_train)
gbm_predictions = gbm.predict(x_test)
gbm_f1 = f1_score(y_test, gbm_predictions, average='weighted')
print("The gbm F1 Score: {:.2f}".format(gbm_f1))

 

params = {
    'task': 'train',
    'boosting_type': 'gbdt',  # 设置提升类型
    'objective': 'regression', # 目标函数
    'metric': {'l2', 'auc'},  # 评估函数
    'num_leaves': 31,   # 叶子节点数
    'learning_rate': 0.05,  # 学习速率
    'feature_fraction': 0.9, # 建树的特征选择比例
    'bagging_fraction': 0.8, # 建树的样本采样比例
    'bagging_freq': 5,  # k 意味着每 k 次迭代执行bagging
    'verbose': 1 # <0 显示致命的, =0 显示错误 (警告), >0 显示信息
}
参考文献:

1.https://cloud.tencent.com/developer/news/375910

2.https://blog.csdn.net/huacha__/article/details/81057150

 

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值