机器学习建模时如何将月份缩写预处理为可输入模型的整数格式
月份字符串转模型可用整数的实现方案
针对逗号分隔的多月份字符串列、含空值的场景,优先采用多热整数编码方案,输出全为0/1整数类型,无字符串、无缺失值,不会给模型引入错误的数值关系,可直接输入建模。
- 预定义固定的月份缩写与数字映射关系,避免运行时顺序错乱导致编码不一致
- 先将空值替换为空字符串,按逗号拆分每行得到月份列表,避免空值拆分报错
- 遍历所有月份,逐行判断当前月份是否在该行的月份列表中,出现则标记为1,未出现标记为0,统一转为int类型
- 若空值有特殊业务含义(代表未知月份),可额外新增1列0/1整数列单独标记空值,不要直接留空。
代码实现(pandas环境)
import pandas as pd import numpy as np # 加载原始数据 df = pd.DataFrame({ 'col': [np.nan, 'Jan,Apr,Jul,Oct', 'Jan,Jun,Jul', 'Apr,May,Oct,Nov', np.nan] }) # 固定月份映射:1-12对应公历1-12月,映射关系全局固定 month_map = { 'Jan': 1, 'Feb': 2, 'Mar': 3, 'Apr': 4, 'May': 5, 'Jun': 6, 'Jul': 7, 'Aug': 8, 'Sep': 9, 'Oct': 10, 'Nov': 11, 'Dec': 12 } # 空值替换为空串后,按逗号拆分得到每行的月份列表 df['month_list'] = df['col'].fillna('').str.split(',') # 逐个生成月份对应的0/1整数列 for month_abbr, month_num in month_map.items(): df[f'month_{month_num}'] = df['month_list'].apply(lambda x: 1 if month_abbr in x else 0).astype(int) # 删除中间处理列,得到最终建模数据集 df = df.drop(columns=['month_list'])
处理后效果示例
处理后所有新增列均为整数类型,无缺失值,可直接输入模型:
| 索引 | col | month_1 | month_4 | month_5 | month_6 | month_7 | month_10 | month_11 | 其余未出现月份列 |
|---|---|---|---|---|---|---|---|---|---|
| 0 | NaN | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 |
| 1 | Jan,Apr,Jul,Oct | 1 | 1 | 0 | 0 | 1 | 1 | 0 | 0 |
| 2 | Jan,Jun,Jul | 1 | 0 | 0 | 1 | 1 | 0 | 0 | 0 |
| 3 | Apr,May,Oct,Nov | 0 | 1 | 1 | 0 | 0 | 1 | 1 | 0 |
| 4 | NaN | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 |
注意避坑
不要直接把月份数字拼接为单个整数(比如把Jan、Apr、Jul、Oct直接拼接为14710),这类数值没有实际业务含义,会给模型引入错误的数值大小、距离关系,严重影响建模效果。
内容的提问来源于stack exchange,提问作者lima0
相关产品推荐
相关产品推荐

