调用StandardScaler.fit_transform处理字符串数据时报错咨询
报错根因
StandardScaler的作用是对数值特征做Z-score标准化,计算逻辑要求输入必须是纯数值类型,本身不支持自动转换字符串格式的类别特征,直接传入包含'Spain'这类字符串值的数据集时,就会抛出无法将字符串转浮点数的错误。
你参考Udemy课程代码运行失败,是因为课程示例在调用StandardScaler前已经完成了类别特征的编码预处理,你遗漏了这一步。
修复方案
- 先对字符串类型的类别特征做编码转换,再执行标准化操作:
- 地区这类无高低顺序的多分类标称特征,使用独热编码(OneHotEncoder)处理,避免人为给类别引入不存在的大小优先级
- 性别这类二分类特征,使用标签编码(LabelEncoder)或独热编码均可
- 可以通过
ColumnTransformer把类别编码、数值标准化的步骤合并到同一个预处理流里,避免数据泄露,参考代码如下:
from sklearn.preprocessing import StandardScaler, OneHotEncoder from sklearn.compose import ColumnTransformer # 替换为你数据集里实际的类别列名 categorical_columns = ['region', 'gender'] numeric_columns = [col for col in X_train.columns if col not in categorical_columns] # 定义预处理逻辑:类别列做独热编码,数值列做标准化 data_preprocessor = ColumnTransformer( transformers=[ ("category_encode", OneHotEncoder(sparse_output=False), categorical_columns), ("numeric_scaler", StandardScaler(), numeric_columns) ] ) # 一次性完成编码+标准化处理 X_train = data_preprocessor.fit_transform(X_train)
注意:所有特征缩放类操作(标准化、归一化等)都必须在非数值特征完成编码转换之后执行,禁止直接向缩放器传入字符串类型数据。
内容的提问来源于stack exchange,提问作者LidorTubul
相关产品推荐
相关产品推荐

