在银行数据上实现Logistic Regression遇ValueError:无法转字符串为浮点数
问题原因
RobustScaler 仅能处理数值型特征,你的训练集 X_train 中包含字符串类型的分类特征(比如报错中的 'low working hours'),这类特征无法直接转换为浮点数,导致抛出 ValueError。
解决方案
先识别并处理所有字符串/分类特征,再对数值特征进行缩放,以下是两种常用处理方式:
1. 序数编码(适用于有序分类特征)
如果分类特征存在明确顺序(如 low working hours < medium working hours < high working hours),可以用序数编码将字符串映射为有序数值:
from sklearn.preprocessing import OrdinalEncoder import pandas as pd # 筛选所有字符串类型特征 categorical_cols = X_train.select_dtypes(include=['object']).tolist() # 初始化编码器,指定分类顺序(以工作时长为例) ordinal_encoder = OrdinalEncoder(categories=[['low working hours', 'medium working hours', 'high working hours']]) # 对训练集和测试集的分类特征编码 X_train[categorical_cols] = ordinal_encoder.fit_transform(X_train[categorical_cols]) X_test[categorical_cols] = ordinal_encoder.transform(X_test[categorical_cols]) # 再进行RobustScaler缩放 scaler = RobustScaler() X_train = scaler.fit_transform(X_train) X_test = scaler.transform(X_test)
2. 独热编码(适用于无序分类特征)
如果分类特征无明确顺序(如职业、地区),用独热编码将其转换为二进制特征,避免模型错误学习顺序关系:
from sklearn.preprocessing import RobustScaler, OneHotEncoder from sklearn.compose import ColumnTransformer # 区分数值特征和分类特征 numeric_cols = X_train.select_dtypes(exclude=['object']).tolist() categorical_cols = X_train.select_dtypes(include=['object']).tolist() # 构建预处理流水线,同时处理两类特征 preprocessor = ColumnTransformer( transformers=[ ('num_scaler', RobustScaler(), numeric_cols), ('cat_encoder', OneHotEncoder(sparse_output=False, drop='first'), categorical_cols) ]) # 应用预处理(训练集fit+transform,测试集仅transform) X_train_processed = preprocessor.fit_transform(X_train) X_test_processed = preprocessor.transform(X_test)
注意事项
- 必须保证训练集和测试集使用相同的编码规则:仅在训练集上调用
fit(),测试集只调用transform(),避免数据泄露。 - 有序分类优先用序数编码,无序分类用独热编码,否则会影响模型效果。
内容的提问来源于stack exchange,提问作者ABHIJITH B
相关产品推荐
相关产品推荐

