lightgbm原生支持类别特征,需将列转为category类型并用categorical_feature参数指定,而非one-hot或label编码。

ValueError: DataFrame.dtypes for data must be int, float or bool
这是最常遇到的报错,本质是 LightGBM 的 Dataset 不接受原始字符串或类别型(object / category)列直接传入。它要求输入数据必须是数值型(int、float、bool),哪怕你打算用原生类别特征功能也得先过这一关。
解决方法不是硬转成数字,而是明确告诉 LightGBM 哪些列是类别特征:
- 用
pd.DataFrame.astype("category")把目标列转为category类型(不是字符串) - 在构建
lgb.Dataset时,通过categorical_feature参数显式传入列名或列索引,例如:categorical_feature=["Sex", "Embarked"] - 确保
free_raw_data=False(默认是True),否则训练后原始数据被释放,后续无法再设类别特征
别用 LabelEncoder 或 OneHotEncoder 预处理——那反而会破坏 LightGBM 的原生优势。
LightGBMError: Do not support special JSON characters in feature name
当你用 pandas.get_dummies() 或其他自动编码方式生成列名时,容易出现 Sex_Male、city_(Beijing) 这类含括号、空格、斜杠或下划线过多的名字,LightGBM(尤其是 v3.0+)会直接拒绝加载。
修复很简单,但必须在构造 Dataset 前完成:
- 检查列名:用
df.columns.tolist()看一眼,找出含(、)、、/、+、=的列 - 批量清洗:运行
df.columns = df.columns.str.replace(r'[^a-zA-Z0-9_]', '_', regex=True) - 去重+截断:如果清洗后出现重复列名(如多个
city__),加个序号后缀:df.columns = [f"{c}_{i}" if c in seen else c for i, c in enumerate(df.columns)]
注意:v2.2.3 及更早版本对此宽松,但不建议降级——新版修复了更多内存和并行问题。
Cannot set categorical feature after freed raw data
这个错误往往出现在二次训练或验证阶段,比如你训练完模型后想拿同一个 Dataset 对象再调一次 set_categorical_feature,就会触发。原因很直接:LightGBM 默认训练完就释放原始数据内存(free_raw_data=True),之后对象只剩直方图结构,没法再改类别定义。
预防方式只有两个:
- 初始化
Dataset时就一次性指定好:lgb.Dataset(data, label=label, categorical_feature=cat_cols, free_raw_data=False) - 如果必须复用,显式禁用自动释放:
free_raw_data=False,但要承担额外内存占用
别指望靠 del dataset 再重建来绕过——只要变量还活着,底层 raw data 就可能已被释放。
ModuleNotFoundError: No module named 'lightgbm'
这不是“没装”,而是“没装对地方”。尤其在 conda 虚拟环境、PyCharm 解释器、Jupyter kernel 多环境共存时,pip install lightgbm 很可能装进了系统 Python,而你的脚本跑在另一个环境里。
验证和修复步骤:
- 在出错的 Python 环境中运行
python -c "import sys; print(sys.executable)",确认当前解释器路径 - 在同一终端执行
{上面路径} -m pip install lightgbm(强制用该解释器安装) - macOS 用户额外检查:
brew install libomp,否则即使导入成功,训练也会崩溃退出(error 138/139) - Windows 用户若遇
OSError [WinError 126],优先重装:先pip uninstall lightgbm,再pip install --upgrade --force-reinstall lightgbm
版本兼容性现在很关键:Python 3.12 必须搭配 lightgbm>=4.0.0,旧版装上也导入失败。
Python免费学习笔记(深入):立即使用
在学习笔记中,你将探索 Python 的核心概念和高级技巧!











