You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

逻辑回归、RF、GBDT建模的数据编码方法及报错解决

问题根因

报错的核心原因是scikit-learn原生模型仅接受数值型输入,你传入的特征矩阵中包含tokens、day两个非数值字段,且tokens当前是字符串格式的词元列表,没有转换为模型可识别的数值向量,无法完成训练。

分步解决流程
  • 第一步:统一标签格式
    你的score字段当前是object类型,即使取值仅为0/1也需要先转为整数型,避免后续训练出现维度或类型告警,直接取为Series即可,不需要存为DataFrame:

    y = df['score'].astype(int)
    
  • 第二步:修正tokens字段格式
    你当前的tokens是字符串形式的列表(例如"['word1', 'word2']"),不是Python原生列表对象,需要先解析为真实列表,再拼接为TF-IDF可处理的空格分隔文本:

    import ast
    # 注意不要用eval()解析字符串,存在安全风险,用标准库ast.literal_eval即可
    df['tokens_text'] = df['tokens'].apply(lambda x: ' '.join(ast.literal_eval(x)))
    

    如果确认tokens列已经是原生列表类型,跳过ast.literal_eval步骤直接拼接即可。

  • 第三步:用ColumnTransformer封装预处理逻辑,避免数据泄露
    注意:绝对不要先对全量数据做TF-IDF、编码再拆分训练测试集,否则会导致严重的数据泄露,模型验证结果完全不可信。所有预处理步骤需要和模型绑定为管道,仅在训练集上拟合预处理逻辑,再分别转换训练、测试集:

    • 文本特征tokens_text:用TfidfVectorizer做向量化,可根据需求设置max_features、ngram_range等参数过滤低频词、加入n元语法特征
    • 分类特征day:属于无序类别标签,逻辑回归场景下用独热编码即可,注意设置handle_unknown='ignore'避免测试集出现未见过的日期值时报错
    • 数值/ID特征doc_no、personal_no:如果没有明确业务逻辑证明编号大小和预测目标相关,建议直接删除这两个字段,避免引入噪声;如果要保留,不需要额外编码,直接透传即可
      完整可运行的管道代码示例:
    from sklearn.model_selection import train_test_split
    from sklearn.compose import ColumnTransformer
    from sklearn.feature_extraction.text import TfidfVectorizer
    from sklearn.preprocessing import OneHotEncoder
    from sklearn.linear_model import LogisticRegression
    from sklearn.pipeline import Pipeline
    
    # 重新定义特征,用处理好的tokens_text替换原tokens列
    X = df[['doc_no', 'personal_no', 'tokens_text', 'day']]
    y = df['score'].astype(int)
    X_train, X_test, y_train, y_test = train_test_split(X, y, random_state=0, train_size=0.8)
    
    # 定义不同类型特征的预处理规则
    preprocessor = ColumnTransformer(
        transformers=[
            ('tfidf', TfidfVectorizer(max_features=10000, ngram_range=(1,2)), 'tokens_text'),
            ('cat', OneHotEncoder(handle_unknown='ignore'), ['day']),
            ('num', 'passthrough', ['doc_no', 'personal_no']) # 要删ID列的话直接去掉这一行
        ]
    )
    
    # 绑定预处理和逻辑回归模型为完整管道
    lr_pipeline = Pipeline(steps=[
        ('preprocess', preprocessor),
        ('clf', LogisticRegression(max_iter=1000))
    ])
    
    # 直接训练即可,不会再报类型错误
    lr_pipeline.fit(X_train, y_train)
    # 测试集评估
    print(lr_pipeline.score(X_test, y_test))
    
训练随机森林(RF)、梯度提升决策树(GBDT)的额外注意事项
  • 树模型对特征尺度不敏感,不需要像逻辑回归那样对数值特征做标准化、归一化,这部分步骤可以直接省略。
  • 高维稀疏的TF-IDF特征不适合直接输入sklearn原生的RF、GBDT实现:这类实现没有针对稀疏特征做优化,分裂时需要遍历所有特征维度,文本场景下TF-IDF维度通常在大几千到几万,训练耗时会极长。如果要保留全量TF-IDF特征,建议换用LightGBM这类对稀疏特征有专项优化的树模型实现;如果坚持用sklearn,建议先通过卡方检验、互信息法筛选和标签相关性最高的1000-3000个特征再训练。
  • 类别特征不需要做独热编码:独热编码会进一步拉高特征维度,大幅降低树模型训练效率。如果用XGBoost、LightGBM这类现代实现,直接指定类别特征列即可,模型会自动处理最优分裂;如果用sklearn原生实现,用序数编码替代独热编码即可,记得给测试集中可能出现的未知类别预留单独编码位。
  • 谨慎传入ID类特征:doc_no、personal_no这类纯编号字段没有实际业务含义,树模型很容易记住编号和标签的偶然对应关系,导致严重过拟合,如果没有明确逻辑证明这两个字段和score相关,直接从特征列中删除即可。
  • 树模型对缺失值、异常值的鲁棒性远高于逻辑回归,后续如果加入带缺失值的特征,不需要强制做均值/众数填充,支持缺失值分裂的树实现可以直接输入训练。

内容的提问来源于stack exchange,提问作者Muriël Valckx

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.29 20:01:22