如何仅对DataFrame中的连续变量做归一化并忽略分类变量?
问题说明
对DataFrame执行MinMaxScaler归一化时触发以下报错:
ValueError: could not convert string to float: 'M'
报错根因是传入缩放器的数据集包含字符串类型的分类列,缩放器无法将字符串转为浮点型数值计算,且不会自动识别区分连续变量和分类变量。原有实现代码如下:
X=data mms=MinMaxScaler() mms.fit(X) Xnorm=mms.transform(X) print(Xnorm.min(axis=0)) print(Xnorm.max(axis=0)) print(Xnorm.shape)
实现方法
核心思路是先识别数据集中的连续数值列,仅对这部分列执行归一化操作,分类列保留原值即可,有两种常用实现方案:
- 方案1:手动筛选数值列处理后拼接
先通过pandas内置的类型筛选方法取出所有数值列,单独做归一化后再和原数据的分类列合并,代码逻辑简单易读:import pandas as pd from sklearn.preprocessing import MinMaxScaler X = data # 筛选所有数值类型的连续变量列名 numeric_cols = X.select_dtypes(include='number').columns.tolist() mms = MinMaxScaler() # 仅对数值列做归一化拟合与转换 scaled_numeric = mms.fit_transform(X[numeric_cols]) # 拷贝原数据,将归一化后的数值替换回对应列,保留分类列原值 Xnorm = X.copy() Xnorm[numeric_cols] = scaled_numeric # 校验归一化结果 print(Xnorm[numeric_cols].min(axis=0)) print(Xnorm[numeric_cols].max(axis=0)) print(Xnorm.shape) - 方案2:用sklearn的ColumnTransformer指定列处理规则
适合后续要接入sklearn建模流水线的场景,可以直接在转换器中定义不同列的处理逻辑,非数值列设置为直接透传:from sklearn.compose import ColumnTransformer from sklearn.preprocessing import MinMaxScaler X = data numeric_cols = X.select_dtypes(include='number').columns.tolist() # 定义列转换规则:数值列做MinMax归一化,其余列原样保留 col_transformer = ColumnTransformer( transformers=[ ('minmax_scaler', MinMaxScaler(), numeric_cols) ], remainder='passthrough' ) Xnorm = col_transformer.fit_transform(X)
提示:如果处理后的数据要用于模型训练,分类列不能直接保留字符串格式,需要额外根据场景做标签编码、独热编码等数值化转换。
内容的提问来源于stack exchange,提问作者P.Brito
相关产品推荐
相关产品推荐

