数据预处理

前提知识:标准差、方差

标准差
标准差=方差开根号
概念:标准差,中文环境中又常称均方差,在概率统计中最常使用作为统计分布程度上的测量。标准差是方差的算术平方根。标准差能反映一个数据集的离散程度。平均数相同的两组数据,标准差未必相同。

方差
若x1,x2,x3…xn的平均数为M,则方差公式可表示为:

方差公式
例1 两人的5次测验成绩如下:

X: 50,100,100,60,50 ,平均成绩为E(X )=72;

Y: 73, 70, 75,72,70 ,平均成绩为E(Y )=72。

平均成绩相同,但X 不稳定,对平均值的偏离大。方差描述随机变量对于数学期望的偏离程度。
X方差=((72-50)**2+(72-100)**2+(72-100)**2+(72-60)**2+(72-50)**2)/5
Y方差=同理
标准差=方差开根号

特征归一化

为了消除数据特征之间的量纲影响,我们需要对特征进行归一化,使得不同指标之间具有可比性。
例如:分析健康程度 身高、体重等,
两种方法:线性函数归一化、零均值归一化

方法一:线性函数归一化

公式:线性函数归一化

# 方法一  (自己手写)
import numpy as np
def get_data(data, min=0, max=1):
    # 任意缩放区间
    # 判断数据是否为np数据,是否为二维数据
    if type(data) == np.ndarray and data.ndim == 2:
        # 注意:数据格式为 一行一数据,一列一特征,特征工程,需取列计算,此时np数据就需要转置.
        data = data.T
        k = max - min
        for i in range(data.shape[0]):
            d_max, d_min = np.max(data[i]), np.min(data[i])
            # 计算范围区间与每列数据之间的比例值
            k1 = k / (d_max - d_min)
            # 将减去数据的每列最小值
            # 等比缩放至 (范围区间与每列数据之间的比例值)比例是从0算起的,需加最小值
            # 最后统一加最小值
            data[i] = (data[i] - d_min) * k1 + min

            # 理解:
            # 第一步:先要计算 (目标范围 / 实际数据范围) 的比例
            # 第二步:把数据的所有列的最小值砍掉
            # 第三步:将现有数据 × 目标比例  得到的数据,就是期望的比例数据,但此时的数据是从0算起的
            # 第四步:将每列数据统一加上期望范围的最小值
            # 不设定范围进行归一化 等于 设定范围0~1,这样公式就与上图一致了。
        return data
    return

 # 方法二   (使用机器学习库 sklearn方法)
import sklearn.preprocessing as sp
# 例子:
raw_sample = np.array(
    [[1.0, 2.0, 3.0],
     [4.0, 5.0, 9.0],
     [7.0, 8.0, 11.0]]
)
# 创建范围缩放器对象(0,1)
mm = sp.MinMaxScaler(feature_range=(0, 1))
res = mm.fit_transform(raw_sample)
print(res)

方法二:零均值归一化

公式:零均值归一化
在这里插入图片描述

def get_data(data):
    # 零均值归一化  又名:Z变换、标准正态分布、将原始数据映射在平均值为0 标准差为1的分布上。
    # 判断数据是否为np数据,是否为二维数据
    if type(data) == np.ndarray and data.ndim == 2:
        for col in data.T:  # 遍历每列
            # 减去平均值 除以标准差
            # (col-np.mean(col))/col.std()
            # 由于期望直接改变内部的值,而不是赋值给新的内存变量,所以使用 -= 与 /= 的方法,也为了看起来方便,使用直接更改原数组数据的方法即可。
            col -= np.mean(col)
            col /= col.std()
        return data
    return
a = np.array([[5, 2, 7],
             [1, 4, 3]], dtype=float)
s = get_data(a)
print(s)
# 通过Sklean实现标准化
res = sp.scale(raw_sample)
print(res)

归一化处理:

# 将每行的数据,转换为0-1之间的百分比
# 更好的展示出数据的占比的变化
import numpy as np
import sklearn.preprocessing as sp
raw_sample = np.array(
    [[10.0, 20.0, 5.0],
     [8.0, 10.0, 1.0]]
)
nor_sample = raw_sample.copy()

for raw in nor_sample:  # 遍历每行数据
    raw /= abs(raw).sum()
print(nor_sample)

# 方法二   使用Sklean实现
res = sp.normalize(raw_sample, norm='l1')  # l1笵数 平均值之和  # l2范数 平方
print(res)

两种编码:独热编码、标签编码

独热编码

# 独热编码
# 将每个特征值转换成由一个1和若干个0表达的是根据
# 在某种计算程度下,会更加的方便
import numpy as np
import sklearn.preprocessing as sp
raw_sample = np.array(
    [[1, 3, 2],
     [7, 5, 4],
     [1, 8, 6],
     [7, 3, 9]]
)
# 生成独热编码器
encoder = sp.OneHotEncoder(
    categories='auto',  # 自动产生编码值
    dtype='int32',
    sparse=False  # 不采用稀疏矩阵
)
# 编码
res = encoder.fit_transform(raw_sample)
print(res)
# 解码  注意:编码的条件要与解码的条件一样
inv_res = encoder.inverse_transform(res)
print(inv_res)

标签编码

# 标签编码--序列标签
# 将离散的字符串类型转为数值
import numpy as np
import sklearn.preprocessing as sp

raw_sample = np.array(['本科', '专科', '小学',
                       '高中', '本科', '本科',
                       '硕士', '博士'])

# 生成标签编码器
encoder = sp.LabelEncoder()
# 训练编码
res = encoder.fit_transform(raw_sample)
print(res)
# 仅编码
res = encoder.transform(raw_sample)
# 解码
inv_res = encoder.inverse_transform(res)
print(inv_res)

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

默执_

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

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

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

打赏作者

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

抵扣说明:

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

余额充值