![](https://img.haomeiwen.com/i842143/c44e75e1fc2628d2.png)
几乎所有的机器学习算法都需要对数据进行准备,不同的算法根据其假设,可能要求不同的数据转化。原文作者的建议是:使用一个数据驱动的方法,组合多种数据准备方法和多种算法,比较表现优劣,建立起数据转化和算法的对应关系。
1. 调整数据尺度(Rescale data)
当你的数据处于不同的尺度时,把所有的数据属性都统一到一个标准尺度,对提升ML算法表现是很有帮助的。这种rescale可以看出是一种标准化,通常会把属性范围调整到0-1。使用的场景:如gradient descent的最优化算法、回归、神经网络和使用距离的算法(以权重作为输入)。使用scikit-learn 中的MinMaxScaler类实现。代码如下:
import pandas as pd
import numpy as np
#import scipy
from sklearn.preprocessing import MinMaxScaler
data_link = 'https://archive.ics.uci.edu/ml/machine-learning-databases/pima-indians-diabetes/pima-indians-diabetes.data'
names = ['preg', 'plas', 'pres', 'skin', 'test', 'mass', 'pedi', 'age', 'class']
df = pd.read_csv(data_link,names=names)
data = df.values
X = data[:,0:8]
Y = data[:,8]
scaler = MinMaxScaler(feature_range=(0,1))
rescaledX = scaler.fit_transform(X)
np.set_printoptions(precision = 3)
print(X)
print(rescaledX)
结果如下:
[[ 6. 148. 72. ..., 33.6 0.627 50. ]
[ 1. 85. 66. ..., 26.6 0.351 31. ]
[ 8. 183. 64. ..., 23.3 0.672 32. ]
...,
[ 5. 121. 72. ..., 26.2 0.245 30. ]
[ 1. 126. 60. ..., 30.1 0.349 47. ]
[ 1. 93. 70. ..., 30.4 0.315 23. ]]
[[ 0.353 0.744 0.59 ..., 0.501 0.234 0.483]
[ 0.059 0.427 0.541 ..., 0.396 0.117 0.167]
[ 0.471 0.92 0.525 ..., 0.347 0.254 0.183]
...,
[ 0.294 0.608 0.59 ..., 0.39 0.071 0.15 ]
[ 0.059 0.633 0.492 ..., 0.449 0.116 0.433]
[ 0.059 0.467 0.574 ..., 0.453 0.101 0.033]]
2. 正态化数据(standardize data)
标准化使用高斯分布,把不同mean和SD的数据转化为标准分布(mean为0,SD为1)。使用场景:线性回归、logistic回归和线性区分问题。 使用scikit-learn 中的StandardScaler类实现。代码如下:
import pandas as pd
import numpy as np
#import scipy
from sklearn.preprocessing import StandardScaler
data_link = 'https://archive.ics.uci.edu/ml/machine-learning-databases/pima-indians-diabetes/pima-indians-diabetes.data'
names = ['preg', 'plas', 'pres', 'skin', 'test', 'mass', 'pedi', 'age', 'class']
df = pd.read_csv(data_link,names=names)
data = df.values
X = data[:,0:8]
Y = data[:,8]
scaler = StandardScaler().fit(X)
rescaledX = scaler.transform(X)
np.set_printoptions(precision = 3)
print(X)
print(rescaledX)
结果如下:
[[ 6. 148. 72. ..., 33.6 0.627 50. ]
[ 1. 85. 66. ..., 26.6 0.351 31. ]
[ 8. 183. 64. ..., 23.3 0.672 32. ]
...,
[ 5. 121. 72. ..., 26.2 0.245 30. ]
[ 1. 126. 60. ..., 30.1 0.349 47. ]
[ 1. 93. 70. ..., 30.4 0.315 23. ]]
[[ 0.64 0.848 0.15 ..., 0.204 0.468 1.426]
[-0.845 -1.123 -0.161 ..., -0.684 -0.365 -0.191]
[ 1.234 1.944 -0.264 ..., -1.103 0.604 -0.106]
...,
[ 0.343 0.003 0.15 ..., -0.735 -0.685 -0.276]
[-0.845 0.16 -0.471 ..., -0.24 -0.371 1.171]
[-0.845 -0.873 0.046 ..., -0.202 -0.474 -0.871]]
3. 标准化数据(normalize data)
把每一行调整到长度为1(线性代数中的a unit norm,这个不太懂,需要深入挖掘)。用于稀疏数据,使用场景:使用权重输入的神经网络和使用距离的k近邻算法。使用scikit-learn 中的 Normalizer 类实现。代码如下:
import pandas as pd
import numpy as np
#import scipy
from sklearn.preprocessing import Normalizer
data_link = 'https://archive.ics.uci.edu/ml/machine-learning-databases/pima-indians-diabetes/pima-indians-diabetes.data'
names = ['preg', 'plas', 'pres', 'skin', 'test', 'mass', 'pedi', 'age', 'class']
df = pd.read_csv(data_link,names=names)
data = df.values
X = data[:,0:8]
Y = data[:,8]
scaler = Normalizer().fit(X)
normalizedX = scaler.transform(X)
np.set_printoptions(precision = 3)
print(X)
print(normalizedX)
结果如下:
[[ 6. 148. 72. ..., 33.6 0.627 50. ]
[ 1. 85. 66. ..., 26.6 0.351 31. ]
[ 8. 183. 64. ..., 23.3 0.672 32. ]
...,
[ 5. 121. 72. ..., 26.2 0.245 30. ]
[ 1. 126. 60. ..., 30.1 0.349 47. ]
[ 1. 93. 70. ..., 30.4 0.315 23. ]]
[[ 0.034 0.828 0.403 ..., 0.188 0.004 0.28 ]
[ 0.008 0.716 0.556 ..., 0.224 0.003 0.261]
[ 0.04 0.924 0.323 ..., 0.118 0.003 0.162]
...,
[ 0.027 0.651 0.388 ..., 0.141 0.001 0.161]
[ 0.007 0.838 0.399 ..., 0.2 0.002 0.313]
[ 0.008 0.736 0.554 ..., 0.241 0.002 0.182]]
4. 二值数据(binarize data)
使用阈值,把数据转化为二值,大于阈值设置为1,小于阈值设置为0。使用场景:当生成crisp values的时候使用(不知道什么意思),还有就是feature egnineering的时候增加属性。使用scikit-learn 中的 Binarizer 类实现。代码如下:
import pandas as pd
import numpy as np
#import scipy
from sklearn.preprocessing import Binarizer
data_link = 'https://archive.ics.uci.edu/ml/machine-learning-databases/pima-indians-diabetes/pima-indians-diabetes.data'
names = ['preg', 'plas', 'pres', 'skin', 'test', 'mass', 'pedi', 'age', 'class']
df = pd.read_csv(data_link,names=names)
data = df.values
X = data[:,0:8]
Y = data[:,8]
binarizer = Binarizer(threshold=0.0).fit(X)
binaryX = binarizer.transform(X)
np.set_printoptions(precision = 3)
print(X)
print(binaryX)
结果如下:
[[ 6. 148. 72. ..., 33.6 0.627 50. ]
[ 1. 85. 66. ..., 26.6 0.351 31. ]
[ 8. 183. 64. ..., 23.3 0.672 32. ]
...,
[ 5. 121. 72. ..., 26.2 0.245 30. ]
[ 1. 126. 60. ..., 30.1 0.349 47. ]
[ 1. 93. 70. ..., 30.4 0.315 23. ]]
[[ 1. 1. 1. ..., 1. 1. 1.]
[ 1. 1. 1. ..., 1. 1. 1.]
[ 1. 1. 1. ..., 1. 1. 1.]
...,
[ 1. 1. 1. ..., 1. 1. 1.]
[ 1. 1. 1. ..., 1. 1. 1.]
[ 1. 1. 1. ..., 1. 1. 1.]]
5. 总结:
可以使用以下4种方法准备数据:rescale,standardize,normalize,binarizer。但是更为重要的,我认为是:在实践中熟练不同数据准备方法的使用场景,在使用中建立其对算法提升的理论和知觉,更为重要。
6. 知识点:
- MinMaxscaler
- StandardScaler
- Normalizer
- Binarizer
- xx.fit(X)
- scaler.transform(X)
原文链接:How To Prepare Your Data For Machine Learning in Python with Scikit-Learn
网友评论