使用 TensorFlow 加載 pandas.DataFrame 數據
DataFrame,直譯叫做“數據幀”,是一種二位數據,也就是說 DataFrame 是一種以表格形式存儲數據的數據格式。
因為在機器學習之中最常用的表格數據格式是 CSV 格式的表格數據,因此機器學習領域的 DataFrame 絕大多數都是由 CSV 文件讀取而來的。因此這節課我們主要學習如何從 CSV 數據之中讀取 DataFrame 數據并且將其轉化為 TensorFlow 能夠使用的數據集合。
總體來說使用 DataFrame 加載數據大致分為四步:
- 使用 pandas 讀取數據文件為 DataFrame;
- 對 于DataFrame 進一步處理;
- 將 DataFrame 數據轉化為 tf.data.Dataset;
- 進一步的數據處理與使用。
那么在接下來我們會以一個之前學習過的泰坦尼克數據集作為簡單的示例來帶領大家使用 pandas.DataFrame 讀取并加載數據。
1. 使用 pandas 讀取數據文件為 DataFrame
首先我們需要在機器上安裝 pandas,如果在安裝 TensorFlow 的過程中沒有自動安裝 pandas ,那么我們就需要手動安裝 pandas :
pip install pandas
對于 CSV 文件,我們只需要使用 pd.read_csv() 函數就可以正確地讀取CSV文件中的數據為 DataFrame 格式數據。
具體來說,我們可以通過以下代碼進行操作:
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 是我們之前學習過的獲得數據集合文件。而最后一行的 train_df.head() 是顯示數據集合的前 5 條數據,我們可以得到輸出為:
2. 對 DataFrame 進一步處理
在這一個步驟之中,我們要進行的工作主要有:
- 離散數據離散化,并且進行編碼;
- 分離標簽與數據。
對于離散數據離散化,我們可以使用 pandas 內置的 pd.Categorical() 方法進行;而后我們需要進行的是離散數據的編碼,此時我們可以通過 DataFrame.xxx.cat.codes 來實現,其中 xxx 為 DataFrame 的屬性。
具體我們可以通過以下代碼實現:
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()
我們可以得到如下輸出:
可以發現,之前的離散數據現在都已經使用整數進行編碼了。
要分離標簽與數據,我們可以直接通過 pop() 函數來實現:
labels = train_df.pop('survived')
3. 構建 tf.data.Dataset 數據集
在這一步,我們可以使用之前的方法 tf.data.Dataset.from_tensor_slices 來進行數據集的構造。
對于該示例,我們可以通過以下代碼實現:
train_dataset = tf.data.Dataset.from_tensor_slices((train_df.values, labels.values))
train_dataset = train_dataset.shuffle(len(train_df)).batch(32)
4. 數據集的使用
在這里,我們使用和之前相似的模型進行演示,于是我們首先定義一個分類器,然后進行訓練。
具體代碼如下所示:
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)
我們可以得到結果:
......
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
我們可以發現,我們的模型在訓練集合上達到了 82% 的準確率。
5. 小結
在本節課之中,我們學習了如何使用 pandas.DataFrame 來進行數據集合的加載。在加載的過程之中,我們首先要讀取數據,然后對離散數據進行進一步的處理,再者構建 tf.data.Dataset 用于以后的訓練使用。