scikit-learn系列之如何做数据准备

如何准备数据

几乎所有的机器学习算法都需要对数据进行准备,不同的算法根据其假设,可能要求不同的数据转化。原文作者的建议是:使用一个数据驱动的方法,组合多种数据准备方法和多种算法,比较表现优劣,建立起数据转化和算法的对应关系。

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. 知识点:

  1. MinMaxscaler
  2. StandardScaler
  3. Normalizer
  4. Binarizer
  5. xx.fit(X)
  6. scaler.transform(X)

原文链接:How To Prepare Your Data For Machine Learning in Python with Scikit-Learn

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 217,185评论 6 503
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 92,652评论 3 393
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 163,524评论 0 353
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,339评论 1 293
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,387评论 6 391
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,287评论 1 301
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,130评论 3 418
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,985评论 0 275
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,420评论 1 313
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,617评论 3 334
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,779评论 1 348
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,477评论 5 345
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,088评论 3 328
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,716评论 0 22
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,857评论 1 269
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,876评论 2 370
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,700评论 2 354

推荐阅读更多精彩内容