一、为什么需要预处理数据集
在深度学习的实际应用中,数据预处理是至关重要的一个环节。这是因为深度学习算法的准确性和性能密切相关于它在训练时所使用的数据集的质量和规模。预处理数据集可以使你的算法更加精准高效,提高算法的泛化性、减少模型的拟合程度、提高模型的精度等多种好处。
在实际应用场景中,需要进行的预处理包括但不限于数据清洗、数据类型转换、数据归一化/标准化、数据的分割、数据的扩充、图片的裁剪、旋转等等。本文主要介绍如何使用Keras对数据集进行预处理。
二、Keras的数据预处理类
Keras提供了一些方便的工具帮助我们对数据进行预处理。下面介绍其中的几个常用类。
1. DataGenerator
DataGenerator是Keras中用于数据强化(data augmentation)的工具类,它可以在训练数据不充分的情况下,通过对数据集进行变换,生成更多的数据样本,扩大我们的训练集规模来提高训练效果。下面是使用DataGenerator进行图片强化的一个例子:
from keras.preprocessing.image import ImageDataGenerator
import cv2
datagen = ImageDataGenerator(
rotation_range=40,
width_shift_range=0.1,
height_shift_range=0.1,
shear_range=0.2,
zoom_range=0.2,
horizontal_flip=True,
fill_mode='nearest')
img = cv2.imread('img.jpg')
img = cv2.cvtColor(img, cv2.COLOR_BGR2RGB)
img = cv2.resize(img, (150, 150))
img = img.reshape((1,) + img.shape)
i = 0
for batch in datagen.flow(img, batch_size=1):
plt.figure(i)
imgplot = plt.imshow(cv2.cvtColor(batch[0], cv2.COLOR_BGR2RGB))
i += 1
if i % 4 == 0:
break
plt.show()
2. Dataset
Dataset是Keras中的一个数据集类,它提供了对数据的读取、转换、处理等一系列操作,是进行数据预处理的重要工具类。
查看本地数据集:
from keras.datasets import mnist
# load data
(x_train, y_train), (x_test, y_test) = mnist.load_data()
# summarize loaded dataset
print('Train: X=%s, y=%s' % (x_train.shape, y_train.shape))
print('Test: X=%s, y=%s' % (x_test.shape, y_test.shape))
3. Text
Text是Keras中用于处理文本的工具类,它可以进行文本向量化、学习词嵌入、截断文本、填充文本等操作。
将文本向量化:
from keras.preprocessing.text import Tokenizer
docs = ['Well done!',
'Good work',
'Great effort',
'nice work',
'Excellent!']
# create the tokenizer
t = Tokenizer()
# fit the tokenizer on the documents
t.fit_on_texts(docs)
# summarize what was learned
print(t.word_counts)
print(t.document_count)
print(t.word_index)
print(t.word_docs)
# integer encode documents
encoded_docs = t.texts_to_matrix(docs, mode='count')
print(encoded_docs)
三、数据预处理的常用方法
1. 数据归一化/标准化
数据归一化/标准化是深度学习中常用的操作,它可以可以把不同特征之间的值缩放到同一水平,防止某个特征的值对算法的影响过大。
将数据标准化:
from sklearn.preprocessing import StandardScaler
# define data
data = [[0.1, 0.3],
[0.2, 0.4],
[0.3, 0.5],
[0.4, 0.6],
[0.5, 0.7]]
# create scaler
scaler = StandardScaler()
# fit and transform data
scaled = scaler.fit_transform(data)
# summarize transformed data
print(scaled)
2. 数据分割
为了进行模型的训练集测试集划分,需要对原始数据进行分割。
将数据随机分割为训练集和测试集:
from sklearn.model_selection import train_test_split
# define data
data = [[0.1, 0.3],
[0.2, 0.4],
[0.3, 0.5],
[0.4, 0.6],
[0.5, 0.7]]
# split into train/test sets
train, test = train_test_split(data, test_size=0.33, random_state=1)
# summarize data split
print(train)
print(test)
3. 数据缺失值处理
在实际应用中,经常会遇到缺失数据的情况,因此处理缺失数据也是数据预处理中十分必要的一步。
通过平均值填充缺失的数据:
from numpy import isnan
from pandas import read_csv
from sklearn.impute import SimpleImputer
# load dataset
dataset = read_csv('data.csv', header=None)
# mark all missing values
dataset[dataset == '?'] = numpy.nan
# convert to numpy array
data = dataset.values
# split into input and output elements
X, y = data[:, :-1], data[:, -1]
# ensure all data are float values
X = X.astype('float32')
# prepare the imputer
imputer = SimpleImputer(strategy='mean')
# fit on the dataset
imputer.fit(X)
# transform the dataset
Xtrans = imputer.transform(X)
# summarize total missing
print('Missing: %d' % sum(isnan(X).flatten()))
# summarize total missing
print('Missing: %d' % sum(isnan(Xtrans).flatten()))
四、总结
本文介绍了Keras中的数据预处理类和数据预处理的几种常用方法。不同的数据预处理方法对于不同的深度学习模型会产生不同的影响,因此在实际应用中,我们需要根据模型需求和数据集特性来选择合适的预处理方式。