如何利用Python进行数据归一化?

1. 知识简介

数据归一化是数据预处理的一项重要步骤,它对于提高模型性能、加速模型训练、避免数值计算问题以及提高模型的泛化能力都具有重要作用。进行数据归一化可以起到以下作用:消除量纲影响,加速模型收敛,提高模型性能,防止数值计算问题,提高模型泛化能,更好地处理异常值。
建模
辨识方法
方法

正负指标

3.python中实现

3.1 正向型指标和负向型指标

正向型指标的取值范围在0到正无穷,数值越大表示绩效越好。在归一化时,通常使用 Min-Max 归一化方法,将指标缩放到0到1之间。
负向型指标的取值范围在负无穷到0之间,数值越接近0表示绩效越好。在归一化时,也使用 Min-Max 归一化方法,将指标缩放到0到1之间,但需要注意取值范围的定义。

import numpy as np
import pandas as pd

def min_max_normalize(data, method='positive', feature_range=(0, 1)):
    """
    Min-Max归一化

    Parameters:
    - data: 需要进行处理的DataFrame
    - method: 归一化方向,'positive'为正向,'negative'为逆向
    - feature_range: 设置归一化后的最小最大值,默认为 (0, 1)

    Returns:
    - normalized_data: 归一化后的DataFrame
    """
    y_min, y_max = feature_range
    normalized_data = pd.DataFrame()

    for col in data.columns:
        col_max, col_min = data[col].max(), data[col].min()

        if method == 'negative':
            normalized_values = (y_max - y_min) * (col_max - data[col]) / (col_max - col_min) + y_min
        elif method == 'positive':
            normalized_values = (y_max - y_min) * (data[col] - col_min) / (col_max - col_min) + y_min

        normalized_data[col] = normalized_values.values

    return normalized_data

# 示例用法
# data = pd.DataFrame({'amount': [20, 40, 30, 26], 'cost': [3, 6, 2, 10]})
# normalized_data = min_max_normalize(data[['cost']], method='negative', feature_range=(0, 1))

3.2 中心倾向指标

中心倾向指标的取值范围一般视数据情况而定,数值越靠近中间位置表示绩效越好。在归一化时,通常使用 Min-Max 归一化方法,将指标缩放到0到1之间。
一些场景举例,比如财务绩效数据,利润、营业收入等中心倾向稳定的话,现实场景中,代表经营状况越好,比如生产质量控制越靠近设置的目标值越符合要求。
若是基于数据的情况,取中心位置的话,可以用以下方法:

import numpy as np
import pandas as pd

def mid_normalize(data, feature_range=(0, 1)):
    """
    中心倾向指标归一化

    Parameters:
    - data: 需要进行处理的DataFrame
    - feature_range: 设置归一化后的最小最大值,默认为 (0, 1)

    Returns:
    - normalized_data: 归一化后的DataFrame
    """
    y_min, y_max = feature_range
    normalized_data = pd.DataFrame()

    for col in data.columns:
        col_max, col_min = data[col].max(), data[col].min()
        col_mid = (col_max + col_min) / 2

        normalized_values = data[col].map(
            lambda x: 2 * (x - col_min) / (col_max - col_min) if x < col_mid else 2 * (col_max - x) / (col_max - col_min)
        )
        normalized_values *= (y_max - y_min)

        normalized_data[col] = normalized_values.values

    return normalized_data


# 示例用法
#data=pd.DataFrame({'ph':[2,5,7,10,12],
#                  'mid':[100,20,50,70,90],
#                  'temperature':[-10,10,25,30,40]})
# normalized_data=mid_normalize(data[['ph', 'mid']])

若是有给定的中心值,则可以参考一下用法:

import pandas as pd

def mid_normalize(data, best_values=None, feature_range=(0, 1)):
    """
    中心倾向指标归一化

    Parameters:
    - data: 需要进行处理的DataFrame
    - best_values: 中心指标值,如果为None,则使用(feature_range[0] + feature_range[1]) / 2
    - feature_range: 设置归一化后的最小最大值,默认为 (0, 1)

    Returns:
    - normalized_data: 归一化后的DataFrame
    """
    y_min, y_max = feature_range
    normalized_data = pd.DataFrame()

    if data.empty:
        raise ValueError("Input DataFrame is empty.")

    for col_index, col in enumerate(data.columns):
        c_max, c_min = data[col].max(), data[col].min()

        if best_values is None:
            c_mid = (y_max + y_min) / 2
        else:
            c_mid = best_values[col_index]

        normalized_values = 1 - abs(data[col] - c_mid) / (c_max - c_min)
        normalized_values *= (y_max - y_min)

        normalized_data[col] = normalized_values

    return normalized_data

