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

运行logisticRegr.fit时报ValueError:无法将字符串转为float: 'CityHotel'如何解决

错误原因

scikit-learn的逻辑回归模型仅支持数值型输入,你数据集中的hotel列是文本类型的二分类特征,取值为CityHotel和ResortHotel,无法直接被模型转换为数值参与计算,因此触发该报错。

解决方案

根据你的使用场景可以任选以下一种方法处理:

  • 方案1:手动映射编码(最适合二值分类特征)
    直接将两个文本值映射为0和1,代码如下:

    hotel_data['hotel'] = hotel_data['hotel'].map({'ResortHotel': 0, 'CityHotel': 1})
    

    执行完上述代码后再拆分数据集、训练模型即可。

  • 方案2:独热编码(通用多分类特征处理方案)
    用pandas的get_dummies方法自动完成分类特征编码,适合后续还有其他多分类文本特征的场景:

    import pandas as pd
    # drop_first=True避免多重共线性,二分类特征仅会生成1列编码字段
    hotel_data = pd.get_dummies(hotel_data, columns=['hotel'], drop_first=True)
    
  • 方案3:Pipeline批量处理(避免数据泄露的规范写法)
    如果不想修改原始数据集,同时避免训练集和测试集的编码逻辑不一致导致的数据泄露,可以用sklearn的Pipeline把预处理和模型训练封装在一起:

    from sklearn.compose import ColumnTransformer
    from sklearn.preprocessing import OneHotEncoder
    from sklearn.pipeline import Pipeline
    from sklearn.linear_model import LogisticRegression
    
    # 指定需要编码的分类特征列,有多个同类特征可一并填入
    cat_cols = ['hotel']
    preprocessor = ColumnTransformer(
        transformers=[('cat', OneHotEncoder(drop='first'), cat_cols)],
        remainder='passthrough' # 其余数值列保留原有值
    )
    
    # 封装预处理+模型的Pipeline
    logisticRegr = Pipeline(steps=[
        ('preprocessor', preprocessor),
        ('classifier', LogisticRegression(max_iter=1000))
    ])
    
    # 直接传入原始拆分后的训练集即可正常训练
    logisticRegr.fit(x_train, y_train)
    

内容的提问来源于stack exchange,提问作者George Zambrano

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.01 05:48:02