数据预处理——Day 1

相关链接:
Github地址
简书地址
CSDN地址

总所周知,对于机器学习任务,特别是对于深度学习任务,我们需要创建训练集,因此需要收集大量的数据.然而,在实际中,我们收集的数据极易受噪声、缺失值和数据不一致的影响。通常我们对数据进行如下几种预处理:

  1. 缺失值处理
  2. 异常值处理
  3. 冗余数据处理
  4. 数据标准化
  5. 数据离散化
  6. 数据向量化: 我自己总结的,主要针对文本数据。不知道算不算预处理,但这是文本数据的必须操作。

本文主要针对缺失值处理和数据向量化两种与处理方法进行讲解,整个处理过程分为6步:

  1. 导入相关库
  2. 导入数据集
  3. 处理缺失值
  4. 编码分类数据
  5. 创建训练集和测试集
  6. 特征缩放

下面我们将通过实例来一步步详细介绍这些操作。

1. 导入相关库

numpypandas 是利用 Python 进行科学计算时非常重要两个科学计算库。其中 numpy 负责提供基本的数学计算函数,起运算对象事针对张量或矩阵;而 pandas 库则用来导入和管理数据集。起导入规则如下:

import numpy as np
import pandas as pd

2. 导入数据集

pandas 是一个管理数据的函数库,我为我们提供了许多读取和操作数据的接口:

pd_read_data.png

.csv 格式文件是我们保存数据的一种常用格式,其格式简单,其默认格式是以 ,(英文逗号)分割数据集,显示效果和 excel 表格类似。 pandas 为我们提供了访问 .csv 的接口,其 pd.read_csv()用来进行读取 .csv格式数据,该函数常用的参数如下:

  • filename: 文件名
  • header: 表头,默认不为空(第一行为表头),设为 None, 表示无表头
  • sep: 指定分隔符。如果不指定参数,则会尝试使用逗号分隔
dataset = pd.read_csv('Data.csv')
X = dataset.iloc[ : , :-1].values
Y = dataset.iloc[ : , 3].values

Data.csv是我们访问的数据集,其内容如下:

Country,Age,Salary,Purchased
France,44,72000,No
Spain,27,48000,Yes
Germany,30,54000,No
Spain,38,61000,No
Germany,40,,Yes
France,35,58000,Yes
Spain,,52000,No
France,48,79000,Yes
Germany,50,83000,No
France,37,67000,Yes

pd.read_csv()返回的数据类型为DataFrame(把他就像成一张表),其没有原始的下表操作,我们访问内容通过如下几个函数:

  1. loc: 通过行标签访问数据
  2. iloc: 通过行索引进行访问
  3. ix: loc 和 iloc 的混合

.value 属性则是将 DataFrame 转成 numpy类型,以便后续的数值计算。

print(type(dataset), type(X), type(Y))
print(X.shape, Y.shape)

输出:

<class 'pandas.core.frame.DataFrame'> <class 'numpy.ndarray'> <class 'numpy.ndarray'>
(10, 3) (10,)
[['France' 44.0 72000.0]
 ['Spain' 27.0 48000.0]
 ['Germany' 30.0 54000.0]
 ['Spain' 38.0 61000.0]
 ['Germany' 40.0 nan]
 ['France' 35.0 58000.0]
 ['Spain' nan 52000.0]
 ['France' 48.0 79000.0]
 ['Germany' 50.0 83000.0]
 ['France' 37.0 67000.0]]

3. 处理缺失值

从数据集我们可以发现,某些数据为空,这时我们需要对这些缺失值进行处理。我么可以对缺失值进行均值和中值处理,即用整个数据集的该列数据的均值或中值来替换缺失的值。在sklearn的preprocessing包中包含了对数据集中缺失值的处理,主要是应用Imputer类进行处理。代码如下:

from sklearn.preprocessing import Imputer
imputer = Imputer(missing_values = "NaN", strategy = "mean", axis = 0)
imputer = imputer.fit(X[ : , 1:3])
X[ : , 1:3] = imputer.transform(X[ : , 1:3])

该代码首先导入 Imputer 类,然后通过一些参数来创建 Imputer 实例,参数意思大致如下:

  • missing_values: 我们要处理的缺失值类型,由于 pandas.read_csv() 会将确实的值默认设置为 Nan,所以这里其类型为 Nan
  • strategy: 表示采用何种策略,其取值有 mean, median, most_frequent,默认为 mean,即均值。
  • axis: 表示我们处理的方向,由于这里列方向是同一类型数据,即主轴方向,因此其值为0.

注意: sklearn 库预处理操作有个特征是,其处理分为两步: fit 和 transform,fit 大致可以理解为我们对那些数据进行操作或统计,transform 表示实际进行操作。这一点和 sklearn 中的机器学习算法类似,两个固定接口: fit 和 predict。

由于我们数据库中的数据只有第2、3 列才是数值数据,我们也只能对这两列数据进行预处理,所欲第三行我们在 .fit 中指出要操作的数据,在其内部分别计算了这两列的均值,以供后面处理使用。

第四行代码执行缺失值处理,通过第三行已经计算出 相应的均值,所以这行代码实际执行缺失值处理

第三行和第四行代码可以通过.fit_transform 函数来一步执行。这也是 sklearn 的一个特点。

print(X)

输出:

