第三章 Python数据预处理

3.1 特征缩放

        有关特征缩放的网站介绍:https://en.wikipedia.org/wiki/Feature_scaling

        特征缩放是一种用于标准化自变量或数据特征范围的方法。在数据处理中,也称为数据规范化,通常在数据预处理步骤中执行。

        由于原始数据的取值范围变化很​​大,在一些机器学习算法中,如果不进行归一化,目标函数将无法正常工作。例如,许多分类器通过欧几里得距离计算两点之间的距离。如果其中一个要素具有广泛的值范围,则距离将由该特定要素控制。因此,应该对所有特征的范围进行归一化,以便每个特征对最终距离的贡献大致成比例。

        应用特征缩放的另一个原因是梯度下降在使用特征缩放时比没有它时收敛得更快。[1]

        如果将正则化用作损失函数的一部分,那么应用特征缩放也很重要(以便对系数进行适当的惩罚)。

3.1.1 最小-最大归一化(min-max normalization)

        也称为最小-最大缩放或最小-最大标准化,重新缩放是最简单的方法,包括重新缩放特征范围在 [0, 1] 或 [-1, 1] 。选择目标范围取决于数据的性质。[0, 1] 的 min-max 的一般公式如下:

第三章 Python数据预处理_第1张图片

图1 最小-最大归一化公式1 

        其中 x是原始值,x'是标准化值。例如,假设我们有学生的体重数据,学生的体重跨度为 [160 磅,200 磅]。为了重新调整这些数据,我们首先从每个学生的体重中减去 160,然后将结果除以 40(最大和最小权重之间的差)。

        要重新调整任意一组值位于 [a, b] 之间的范围,公式变为:

第三章 Python数据预处理_第2张图片

  图2 最小-最大归一化公式2 

        在这里 a,b是最小值-最大值。

3.1.2 均值归一化(Mean normalization)

图3 均值归一化公式

        在这里x是原始值, x'是标准化值。还有另一种形式的均值归一化,它除以标准差,也称为标准化。

3.1.3 标准化(Z-score Normalization)

        在机器学习中,我们可以处理各种类型的数据,例如音频信号图像数据的像素值,这些数据可以包括多个维度。特征标准化使数据中每个特征的值具有零均值(当减去分子中的均值时)和单位方差。该方法广泛用于许多机器学习算法(例如,支持向量机、逻辑回归和人工神经网络)中的归一化。[2] 一般的计算方法是确定分布均值和标准差。接下来,我们从每个特征中减去平均值。然后我们将每个特征的值(均值已减去)除以其标准差。

 

图4 标准化公式

图5 求平均值公式

第三章 Python数据预处理_第3张图片

图6 求标准差公式

        在这里 x是原始特征向量,=average(x)是该特征向量的平均值,并且σ是它的标准差。

3.1.4 缩放到单位长度(Scaling to unit length)

        在机器学习中广泛使用的另一种选择是缩放特征向量的分量,使得完整向量的长度为 1。这通常意味着将每个分量除以向量 的欧几里得长度:

图7 缩放到单位长度公式

        在某些应用(例如,直方图特征)中,使用特征向量的 L1范数(即 taxicab geometry)可能更实用。如果在以下学习步骤中使用标量度量作为距离度量,这一点尤其重要。

3.1.5 特征缩放应用      

        在随机梯度下降中,特征缩放有时可以提高算法的收敛速度[2] 。在支持向量机中,[3]它可以减少寻找支持向量的时间。但是请注意,特征缩放会改变 SVM 结果。

3.2 Python代码找到最大值和最小值

def min_and_max(dataset):
    """
     该函数用于寻找数据集中每列的最小值和最大值
     Parameters
    ----------
    dataset : 二维列表
        输入需要查找最小值和最大值的二维列表数据集.
        
    Returns
    -------
    min_max : 二维列表
        存放每列的最小值和最大值.
    """
    # 创建一个空列表用于存放最小值和最大值(按列求最小值和最大值)
    min_max = list()
    # 按列遍历数据集
    for i in range(len(dataset[0])):
        # 按列将数据集存入col_values中
        col_values = [row[i] for row in dataset]
        # 求一列的最小值
        value_min = min(col_values)
        # 求一列的最大值
        value_max = max(col_values)
        # 将求得的每列的最小值和最大值存入min_max列表中
        min_max.append([value_min,value_max])
    return min_max
    

