使用 TensorFlow 加載 pandas.DataFrame 數(shù)據(jù)
DataFrame,直譯叫做“數(shù)據(jù)幀”,是一種二位數(shù)據(jù),也就是說 DataFrame 是一種以表格形式存儲數(shù)據(jù)的數(shù)據(jù)格式。
因?yàn)樵跈C(jī)器學(xué)習(xí)之中最常用的表格數(shù)據(jù)格式是 CSV 格式的表格數(shù)據(jù),因此機(jī)器學(xué)習(xí)領(lǐng)域的 DataFrame 絕大多數(shù)都是由 CSV 文件讀取而來的。因此這節(jié)課我們主要學(xué)習(xí)如何從 CSV 數(shù)據(jù)之中讀取 DataFrame 數(shù)據(jù)并且將其轉(zhuǎn)化為 TensorFlow 能夠使用的數(shù)據(jù)集合。
總體來說使用 DataFrame 加載數(shù)據(jù)大致分為四步:
- 使用 pandas 讀取數(shù)據(jù)文件為 DataFrame;
- 對 于DataFrame 進(jìn)一步處理;
- 將 DataFrame 數(shù)據(jù)轉(zhuǎn)化為 tf.data.Dataset;
- 進(jìn)一步的數(shù)據(jù)處理與使用。
那么在接下來我們會以一個(gè)之前學(xué)習(xí)過的泰坦尼克數(shù)據(jù)集作為簡單的示例來帶領(lǐng)大家使用 pandas.DataFrame 讀取并加載數(shù)據(jù)。
1. 使用 pandas 讀取數(shù)據(jù)文件為 DataFrame
首先我們需要在機(jī)器上安裝 pandas,如果在安裝 TensorFlow 的過程中沒有自動安裝 pandas ,那么我們就需要手動安裝 pandas :
pip install pandas
對于 CSV 文件,我們只需要使用 pd.read_csv() 函數(shù)就可以正確地讀取CSV文件中的數(shù)據(jù)為 DataFrame 格式數(shù)據(jù)。
具體來說,我們可以通過以下代碼進(jìn)行操作:
import pandas as pd
import tensorflow as tf
train_file = tf.keras.utils.get_file("train.csv", "https://storage.googleapis.com/tf-datasets/titanic/train.csv")
train_df = pd.read_csv(train_file)
train_df.head()
其中,tf.keras.utils.get_file 是我們之前學(xué)習(xí)過的獲得數(shù)據(jù)集合文件。而最后一行的 train_df.head() 是顯示數(shù)據(jù)集合的前 5 條數(shù)據(jù),我們可以得到輸出為:
2. 對 DataFrame 進(jìn)一步處理
在這一個(gè)步驟之中,我們要進(jìn)行的工作主要有:
- 離散數(shù)據(jù)離散化,并且進(jìn)行編碼;
- 分離標(biāo)簽與數(shù)據(jù)。
對于離散數(shù)據(jù)離散化,我們可以使用 pandas 內(nèi)置的 pd.Categorical() 方法進(jìn)行;而后我們需要進(jìn)行的是離散數(shù)據(jù)的編碼,此時(shí)我們可以通過 DataFrame.xxx.cat.codes 來實(shí)現(xiàn),其中 xxx 為 DataFrame 的屬性。
具體我們可以通過以下代碼實(shí)現(xiàn):
train_df['sex'] = pd.Categorical(train_df['sex'])
train_df['sex'] = train_df.sex.cat.codes
train_df['deck'] = pd.Categorical(train_df['deck'])
train_df['deck'] = train_df.deck.cat.codes
train_df['embark_town'] = pd.Categorical(train_df['embark_town'])
train_df['embark_town'] = train_df.embark_town.cat.codes
train_df['alone'] = pd.Categorical(train_df['alone'])
train_df['alone'] = train_df.alone.cat.codes
train_df['classes'] = pd.Categorical(train_df['class'])
train_df['classes'] = train_df.classes.cat.codes
train_df.pop('class')
train_df.head()
我們可以得到如下輸出:
可以發(fā)現(xiàn),之前的離散數(shù)據(jù)現(xiàn)在都已經(jīng)使用整數(shù)進(jìn)行編碼了。
要分離標(biāo)簽與數(shù)據(jù),我們可以直接通過 pop() 函數(shù)來實(shí)現(xiàn):
labels = train_df.pop('survived')
3. 構(gòu)建 tf.data.Dataset 數(shù)據(jù)集
在這一步,我們可以使用之前的方法 tf.data.Dataset.from_tensor_slices 來進(jìn)行數(shù)據(jù)集的構(gòu)造。
對于該示例,我們可以通過以下代碼實(shí)現(xiàn):
train_dataset = tf.data.Dataset.from_tensor_slices((train_df.values, labels.values))
train_dataset = train_dataset.shuffle(len(train_df)).batch(32)
4. 數(shù)據(jù)集的使用
在這里,我們使用和之前相似的模型進(jìn)行演示,于是我們首先定義一個(gè)分類器,然后進(jìn)行訓(xùn)練。
具體代碼如下所示:
model = tf.keras.Sequential([
tf.keras.layers.Dense(128, activation='relu'),
tf.keras.layers.Dense(64, activation='relu'),
tf.keras.layers.Dense(1, activation='sigmoid'),
])
model.compile(
loss='binary_crossentropy',
optimizer='adam',
metrics=['accuracy'])
model.fit(train_dataset, epochs=30)
我們可以得到結(jié)果:
......
Epoch 29/30
20/20 [==============================] - 0s 1ms/step - loss: 0.4398 - accuracy: 0.8086
Epoch 30/30
20/20 [==============================] - 0s 2ms/step - loss: 0.4332 - accuracy: 0.8214
我們可以發(fā)現(xiàn),我們的模型在訓(xùn)練集合上達(dá)到了 82% 的準(zhǔn)確率。
5. 小結(jié)
在本節(jié)課之中,我們學(xué)習(xí)了如何使用 pandas.DataFrame 來進(jìn)行數(shù)據(jù)集合的加載。在加載的過程之中,我們首先要讀取數(shù)據(jù),然后對離散數(shù)據(jù)進(jìn)行進(jìn)一步的處理,再者構(gòu)建 tf.data.Dataset 用于以后的訓(xùn)練使用。