[['France' 44.0 72000.0]
 ['Spain' 27.0 48000.0]
 ['Germany' 30.0 54000.0]
 ['Spain' 38.0 61000.0]
 ['Germany' 40.0 63777.77777777778]
 ['France' 35.0 58000.0]
 ['Spain' 38.77777777777778 52000.0]
 ['France' 48.0 79000.0]
 ['Germany' 50.0 83000.0]
 ['France' 37.0 67000.0]]

4. 编码分类数据

对于我们计算机进行科学计算只针对数值,而不能对文本进行数值计算,因此我们需要对文本进行数据向量化。如何用数值表示文本呢? 最常用的的格式就是 one-hot 格式,这种格式将文本表示成一个向量,该向量只有一个元素的值为1,其余全为0.

比如,我们数据集有"a", "b", "c", "d"四个文本,此时我们的向量长度则为4,则这四个文本表示如下:

a: [1, 0, 0, 0]
b: [0, 1, 0, 0]
c: [0, 0, 1, 0]
d: [0, 0, 0, 1]

因此我们需要先统计数据库中所有的文本,并对每个文本从 0 开始进行编号.该过程也通过sklearn库来进行实现:

    from sklearn.preprocessing import LabelEncoder, OneHotEncoder
    labelencoder_X = LabelEncoder()
    X[ : , 0] = labelencoder_X.fit_transform(X[ : , 0])

由于对于特征(数据集中的最后一列是标签),只有第一列是文本,因此我们需要对第一列进行文本统计.上面代码就是将第一列的文本用自己的编号来进行表示.

print(X)

输出:

[[0 44.0 72000.0]
 [2 27.0 48000.0]
 [1 30.0 54000.0]
 [2 38.0 61000.0]
 [1 40.0 63777.77777777778]
 [0 35.0 58000.0]
 [2 38.77777777777778 52000.0]
 [0 48.0 79000.0]
 [1 50.0 83000.0]
 [0 37.0 67000.0]]

如何将这些编号表示的文本转换成one-hot形式呢?这就需要使用 sklearn.preprocessing 中的 OneHotEncoder 进行编号.

onehotencoder = OneHotEncoder(categorical_features = [0])
X = onehotencoder.fit_transform(X).toarray()
labelencoder_Y = LabelEncoder()
Y =  labelencoder_Y.fit_transform(Y)

categorical_features 参数指定了我们需要对哪些列进行one-hot编码,这里为0,表示对第一列,然后利用'.fit_transform' 进行编码.由于对于标签我们只需要其标签类型,因此不需要进行 one-hot 编码.

print(X[0])
print(Y)

输出:

[1.0e+00 0.0e+00 0.0e+00 4.4e+01 7.2e+04]
[0 1 0 0 1 1 0 1 0 1]

因为第一列总共有三种文本,因此其one-hot向量长度为3,且第一个样本的 index 为0, 故其 one-hot 为 [1, 0, 0],总的就如上所示.

5. 创建训练集和测试集

对于机器学习任务,我们需要将数据集按照比例划分成两个部分: 训练集和测试集.训练接用于训练模型,测试集用于测试我们模型的性能.对于数据的划分,我们使用 sklearn.cross_validation 的 train_test_split 对数据集按比例进行划分.

from sklearn.cross_validation import train_test_split
X_train, X_test, Y_train, Y_test = train_test_split( X , Y , test_size = 0.2, random_state = 0)
print(X.shape, X_train.shape, X_test.shape)

输出:

(10, 5) (8, 5) (2, 5)

6. 特征缩放

通过我们需要对数据进行标准化处理,这样可以减小噪声的影响.通常将其标准化为:均值为0, 方差为1的数据范围.
标准化之前的方差和均值:

print(np.mean(X_train), np.std(X_train))
print(np.mean(X_test), np.std(X_test))

输出:

12527.338888888888 25395.495797239782
13708.2 28152.896706378193

进行标准化:

from sklearn.preprocessing import StandardScaler
sc_X = StandardScaler()
X_train = sc_X.fit_transform(X_train)
X_test = sc_X.fit_transform(X_test)

标准化之后的均值和方法:

print(np.mean(X_train), np.std(X_train))
print(np.mean(X_test), np.std(X_test))

输出:

7.771561172376095e-17 1.0
0.0 0.6324555320336759

感谢大家的支持, 欢迎大家上星..该博客的原始Github项目地址点击这里

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

推荐阅读更多精彩内容

  • Python 和 Pandas 数据分析教程 原文:Data Analysis with Python and P...
    布客飞龙阅读 82,578评论 9 224
  • Python 和 Pandas 数据分析教程 原文:Data Analysis with Python and P...
    创造new_world阅读 3,728评论 0 13
  • 秋天 用眼泪打湿叶子 让叶子落在水里 让流水把眼泪和叶子都带走 秋天 把笑容刻在星星里 让星星陨落 让笑容和星星一...
    时光盒子阅读 106评论 0 2
  • 生活总会和我开玩笑,一个地方亮红灯就打乱了所有的计划,三次,绝对只有三次,我用往后余生保证,三个不同的年龄段,出现...
    YYMM茗阅读 276评论 0 1
  • 网上有个故事,说一个人请风水先生去自家墓地看风水,途中远远看到墓地方向鸟雀纷飞,惊慌失措。于是他猜是有孩子在旁边的...
    hldcw阅读 697评论 0 1