几种简单数据预处理方法的Python实现
数据科学、深度学习都离不开数据的准备与预处理。对于像我这样的新手而言,不仅算法需要花费许多时间来理解,数据预处理就消耗了不少的精力。在此特将近期遇到的几种准备数据的方法归类,并使用Python来处理它们。一可以深化对Python语言特性的理解,二也为所有人参考,能够少走弯路。
几个对于简化编码非常重要的语言特性与库方法:列表的切片,enumerate(),列表推导(List Comprehension),以及numpy库的numpy.zeros()、numpy.shape等。
近期学习Udacity深度学习基础课,把数据的准备分成了以下五种类型:
一.大向量分割成若干小向量
背景:切割训练集,使之适合于模型的输入 。使用List的切片
split_frac = 0.8 #训练集占80%
num_train = int(0.8*len(features))
train_x, val_x = features[:num_train], features[num_train:]
num_val = int(0.5*len(val_x)) #验证集与测试集各占剩余20%中的一半
val_x, test_x = val_x[:num_val], val_x[num_val:]
二.小向量内容复制到大向量
背景:给小向量填0,使之成为符合要求的大向量。使用zeros()创建"容器",enumerate()获得序号及其对应得数据
seq_len = 200
features = np.zeros((len(x), seq_len), dtype=int)
#先开设符合大小的一个"容器",seq_len表示容器长度,x为需要填入的内容,个数为len(x)
for i, row in enumerate(x): #处理x个需要填入大矩阵的小向量, 每一次循环处理第i个,内容为x
features[i, :len(row)] = np.array(row)
三.数据的编码
背景:独热编码(One-hot Encoding):用于分类问题,数值最高的一类对应的编码为1,其余全部设为0
x = list.index(max(data)) #data为list类型,若为numpy.array则需使用np.where(data==max(data))
#x为第i类取值为1,其余为0
vec = np.eye(10)[x]
#输出形如array([0,0,1,0,0...])
#若使用tensorflow,可参考tf.one_hot()函数
四.改变向量形状
背景:多维向量压缩维数。使用np.shape与np.reshape()
#x为四维张量,需要压缩第2、3、4维成为一列,以转换成二维张量
#numpy中
dim=x.shape #得到的是一个元组
x = x.reshape((-1, dim[1]*dim[2]*dim[3]))
#若想要程序自动帮忙计算某一维度的值,就填入-1好了
#tensorflow中
dim_list = x.get_shape().as_list()
x = tf.reshape(x, [-1, dim_list[1]*dim_list[2]*dim_list[3]]
#-1的作用同上
五.文本处理
背景:输入一长串英文文本,提取单词到字典,并把文本用整数来编码。活用enumerate()与列表推导
with open('text.txt', 'r') as f:
text=f.read()
vocab = set(text) #消除重复单词
vocab_to_int = {c: i for i, c in enumerate(vocab)} #enumerate(vocab)得到形如['love' : 0,
#'home': 1,...]的列表,随后填入字典
encoded = np.array([vocab_to_int[c] for c in text], dtype=np.int32)
#将单词转换成整数编码,由text="love home"得到的array形如[0,1]
小结:
若使用类似C/C++的语言,以上的实现都需要不少代码。Python确实是数据处理中非常值得选择的语言。