# 示例用法
#data=pd.DataFrame({'ph':[2,5,7,10,12],
#                  'mid':[100,20,50,70,90],
#                  'temperature':[-10,10,25,30,40]})
#normalized_data = mid_normalize(data[['ph', 'mid']], [7, 50])

3.3 区间型指标

区间型指标是一种度量指标,其特点是具有明确的数值区间,通常表示一个范围或区间内的值。这种类型的指标提供了更多的信息,而不仅仅是单一的数值。区间型指标在统计学、经济学、工程学、生态学等领域经常被使用。

import numpy as np
import pandas as pd

def section_normalize(data, feature_range=(0, 1), target_section=(40, 60)):
    """
    区间型指标归一化

    Parameters:
    - data: 需要进行处理的DataFrame
    - feature_range: 设置归一化后的最小最大值,默认为 (0, 1)
    - target_section: 目标区间,表示在该区间内的值将被保持不变

    Returns:
    - normalized_data: 归一化后的DataFrame
    """
    y_min, y_max = feature_range
    normalized_data = pd.DataFrame()

    if data.empty:
        raise ValueError("Input DataFrame is empty.")

    for col in data.columns:
        col_max, col_min = data[col].max(), data[col].min()
        distance_to_min = max((target_section[0] - col_min), 0)
        distance_to_max = max((col_max - target_section[1]), 0)
        c = distance_to_min + distance_to_max

        # 区间映射函数简化
        normalized_values = 1 - np.abs(data[col] - np.mean(target_section)) / c
        # 当数值位于目标区间内时,将归一化的值设为1
        mask = (data[col] >= target_section[0]) & (data[col] <= target_section[1])
        normalized_values[mask] = 1
        normalized_values = np.clip(normalized_values, 0, 1)
        normalized_values *= (y_max - y_min)
        # 标记后输出
        normalized_data[col] = normalized_values

    return normalized_data

# 示例用法
#  normalized_data = section_normalize(data[['temperature']], target_section=(20, 30))

4.后记

数据归一化是数据分析和机器学习中必不可少的步骤之一。它可以消除量纲影响,提高模型的性能和稳定性,加快模型的收敛速度,并方便特征选择过程。通过归一化,可以更好地理解和利用数据,提高模型的准确性和可解释性。
在进行数据归一化时,需要注意选择合适的归一化范围和方法,处理异常值,确定归一化顺序,并注意归一化的逆操作。通过合理的数据归一化处理,可以更好地利用数据进行分析和建模。

  • 2
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
【为什么要学习这门课程】深度学习框架如TensorFlow和Pytorch掩盖了深度学习底层实现方法,那能否能用Python代码从零实现来学习深度学习原理呢?本课程就为大家提供了这个可能,有助于深刻理解深度学习原理。左手原理、右手代码,双管齐下!本课程详细讲解深度学习原理并进行Python代码实现深度学习网络。课程内容涵盖感知机、多层感知机、卷积神经网络、循环神经网络,并使用Python 3及Numpy、Matplotlib从零实现上述神经网络。本课程还讲述了神经网络的训练方法与实践技巧,且开展了代码实践演示。课程对于核心内容讲解深入细致,如基于计算图理解反向传播算法,并用数学公式推导反向传播算法;另外还讲述了卷积加速方法im2col。【课程收获】本课程力求使学员通过深度学习原理、算法公式及Python代码的对照学习,摆脱框架而掌握深度学习底层实现原理与方法。本课程将给学员分享深度学习的Python实现代码。课程代码通过Jupyter Notebook演示,可在Windows、ubuntu等系统上运行,且不需GPU支持。【优惠说明】 课程正在优惠中!  备注:购课后可加入白勇老师课程学习交流QQ群:957519975【相关课程】学习本课程的前提是会使用Python语言以及Numpy和Matplotlib库。相关课程链接如下:《Python编程的术与道:Python语言入门》https://edu.csdn.net/course/detail/27845《玩转Numpy计算库》https://edu.csdn.net/lecturer/board/28656《玩转Matplotlib数据绘图库》https://edu.csdn.net/lecturer/board/28720【课程内容导图及特色】

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

theskylife

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值