logo
0
0
WeChat Login
fix: 实现手动归一化和sklearn归一化

数据归一化处理示例

本项目包含两种数据归一化方法的实现示例,用于演示如何对CSV数据进行Min-Max归一化处理。

环境要求

  • Python 3.9+
  • pandas
  • scikit-learn

Docker环境

构建镜像

docker build -t cat-normalization .

运行脚本

docker run --rm -v $(pwd):/app cat-normalization python normalize.py

数据说明

输入数据 (input.csv)

NoLwskLEarWeight
134.0823520
2NaN634490
345.0902480
428.0914030
537.0598000
639.0526130
748.0525310
847.0495280

其中第2行(No=2)的Lwsk列包含空值NaN,用于测试空值处理功能。

输出数据

归一化后的数据值范围将被映射到[0, 1]区间。

归一化方法

方法1:手动实现Max-Min归一化(例4.1)

def MaxMinNormalization(x): """ 手动实现Min-Max归一化 公式:(x - min) / (max - min) """ shapeX = x.shape rows = shapeX[0] # 行数 cols = shapeX[1] # 列数 headers = list(x) # Header行 result = pd.DataFrame(columns=headers) # 存放结果的空DataFrame for i in range(0, rows, 1): dict1 = {} # 存放每一行结果的字典 dict1[headers[0]] = i for j in range(1, cols, 1): maxCol = x[headers[j]].max() # j列最大值 minCol = x[headers[j]].min() # j列最小值 val = (x.iloc[i, j] - minCol) / (maxCol - minCol) # i行j列数据的归一化结果 dict1[headers[j]] = val result = pd.concat([result, pd.DataFrame([dict1])], ignore_index=True) # 把i行结果添加到result return result

特点:

  • 保留原始所有行(包括含空值的行)
  • 第一列(No)被替换为行索引
  • 空值保留为NaN
  • 逐行逐列手动计算归一化值

输出示例:

No Lwsk LEar Weight 0 0 0.30 0.785714 0.188406 1 1 NaN 0.333333 0.364130 2 2 0.85 0.976190 0.000000 3 3 0.00 1.000000 0.280797 4 4 0.45 0.238095 1.000000 5 5 0.55 0.071429 0.661232 6 6 1.00 0.071429 0.512681 7 7 0.95 0.000000 0.507246

方法2:使用sklearn进行归一化(例4.2)

from sklearn import preprocessing data1 = pd.read_csv('CatInfo.csv') x = data1.dropna(axis=0) # 去除含有空值的行 min_max_scaler = preprocessing.MinMaxScaler() x_minmax = min_max_scaler.fit_transform(x) print(x_minmax)

特点:

  • 自动去除含有空值的行(dropna)
  • 使用sklearn.preprocessing.MinMaxScaler
  • 返回numpy数组格式
  • 对所有数值列进行归一化
  • 代码简洁,适合生产环境使用

输出示例:

[[0. 0.3 0.78571429 0.1884058 ] [0.28571429 0.85 0.97619048 0. ] [0.42857143 0. 1. 0.2807971 ] [0.57142857 0.45 0.23809524 1. ] [0.71428571 0.55 0.07142857 0.66123188] [0.85714286 1. 0.07142857 0.51268116] [1. 0.95 0. 0.50724638]]

Min-Max归一化原理

公式:

X_normalized = (X - X_min) / (X_max - X_min)

其中:

  • X:原始数据值
  • X_min:该列的最小值
  • X_max:该列的最大值
  • X_normalized:归一化后的值(范围[0, 1])

作用:

  • 消除不同特征量纲的影响
  • 将数据统一到相同的尺度范围
  • 便于机器学习算法收敛
  • 提高模型训练效果

使用示例

运行完整脚本

python normalize.py

单独使用方法1

import pandas as pd data1 = pd.read_csv('input.csv') newData = MaxMinNormalization(data1) print('归一化后数据:\n', newData)

单独使用方法2

import pandas as pd from sklearn import preprocessing data1 = pd.read_csv('input.csv') x = data1.dropna(axis=0) # 去除含有空值的行 min_max_scaler = preprocessing.MinMaxScaler() x_minmax = min_max_scaler.fit_transform(x) print(x_minmax)

两种方法对比

特性手动实现sklearn实现
空值处理保留空值自动去除空值行
输出格式DataFramenumpy数组
代码复杂度较高简洁
适用场景学习理解原理生产环境
第一列处理替换为索引归一化处理
性能较慢(循环)快(向量化)

文件说明

  • normalize.py - 归一化脚本主文件
  • input.csv - 输入数据文件
  • output.csv - 输出结果文件(如果保存)
  • Dockerfile - Docker环境配置
  • README.md - 项目说明文档

注意事项

  1. 手动方法和sklearn方法在去除空值后,归一化的基准(最大值和最小值)会不同,因此结果会有差异
  2. sklearn方法自动去除空值行,输出的数据行数会减少
  3. 如果数据中某列所有值相同,归一化会产生除零错误,需要特殊处理
  4. 归一化只适用于数值型数据,分类数据不适用

扩展阅读