使用LightAutoML训练银行流水多分类模型时出现0模型训练完成错误
问题描述
使用LightAutoML的TabularAutoML处理银行流水多分类任务时触发AssertionError,报错提示:Pipeline finished with 0 models for some reason. Probably one or more models failed。任务基于[id, Date, TextTransactionBrief, Charge, Deposit]特征预测Categoria列(如薪资、税费等类别),尝试加入文本特征、简化参数配置后问题仍存在。
原始代码
import pandas as pd from lightautoml.automl.presets.text_presets import TabularAutoML from lightautoml.tasks import Task N_THREADS = 4 # 线程数 # 从CSV文件加载数据集 data = pd.read_csv('C:/Dataset2023_24.csv') # 检查'Categoria'列是否存在NaN值,若有则用默认值填充或删除 data['Categoria'] = data['Categoria'].fillna('Desconocido') # 定义字段角色:'target'为类别列,'drop'为需要丢弃的id列 roles = {'target': 'Categoria', 'drop': ['id']} # 定义任务类型:多分类任务 task = Task('multiclass') # 若只有两类可改为'binary' # 实例化AutoML模型 automl = TabularAutoML(task=task, cpu_limit=N_THREADS, reader_params = {'n_jobs':N_THREADS}, general_params = {'use_algos':[['linear_l2','lgb','lgb_tuned']]}, tuning_params = {'max_tuning_time':25*60}, timeout=600) # 可调整超时时间(单位:秒) # 训练模型 oof_pred = automl.fit_predict(data, roles=roles) # 输出Out-of-Fold(OOF)预测结果 print(oof_pred) # 如需保存训练好的模型 automl.save_model('trained_model.pkl') # 若要对新数据集进行预测,可使用以下代码: # test_data = pd.read_csv('path_to_test_data.csv') # preds = automl.predict(test_data) # print(preds)
报错日志
Traceback (most recent call last): File "C:\Users\Compumex\Documents\Desarrollo\MainTabSBC_GPT.py", line 29, in <module> oof_pred = automl.fit_predict(data, roles=roles) File "C:\Users\Compumex\AppData\Local\Programs\Python\Python310\lib\site-packages\lightautoml\automl\presets\tabular_presets.py", line 721, in fit_predict oof_pred = super().fit_predict(train, roles=roles, cv_iter=cv_iter, valid_data=valid_data, verbose=verbose) File "C:\Users\Compumex\AppData\Local\Programs\Python\Python310\lib\site-packages\lightautoml\automl\presets\base.py", line 208, in fit_predict result = super().fit_predict( File "C:\Users\Compumex\AppData\Local\Programs\Python\Python310\lib\site-packages\lightautoml\automl\base.py", line 218, in fit_predict pipe_pred = ml_pipe.fit_predict(train_valid) File "C:\Users\Compumex\AppData\Local\Programs\Python\Python310\lib\site-packages\lightautoml\pipelines\ml\base.py", line 135, in fit_predict assert ( AssertionError: Pipeline finished with 0 models for some reason. Probably one or more models failed
简化参数版本代码
task = Task('multiclass') # 若只有两类可改为'binary' # 实例化AutoML模型 automl = TabularAutoML(task=task, timeout=3600) # 可调整超时时间(单位:秒) # 训练模型 oof_pred = automl.fit_predict(data, roles=roles) # 输出Out-of-Fold(OOF)预测结果 print(oof_pred)
解决思路与方案
1. 排查数据集核心问题
- 目标列校验:检查
Categoria列的类别分布,确认是否存在样本数为0的类别,或所有样本属于同一类别(这种情况多分类任务无意义)。执行以下代码查看:print(data['Categoria'].value_counts()) - 特征数据校验:
- 检查
Charge、Deposit是否存在大量缺失值或异常值(如无穷大):print(data[['Charge', 'Deposit']].isna().sum()) print(data[['Charge', 'Deposit']].describe()) - 确认
Date列是否为字符串格式,未转换为datetime可能导致特征处理失败,建议转换:data['Date'] = pd.to_datetime(data['Date'], errors='coerce') # 检查转换后缺失值 print(data['Date'].isna().sum()) - 检查
TextTransactionBrief是否全为空值,若为空则文本特征无意义,需移除该列或填充:print(data['TextTransactionBrief'].isna().sum())
- 检查
2. 调整LightAutoML配置与日志
- 开启详细日志:在
TabularAutoML实例化时添加verbose=3,查看每个模型训练的具体报错信息,定位是哪个模型失败:automl = TabularAutoML(task=task, cpu_limit=N_THREADS, reader_params={'n_jobs':N_THREADS}, general_params={'use_algos':[['linear_l2','lgb','lgb_tuned']]}, tuning_params={'max_tuning_time':25*60}, timeout=600, verbose=3) - 明确文本特征角色:使用
text_presets的TabularAutoML时,需在roles中指定文本列,否则模型无法正确处理文本特征:roles = {'target': 'Categoria', 'drop': ['id'], 'text': ['TextTransactionBrief']} - 简化模型测试:先只训练单个简单模型(如
linear_l2),排除流水线复杂配置的问题:automl = TabularAutoML(task=task, cpu_limit=N_THREADS, reader_params={'n_jobs':N_THREADS}, general_params={'use_algos':[['linear_l2']]}, timeout=1200, verbose=3) - 确认任务类型:若
Categoria列只有2个类别,需将Task改为binary,错误的任务类型会导致模型训练失败。
3. 单独调试单个模型
若上述步骤仍无法定位问题,可单独训练单个模型,排查是否为数据适配问题:
import pandas as pd from lightautoml.tasks import Task from lightautoml.ml_algo.lgb import LGB from lightautoml.pipelines.features.lgb_pipeline import LGBSimpleFeatures from lightautoml.pipelines.ml.base import MLPipeline data = pd.read_csv('C:/Dataset2023_24.csv') data['Categoria'] = data['Categoria'].fillna('Desconocido') data['Date'] = pd.to_datetime(data['Date'], errors='coerce') roles = {'target': 'Categoria', 'drop': ['id'], 'text': ['TextTransactionBrief']} task = Task('multiclass') # 构建简单特征流水线与单个LGB模型 feats_pipe = LGBSimpleFeatures() ml_algo = LGB(task=task) pipe = MLPipeline([ml_algo], pre_selection=None, features_pipeline=feats_pipe) # 训练并查看报错 pipe.fit(data, roles=roles)
内容的提问来源于stack exchange,提问作者Matriz51
相关产品推荐
相关产品推荐

