机器学习的第一步:数据预处理

背景

所谓的机器学习,目前还是基于统计的,有监督的。所以数据的预处理则显得尤其重要。
今天我们利用sklearn的preprocess来进行数据的预处理。

以前写过一篇关于特征缩放的,其实本质也是特征预处理,使得标准化。

这里主要是巩固,同时结合sklearn里的代码来实操。

预处理之: 标准化z-score

方法

x ′ = x − μ σ x' = \dfrac{x - \mu}{\sigma} x=σxμ
翻译公式为:(x-mean)/std 计算时对每个属性/每列分别进行。

意义

将数据按期属性(按列进行)减去其均值,并处以其方差。得到的结果是,对于每个属性/每列来说所有数据都聚集在0附近,方差为1。

实战

import sklearn.preprocessing as preprocessor
scaler = preprocessor.StandardScaler()
z_x = scaler.fit_transform(x) #标准化
print(z_x)
print("mean:",z_x.mean(axis=0))
print("std:",z_x.std(axis=0))

预处理之:归一化

方法

就是把属性缩放到0-1之间。
x ′ = x − m e a n ( x ) m a x ( x ) − m i n ( x ) x' = \dfrac{x - mean(x)}{max(x) - min(x)} x=max(x)min(x)xmean(x)

实战

scaler = preprocessor.MinMaxScaler()
m_M_x = scaler.fit_transform(x)
print(m_M_x)
print("mean:",m_M_x.mean(axis=0))
print("std:",m_M_x.std(axis=0))
print("max:",m_M_x.max(axis=0))
print("min:",m_M_x.min(axis=0))

预处理之:正则化

方法

x ′ = x ∣ ∣ x ∣ ∣ p x'=\frac{x}{||x||_{p}} x=xpx
这是p=2则是二维范数下的归一化。https://blog.csdn.net/iterate7/article/details/75443504

主要是用当前值除以p范数。

∥ x ∥ p = ∑ i = 1 n ∣ x i ∣ p p {\lVert x \rVert}_p = \sqrt[p]{\sum_{i = 1}^{n} {\lvert x_i \rvert}^p} xp=pi=1nxip
这样做的目的其实非常容易理解,就是向量直接点积就是可以求相似度。

实战

v = [[1,1,1],[2,2,2],[1,0,1]]
normalizer = preprocessor.Normalizer().fit(x) # 2d array
print(normalizer)
x_norm = normalizer.transform(x)
print(x_norm)
v = normalizer.transform(v)
print(v)

assert ((np.dot(v[0] , v[1]))-1<=0.000001)

print("v1,v2 similarity:", np.dot(v[0], v[1]))
print("v1,v3 similarity:", np.dot(v[0], v[2]))
print("v2,v3 similarity:", np.dot(v[1], v[2]))


预处理之:one-hot

特别是词袋模型或者分类列表,需要转化为one-hot向量。
思路非常简单,只要distinct的,就从0-x按序号记录。最终形成01序列。
这句话听起来比较抽象,我们距离来说:

enc = preprocessor.OneHotEncoder()
data = np.array([[0, 0, 3], [1, 1, 0], [0, 2, 1], [1, 0, 2]])
enc.fit(data)  
print(data)

[[0 0 3]
[1 1 0]
[0 2 1]
[1 0 2]]

分析

特征的one-hot都是面向列的,也即是feature的,我们先看第一列只有0,1;那么也就是2个特征,我们记录为0,1;
第二列是0,1,2三个特征,那么继续命名则为:2,3,4特征号码;
第三列4个特征,继续递增命名:5,6,7,8的特征号码。
可以通过

print(enc.n_values_)

来验证每个特征的维度,这里应该是2,3,4。

如果想知道每个特征的话则“print(enc.active_features_)”查看。

summary

  1. 无论标准化、归一化还是正则化都是为了更好的后续任务,比如:可比,简化训练,提高相似度计算的效率等。
  2. 标准化是(x-mean)/std, 方差相关, 归一化(x-min)/(max-min)则是最大最小相关; 正则化则是p范数,x/p-x, 利于相似度计算。
  3. one-hot方法则是利用编码为可以计算的0/1向量。

code

所有的代码放在:这里

reference

https://www.statisticshowto.datasciencecentral.com/normalized/
https://www.cnblogs.com/zhoukui/p/9159909.html
https://scikit-learn.org/0.16/modules/preprocessing.html#preprocessing

你可能感兴趣的:(数据挖掘,基础知识)