一、為什麼需要預處理數據集
在深度學習的實際應用中,數據預處理是至關重要的一個環節。這是因為深度學習算法的準確性和性能密切相關於它在訓練時所使用的數據集的質量和規模。預處理數據集可以使你的算法更加精準高效,提高算法的泛化性、減少模型的擬合程度、提高模型的精度等多種好處。
在實際應用場景中,需要進行的預處理包括但不限於數據清洗、數據類型轉換、數據歸一化/標準化、數據的分割、數據的擴充、圖片的裁剪、旋轉等等。本文主要介紹如何使用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中的數據預處理類和數據預處理的幾種常用方法。不同的數據預處理方法對於不同的深度學習模型會產生不同的影響,因此在實際應用中,我們需要根據模型需求和數據集特性來選擇合適的預處理方式。
原創文章,作者:小藍,如若轉載,請註明出處:https://www.506064.com/zh-hk/n/301497.html