前提知识:标准差、方差
标准差
标准差=方差开根号
概念:标准差,中文环境中又常称均方差,在概率统计中最常使用作为统计分布程度上的测量。标准差是方差的算术平方根。标准差能反映一个数据集的离散程度。平均数相同的两组数据,标准差未必相同。
方差
若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)