# 主函数
if '__main__' == __name__:
    dataset = [[1,2],[3,4],[5,6]]
    # 调用min_and_max求得数据集中每列的最小值和最大值
    min_max = min_and_max(dataset)

 3.3 Python代码实现最小-最大归一化

        其中这里面用到的需要求最小值和最大值的函数已经在3.2节写了。

def min_max_normalization(dataset,min_max):
    """
    该函数用于实现数据的最小-最大归一化
    Parameters
    ----------
    dataset : 二维列表
        输入需要进行最小-最大归一化的二维列表数据集.
    min_max : 二维列表
       存放dataset数据集中每列的最小值和最大值.

    Returns
    -------
    None.
    """
    for row in dataset:
        for i in range(len(row)):
            row[i] = (row[i] - min_max[i][0])/(min_max[i][1]-min_max[i][0])
            

# 主函数
if '__main__' == __name__:
    dataset = [[1,2],[3,4],[5,6],[7,8]]
    # 调用min_and_max求得数据集中每列的最小值和最大值
    min_max = min_and_max(dataset)
    # 调用min_max_normalization实现数据的最小-最大归一化
    min_max_normalization(dataset,min_max)

3.4  Python代码实现数据的标准化

# 导入库
from math import sqrt

def find_mean(dataset):
    """
    该函数用于求解数据的平均值(按列,数学公式如图5所示)
    Parameters
    ----------
    dataset : 二维列表
        输入需要求平均值的二维列表数据集.

    Returns
    -------
    means : 列表
        存放dataset数据集中每列的平均值

    """
    # 创建一个空列表用于存放数据集中每列的平均值
    means = list()
    # 遍历数据集中的每一列
    for i in range(len(dataset[0])):
        # 分别将数据集中的每一列存入col_values中
        col_values = [row[i] for row in dataset]
        # 求得数据集中的每列的平均值
        mean = sum(col_values)/float(len(dataset))
        # 将求得的每列的平均值存入mean列表中
        means.append(mean)
    return means


def calculate_the_standard_deviation(dataset,means):
    """
    该函数用于计算数据的标准差(按列,数学公式如图6所示)
    Parameters
    ----------
    dataset : 二维列表
        输入需要求标准差的二维列表数据集.
    means : 列表
        存放dataset数据集中每列的平均值.

    Returns
    -------
    standard_deviation : 列表
        存放dataset数据集中每列的标准差.

    """
    # 创建一个空列表用于存放数据集中每列的标准差
    standard_deviation = list()
    # 遍历数据集中的每一列
    for i in range(len(dataset[0])):
        variance = [pow(row[i]-means[i],2) for row in dataset]
        standard_deviation.append(sum(variance))
    # 计算得到每一列的标准差
    standard_deviation = [sqrt(element/float(len(dataset)-1)) for element in standard_deviation]
    return standard_deviation

def Z_score_Normalization(dataset,means_list,standard_deviation_list):
    """
    该函数用于对数据集进行标准化(数学公式如图4所示)
    Parameters
    ----------
    dataset : 二维列表
        输入需要进行标准化的二维列表数据集.
    means_list : 列表
        数据集每列的平均值.
    standard_deviation_list : 列表
        数据集每列的标准差.

    Returns
    -------
    None.
    """
    for row in dataset:
        for i in range(len(row)):
            row[i] = (row[i] - means_list[i])/standard_deviation_list[i]
    

# 主函数
if '__main__' == __name__:
    dataset = [[1,2],[3,4],[5,6],[7,8]]
    # 调用求平均值函数计算平均值
    means_list = find_mean(dataset)
    # 调用求平均值函数计算标准差
    standard_deviation_list = calculate_the_standard_deviation(dataset,means_list)
    # 调用标准化函数对数据进行标准化
    Z_score_Normalization(dataset,means_list,standard_deviation_list)

3.5 其他数据变形方法 

        一、取对数(指数变换)logarithm(exponential transformation)

        二、power transformation(Box-Cox)

        

你可能感兴趣的:(python)