数据竞赛-“达观杯”文本智能处理-Day5:LightGBM模型

数据竞赛-“达观杯”文本智能处理-Day5:LightGBM模型

【Task3.2】LightGBM模型

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

要求:理论+代码+截图F1评分的结果

参考:https://github.com/Heitao5200/DGB/blob/master/model/model_code/LGB_data_w_tfidf.py

1.理论学习

LightGBM是个快速的,分布式的,高性能的基于决策树算法的梯度提升框架。可用于排序,分类,回归以及很多其他的机器学习任务中。

LightGBM是基于决策树算法的,它采用最优的leaf-wise策略分裂叶子节点,然而其它的提升算法分裂树一般采用的是depth-wise或者level-wise。因此,在LightGBM算法中,当增长到相同的叶子节点,leaf-wise算法比level-wise算法减少更多的loss,因此有更高的精度。它具有以下优势:

  • 速度和内存使用的优化
    • 减少分割增益的计算量
    • 通过直方图的相减来进行进一步的加速
    • 减少内存的使用 减少并行学习的通信代价
  • 稀疏优化
  • 准确率的优化
    • Leaf-wise (Best-first) 的决策树生长策略
    • 类别特征值的最优分割
  • 网络通信的优化
  • 并行学习的优化
    • 特征并行
    • 数据并行
    • 投票并行
  • GPU 支持可处理大规模数据

2.实践

import numpy as np
import pandas as pd
from sklearn.model_selection import train_test_split
from sklearn.metrics import f1_score
import time
import pickle
import lightgbm as LGB
from sklearn.externals import joblib

t_start = time.time()
print("------------------程序开始---------------------")
feature_path = 'feature/'
model_path = 'model/'
result_path = 'result/'

"""=====================================================================================================================
0 自定义验证集的评价函数
"""
print("0 自定义验证集的评价函数")
def f1_score_vali(preds, data_vali):
    labels = data_vali.get_label()
    preds = np.argmax(preds.reshape(19, -1), axis=0)
    score_vali = f1_score(y_true=labels, y_pred=preds, average='macro')
    return 'f1_score', score_vali, True


"""=====================================================================================================================
1 读取数据,并转换到LGB的标准数据格式
"""
print("1 读取数据,并转换到LGB的标准数据格式")
data_fp = open(feature_path + 'data_w_tfidf.pkl' , 'rb')
x_train, y_train, x_test = pickle.load(data_fp)
data_fp.close()

"""=====================================================================================================================
2 划分训练集和验证集,验证集比例为test_size
"""
print("2 划分训练集和验证集,验证集比例为test_size")
x_train, x_vali, y_train, y_vali = train_test_split(x_train, y_train, test_size=0.1, random_state=0)
d_train = LGB.Dataset(data=x_train, label=y_train)
d_vali = LGB.Dataset(data=x_vali, label=y_vali)

"""=====================================================================================================================
3 训练LGB分类器
"""
print("3 训练LGB分类器")
params = {
    'boosting': 'gbdt',
    'application': 'multiclassova',
    'num_class': 19,
    'learning_rate': 0.1,
    'num_leaves': 31,
    'max_depth': -1,
    'lambda_l1': 0,
    'lambda_l2': 0.5,
    'bagging_fraction': 1.0
}

bst = LGB.train(params, d_train, num_boost_round=800, valid_sets=d_vali, feval=f1_score_vali,
                early_stopping_rounds=None,
                verbose_eval=True)

joblib.dump(bst, model_path + "LGB_data_w_tfidf.m")

"""=====================================================================================================================
4 对测试集进行预测;将预测结果转换为官方标准格式;并将结果保存至本地
"""
print("4 对测试集进行预测;将预测结果转换为官方标准格式;并将结果保存至本地")
y_proba = bst.predict(x_test)
y_test = np.argmax(y_proba, axis=1) + 1

df_result = pd.DataFrame(data={'id': range(5000), 'class': y_test.tolist()})
df_proba = pd.DataFrame(data={'id': range(5000), 'proba': y_proba.tolist()})

df_result.to_csv(result_path  + 'LGB_data_w_tfidf_result.csv', index=False)
df_proba.to_csv(result_path + 'LGB_data_w_tfidf_proba.csv', index=False)
t_end = time.time()
print("训练结束,耗时:{}min".format((t_end - t_start) / 60))

参考文献及补充阅读:

  1. LightGBM中文文档
  2. lightGBM原理、改进简述

猜你喜欢

转载自blog.csdn.net/hsk6543210/article/details/89288744