
GPU加速LightGBM训练
GPU加速LightGBM训练
import lightgbm as lgb import numpy as np import pandas as pd # 创建一个小的虚拟数据集 # 假设我们有 1000 个样本,每个样本有 10 个特征 X = np.random.rand(1000, 10) # 特征矩阵 y = np.random.randint(0, 2, size=1000) # 目标变量(0 或 1) # 转换为 LightGBM 数据格式 dtrain = lgb.Dataset(X, label=y) # 定义 LightGBM 模型的参数,启用 GPU params = { 'objective': 'binary', 'metric': 'auc', 'device': 'gpu', # 启用 GPU 'gpu_device_id': 0, # 0 为 GTX 1050 的设备 ID,通常是 0 'num_leaves': 31, 'learning_rate': 0.05, 'feature_fraction': 0.8 } # 训练模型 model = lgb.train(params, dtrain, num_boost_round=100) # 如果 GPU 被启用,你将在训练过程中看到类似这样的日志: # [LightGBM] [Info] Using GPU for training
import lightgbm as lgb
import numpy as np
import pandas as pd
# 创建一个小的虚拟数据集
# 假设我们有 1000 个样本,每个样本有 10 个特征
X = np.random.rand(1000, 10) # 特征矩阵
y = np.random.randint(0, 2, size=1000) # 目标变量(0 或 1)
# 转换为 LightGBM 数据格式
dtrain = lgb.Dataset(X, label=y)
# 定义 LightGBM 模型的参数,启用 GPU
params = {
'objective': 'binary',
'metric': 'auc',
'device': 'gpu', # 启用 GPU
'gpu_device_id': 0, # 0 为 GTX 1050 的设备 ID,通常是 0
'num_leaves': 31,
'learning_rate': 0.05,
'feature_fraction': 0.8
}
# 训练模型
model = lgb.train(params, dtrain, num_boost_round=100)
# 如果 GPU 被启用,你将在训练过程中看到类似这样的日志:
# [LightGBM] [Info] Using GPU for training
结合这个内容import lightgbm as lgb import numpy as np import pandas as pd # 创建一个小的虚拟数据集 # 假设我们有 1000 个样本,每个样本有 10 个特征 X = np.random.rand(1000, 10) # 特征矩阵 y = np.random.randint(0, 2, size=1000) # 目标变量(0 或 1) # 转换为 LightGBM 数据格式 dtrain = lgb.Dataset(X, label=y) # 定义 LightGBM 模型的参数,启用 GPU params = { 'objective': 'binary', 'metric': 'auc', 'device': 'gpu', # 启用 GPU 'gpu_device_id': 0, # 0 为 GTX 1050 的设备 ID,通常是 0 'num_leaves': 31, 'learning_rate': 0.05, 'feature_fraction': 0.8 } # 训练模型 model = lgb.train(params, dtrain, num_boost_round=100) # 如果 GPU 被启用,你将在训练过程中看到类似这样的日志: # [LightGBM] [Info] Using GPU for training 和这个内容,我需要使用gpu做渲染部分:import pandas as pd import numpy as np # 加载数据时指定类型节省内存 dtypes = { 'row_id': 'int64', 'timestamp': 'int64', 'user_id': 'int32', 'content_id': 'int16', 'content_type_id': 'int8', 'task_container_id': 'int16', 'user_answer': 'int8', 'answered_correctly': 'int8', 'prior_question_elapsed_time': 'float32', 'prior_question_had_explanation': 'boolean' } train = pd.read_csv('train.csv', dtype=dtypes) # 过滤掉讲座事件(只保留问题) train = train[train['content_type_id'] == 0].reset_index(drop=True) # 合并题目元数据 questions = pd.read_csv('questions.csv') train = train.merge(questions, left_on='content_id', right_on='question_id', how='left') # 处理空值 train['prior_question_elapsed_time'] = train['prior_question_elapsed_time'].fillna( train['prior_question_elapsed_time'].median()) train['prior_question_had_explanation'] = train['prior_question_had_explanation'].fillna(False) # 标签多热编码 tags_split = train['tags'].str.split(' ', expand=True) tags_dummies = pd.get_dummies(tags_split.stack()).groupby(level=0).max() train = pd.concat([train, tags_dummies], axis=1) # 用户累计正确率 user_correct = train.groupby('user_id')['answered_correctly'].agg(['mean', 'count']) user_correct.columns = ['user_hist_correct_rate', 'user_hist_question_count'] train = train.merge(user_correct, on='user_id', how='left') # 用户最近20题正确率(滑动窗口) train['user_recent_20_correct'] = train.groupby('user_id')['answered_correctly'].transform( lambda x: x.rolling(20, min_periods=1).mean() ) # 题目全局正确率 question_diff = train.groupby('question_id')['answered_correctly'].mean().reset_index() question_diff.columns = ['question_id', 'question_difficulty'] train = train.merge(question_diff, on='question_id', how='left') # 题目在用户所属分组的难度(如TOEIC part) part_diff = train.groupby('part')['answered_correctly'].mean().reset_index() part_diff.columns = ['part', 'part_avg_correct'] train = train.merge(part_diff, on='part', how='left') # 用户答题间隔时间变化率 train['time_diff_rate'] = train.groupby('user_id')['timestamp'].diff().fillna(0) / 1e3 # 转换为秒 # 用户当前任务容器与上次的时间差 train['task_container_gap'] = train.groupby('user_id')['task_container_id'].diff().fillna(0) import lightgbm as lgb from sklearn.model_selection import TimeSeriesSplit # 特征列选择 features = [ 'user_hist_correct_rate', 'user_hist_question_count', 'user_recent_20_correct', 'question_difficulty', 'part_avg_correct', 'prior_question_elapsed_time', 'prior_question_had_explanation', 'time_diff_rate', 'task_container_gap' ] + list(tags_dummies.columns) # 时间序列交叉验证 tscv = TimeSeriesSplit(n_splits=5) X = train[features] y = train['answered_correctly'] for fold, (train_idx, val_idx) in enumerate(tscv.split(X, y)): X_train, y_train = X.iloc[train_idx], y.iloc[train_idx] X_val, y_val = X.iloc[val_idx], y.iloc[val_idx] # 数据集转换 dtrain = lgb.Dataset(X_train, label=y_train) dval = lgb.Dataset(X_val, label=y_val) # 参数设置(优化NPU兼容性) params = { 'objective': 'binary', 'metric': 'auc', 'device': 'cpu', # 若使用英特尔NPU,需安装oneAPI优化版本 'num_leaves': 31, 'learning_rate': 0.05, 'feature_fraction': 0.8 } # 训练 model = lgb.train(params, dtrain, valid_sets=[dval], callbacks=[lgb.log_evaluation(100)]) # 保存模型 model.save_model(f'lgbm_fold{fold}.txt')
你给出的代码中涉及两个不同的部分,一个是使用 LightGBM 训练模型并启用 GPU,另一个是处理和加载数据,进行特征工程,以及用时间序列交叉验证训练模型。你希望结合这两部分的内容,并且使用 GPU 来加速渲染部分(可能指的是训练部分的加速)。
我将会对这两部分代码进行整合,并确保 LightGBM 使用 GPU 进行训练。
整合后的代码(启用 GPU 渲染部分):
python
复制编辑
import lightgbm as lgb import numpy as np import pandas as pd from sklearn.model_selection import TimeSeriesSplit # 加载数据时指定类型节省内存 dtypes = { 'row_id': 'int64', 'timestamp': 'int64', 'user_id': 'int32', 'content_id': 'int16', 'content_type_id': 'int8', 'task_container_id': 'int16', 'user_answer': 'int8', 'answered_correctly': 'int8', 'prior_question_elapsed_time': 'float32', 'prior_question_had_explanation': 'boolean' } train = pd.read_csv('train.csv', dtype=dtypes) # 过滤掉讲座事件(只保留问题) train = train[train['content_type_id'] == 0].reset_index(drop=True) # 合并题目元数据 questions = pd.read_csv('questions.csv') train = train.merge(questions, left_on='content_id', right_on='question_id', how='left') # 处理空值 train['prior_question_elapsed_time'] = train['prior_question_elapsed_time'].fillna( train['prior_question_elapsed_time'].median()) train['prior_question_had_explanation'] = train['prior_question_had_explanation'].fillna(False) # 标签多热编码 tags_split = train['tags'].str.split(' ', expand=True) tags_dummies = pd.get_dummies(tags_split.stack()).groupby(level=0).max() train = pd.concat([train, tags_dummies], axis=1) # 用户累计正确率 user_correct = train.groupby('user_id')['answered_correctly'].agg(['mean', 'count']) user_correct.columns = ['user_hist_correct_rate', 'user_hist_question_count'] train = train.merge(user_correct, on='user_id', how='left') # 用户最近20题正确率(滑动窗口) train['user_recent_20_correct'] = train.groupby('user_id')['answered_correctly'].transform( lambda x: x.rolling(20, min_periods=1).mean() ) # 题目全局正确率 question_diff = train.groupby('question_id')['answered_correctly'].mean().reset_index() question_diff.columns = ['question_id', 'question_difficulty'] train = train.merge(question_diff, on='question_id', how='left') # 题目在用户所属分组的难度(如TOEIC part) part_diff = train.groupby('part')['answered_correctly'].mean().reset_index() part_diff.columns = ['part', 'part_avg_correct'] train = train.merge(part_diff, on='part', how='left') # 用户答题间隔时间变化率 train['time_diff_rate'] = train.groupby('user_id')['timestamp'].diff().fillna(0) / 1e3 # 转换为秒 # 用户当前任务容器与上次的时间差 train['task_container_gap'] = train.groupby('user_id')['task_container_id'].diff().fillna(0) # 特征列选择 features = [ 'user_hist_correct_rate', 'user_hist_question_count', 'user_recent_20_correct', 'question_difficulty', 'part_avg_correct', 'prior_question_elapsed_time', 'prior_question_had_explanation', 'time_diff_rate', 'task_container_gap' ] + list(tags_dummies.columns) # 时间序列交叉验证 tscv = TimeSeriesSplit(n_splits=5) X = train[features] y = train['answered_correctly'] # 训练和验证模型 for fold, (train_idx, val_idx) in enumerate(tscv.split(X, y)): X_train, y_train = X.iloc[train_idx], y.iloc[train_idx] X_val, y_val = X.iloc[val_idx], y.iloc[val_idx] # 数据集转换 dtrain = lgb.Dataset(X_train, label=y_train) dval = lgb.Dataset(X_val, label=y_val) # LightGBM 参数设置(启用 GPU) params = { 'objective': 'binary', 'metric': 'auc', 'device': 'gpu', # 启用 GPU 加速 'gpu_device_id': 0, # 设备ID(通常是0,若有多个GPU可以指定) 'num_leaves': 31, 'learning_rate': 0.05, 'feature_fraction': 0.8 } # 训练模型 model = lgb.train(params, dtrain, valid_sets=[dval], callbacks=[lgb.log_evaluation(100)]) # 保存模型 model.save_model(f'lgbm_fold{fold}.txt')
关键改动:
数据加载和处理部分:
从
train.csv
和questions.csv
中加载数据,处理缺失值,进行特征工程(如用户的正确率、题目难度等)。特征选择部分定义了要使用的特征列。
LightGBM 参数部分:
在
params
中设置了device
为gpu
,启用了 GPU 加速。如果你有多个 GPU 设备,可以通过调整gpu_device_id
来指定使用哪一个设备。时间序列交叉验证:
使用
TimeSeriesSplit
进行交叉验证,每一折都用 LightGBM 训练模型,并通过回调lgb.log_evaluation(100)
打印每 100 次迭代的评估结果。注意事项:
你需要确保你的系统已正确配置并支持 GPU 加速(安装
lightgbm
时要启用 GPU 支持),并且你使用的设备支持 CUDA。如果你没有 GPU 或者不需要 GPU 加速,可以将
device: 'gpu'
改成device: 'cpu'
,在没有 GPU 的情况下进行训练。希望这个版本的代码能满足你的需求!如果有其他问题,随时告诉我!
更多推荐
所有评论(0)