如何将genre列转换为数值以输入神经网络模型?
多值genre列编码实现方案
你遇到的是典型的多标签类别特征编码问题,普通单值类别编码方法(普通独热编码、序数编码)无法适配一条样本对应多个类别的场景,根据你的神经网络结构选择以下两种常用方案即可:
方案1:多标签二值化(适配genre总数较少的场景)
这种方案输出0/1矩阵,每一列对应一个唯一的genre类型,值为1代表当前样本包含该类genre,格式可以直接对接多标签分类任务的神经网络输出层(搭配sigmoid激活使用)。
实现代码如下:
import pandas as pd from sklearn.preprocessing import MultiLabelBinarizer # 1. 先把genre列的字符串拆分为标签列表,分隔符按你数据集实际情况修改(常见为逗号、|、/) # 加strip()是为了去除标签前后多余空格,避免同标签因为空格被识别为不同类 df['genre_list'] = df['genre'].apply(lambda x: [g.strip() for g in x.split(',')]) # 2. 初始化多标签二值化器完成编码 mlb = MultiLabelBinarizer() encoded_genre = mlb.fit_transform(df['genre_list']) # 如需把编码结果拼回原数据表,可执行以下代码 encoded_genre_df = pd.DataFrame(encoded_genre, columns=mlb.classes_)
方案2:ID序列编码(适配genre总数大、需要控制维度的场景)
如果genre总类数太多,二值化会导致特征维度过高、内存占用过大,可以给每个genre分配唯一整数ID,将每条样本的多标签转换为ID序列,后续在神经网络中加入Embedding层做嵌入降维即可。
实现代码如下:
# 1. 复用方案1中拆分好的genre_list列 # 2. 构建genre到ID的映射表,ID从1开始计数,预留0作为序列填充位 all_genres = set() for genre_list in df['genre_list']: all_genres.update(genre_list) genre2id = {genre: idx+1 for idx, genre in enumerate(all_genres)} # 3. 将标签列表转换为ID序列 df['genre_id_seq'] = df['genre_list'].apply(lambda x: [genre2id[g] for g in x]) # 4. 对ID序列做定长补全/截断,适配神经网络固定输入长度要求,maxlen按你的数据分布设置 from tensorflow.keras.preprocessing.sequence import pad_sequences padded_genre_seq = pad_sequences( df['genre_id_seq'], maxlen=5, padding='post', truncating='post' )
注意事项
- 禁止直接对原始genre列使用普通LabelEncoder、OrdinalEncoder,这类工具仅支持单值类别输入,不仅无法处理多值条目,还会给不同类别强加无意义的数值大小关系,干扰模型训练
- 拆分标签前建议先过滤genre列的空值、异常值,避免编码阶段报错
- 如果是做回归类任务而非多标签分类任务,二值化输出也可以直接作为特征输入全连接层
内容的提问来源于stack exchange,提问作者KAUSHAL KUMAR
相关产品推荐
相关产品推荐

