机器学习预处理:如何实现Pandas DataFrame列的normalise及相关疑问
问题背景
我目前正在为Machine Learning任务预处理数据集,希望对所有数值列执行normalise操作。我找到了一些解决方案,但均无法实现我预期的效果。
我的目标是将列按以下方式归一化:最小值转换为0,最大值转换为1:
示例
| column | column_normalised |
|---|---|
| 10 | 0 |
| 30 | 1 |
| 20 | 0.5 |
疑问
- 如何实现这一目标?
- 是否需要对数值编码的分类特征执行
normalise,还是保持原样?
解决方案
1. 实现0-1归一化的方法
方法一:Pandas手动计算
适合自定义单/多列处理,逻辑直观:
import pandas as pd # 示例数据集 df = pd.DataFrame({'column': [10, 30, 20], 'num_col2': [1, 5, 3]}) # 对指定列执行归一化 def min_max_normalize(series): return (series - series.min()) / (series.max() - series.min()) df['column_normalised'] = min_max_normalize(df['column']) # 批量处理所有数值列 numeric_cols = df.select_dtypes(include=['int64', 'float64']).columns df[numeric_cols] = df[numeric_cols].apply(min_max_normalize)
方法二:Scikit-learn的MinMaxScaler
适合标准化流水线式处理,是机器学习预处理的常用方案:
from sklearn.preprocessing import MinMaxScaler import pandas as pd scaler = MinMaxScaler(feature_range=(0, 1)) df = pd.DataFrame({'column': [10, 30, 20], 'num_col2': [1, 5, 3]}) # 筛选数值列并归一化 numeric_cols = df.select_dtypes(include=['int64', 'float64']).columns df[numeric_cols] = scaler.fit_transform(df[numeric_cols])
2. 数值编码的分类特征是否需要归一化?
分场景判断:
- 不需要归一化:如果是**标签编码(Label Encoding)**的特征(比如将["猫","狗","兔"]编码为[0,1,2]),这类数值仅作为类别标识,没有大小意义,归一化会混淆类别逻辑,直接保留原编码即可。
- 可以考虑归一化:如果是有序分类的数值编码(比如将["差","中","优"]编码为[1,2,3]),且模型对特征尺度敏感(如线性回归、神经网络、SVM),归一化能帮助模型更快收敛;若模型对尺度不敏感(如决策树、随机森林),归一化与否影响不大。
内容的提问来源于stack exchange,提问作者christophriepe
相关产品推荐
相关产品推荐

