达观数据比赛 第五天任务

今天学习lightbgm算法,算是一种比较不错的轻量级的集成算法把~

【任务 3.2】LightGBM模型 时常: 2天

构建LightGBM的模型(包括:模型构建&调参&性能评估),学习理论并用Task2的特征实践

 

LightGBM有更快的训练速度和更高的效率,这是因为它是一种使用基于直方图的算法

例如,它将连续的特征值分桶(buckets)装进离散的箱子(bins),这是的训练过程中变得更快。

它与XGBoost的不同之处在于分裂节点的方式不一样。LGB避免了对整层节点分裂法,而采用了对增益最大的节点进行深入分解的方法。这样节省了大量分裂节点的资源。下图一是XGBoost的分裂方式,图二是LightGBM的分裂方式。

XGBoost分裂方式:

 

                                            

LightGBM分裂方式:

                                            

 

除此之外LightGMB还有如下的一些优势:

(1) 更低的内存占用:使用离散的箱子(bins)保存并替换连续值导致更少的内存占用。

(2) 更高的准确率(相比于其他任何提升算法):它通过leaf-wise分裂方法产生比level-wise分裂方法更复杂的树,这就是实现更高准确率的主要因素。然而,它有时候或导致过拟合,但是我们可以通过设置 max-depth参数来防止过拟合的发生。

(3) 大数据处理能力:相比于XGBoost,由于它在训练时间上的缩减,它同样能够具有处理大数据的能力。

(4) 支持并行学习。

我们都知道,XGB一共有三类参数通用参数,学习目标参数,Booster参数。对于LightGBM,有核心参数,学习控制参数,IO参数,目标参数,度量参数,网络参数,GPU参数,模型参数,这里我们常常修改得是核心参数,学习控制参数,度量参数等。具体的参数信息请参看参考文献。

最后提出代码供大家学习,欢迎大家评论及私信交流,会及时回复。这里有两种方法来使用LightGBM模型,大家可以都看看吧。Method2和我们习惯性使用sklearn中模型的方法更加贴切。

import pandas as pd
from sklearn.model_selection import train_test_split
from sklearn.feature_extraction.text import TfidfVectorizer
import gensim
import time
import pickle
import numpy as np
import csv,sys
from sklearn import svm
from sklearn.metrics import accuracy_score, precision_score, recall_score, f1_score
from sklearn.linear_model import LogisticRegression
import lightgbm as lgb
from sklearn.model_selection import GridSearchCV

# read data
df = pd.read_csv('data/train_set.csv', nrows=5000)
df.drop(columns='article', inplace=True)
# # observe data
# print(df['class'].value_counts(normalize=True, ascending=False))

# TF-IDF
vectorizer = TfidfVectorizer(ngram_range=(1, 2), min_df=3, max_df=0.9, sublinear_tf=True)
vectorizer.fit(df['word_seg'])
x_train = vectorizer.transform(df['word_seg'])

# split training set and validation set
predictor = ['word_seg']
x_train, x_validation, y_train, y_validation = train_test_split(x_train, df['class'], test_size=0.2)

clf = svm.LinearSVC(C=5, dual=False)
clf = LogisticRegression(C=120, dual=True)

# Method 1 for creating model 
# # create dataset for lightgbm
# lgb_train = lgb.Dataset(x_train, y_train)
# # specify your configurations as a dict
# params = {
#     'boosting_type': 'gbdt',
#     'objective': 'multiclass',
#     'metric': 'multi_error',
#     'num_leaf': 31,
#     'learning_rate': 0.05,
#     'feature_fraction': 0.9,
#     'bagging_fraction': 0.8,
#     'bagging_freq': 5,
#     'num_class': 20,
# }
# print('Start training...')
# # train
# gbm = lgb.train(params,
#                 lgb_train,
#                 num_boost_round=20)
# y_prediction = gbm.predict(x_validation, num_iteration=gbm.best_iteration)
# result = []
# for pred in y_prediction:
#     result.append(int(np.argmax(pred)))
# clf.fit(x_train, y_train)
# y_prediction = clf.predict(x_validation)


# Method 2 for creating model 
# # create dataset for lightgbm
# lgb = lgb.sklearn.LGBMClassifier(num_leaves=30, learning_rate=0.1, n_estimators=20)
# lgb.fit(x_train, y_train)
# y_prediction = lgb.predict(x_validation)
# label = []
# for i in range(1, 20):
#     label.append(i)
# f1 = f1_score(y_validation, y_prediction, labels=label, average='micro')
# print('The F1 Score: ' + str("%.4f" % f1))


# grid search for better parameters for model 
lgb = lgb.sklearn.LGBMClassifier()
param_grid = {
    'learning_rate': [0.01, 0.1, 0.5],
    'n_estimators': [30, 40]
}
gbm = GridSearchCV(lgb, param_grid)
gbm.fit(x_train, y_train)
print('网格搜索得到的最优参数是:', gbm.best_params_)



F1测试结果如下所示:

 

参考文献:

1. 掘金 香橙云子 https://juejin.im/post/5b76437ae51d45666b5d9b05

2.CSDN Ghost_Hzp https://blog.csdn.net/weixin_39807102/article/details/81912566

 

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值