运行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
相关产品推荐
相关产品推荐

