資料科學專案中,資料預處理和模型訓練是至關重要的步驟。本文將示範如何使用 Python 的 Pandas 函式庫進行資料處理,並使用 Keras 建立和訓練機器學習模型。首先,我們會使用 Pandas 載入資料集,處理缺失值,並將資料分割成訓練集和測試集。接著,我們會使用 Keras 建立一個線性迴歸模型,並使用訓練資料進行訓練。訓練過程中,我們會監控損失函式的變化,並調整模型引數以提升效能。最後,我們會使用測試集評估模型的效能,並使用訓練好的模型進行預測。

使用Python和Pandas進行資料載入和預處理

首先,我們需要載入必要的函式庫,包括Pandas和TensorFlow。然後,我們可以使用Pandas的read_csv函式載入資料集。

import pandas as pd
import tensorflow as tf
from sklearn.model_selection import train_test_split
from tensorflow.keras.models import Sequential
from tensorflow.keras.layers import Dense
from tensorflow.keras.optimizers import SGD
from tensorflow.keras.losses import mse
import matplotlib.pyplot as plt

# 載入資料集
csv_data = '../data/datasets/bottle.csv'
df = pd.read_csv(csv_data, delimiter=',')

# 選擇要保留的變數:'T_degC','Salnty','O2ml_L'
df = df[['T_degC','Salnty','O2ml_L']]

# 刪除含有缺失值的列
df = df.dropna()

# 將資料分為訓練集和測試集(20%)
X = df[['Salnty','O2ml_L']]
y = df['T_degC']
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42)

建立Sequential模型

接下來,我們可以建立一個Sequential模型,並新增一個Dense層。由於我們只有兩個特徵,所以輸入維度為2。

# 建立Sequential模型
model = Sequential()

# 新增Dense層
model.add(Dense(1, input_dim=2, activation='linear'))

編譯模型和訓練

然後,我們可以編譯模型,選擇最佳化器和損失函式。這裡,我們使用隨機梯度下降最佳化器和均方差損失函式。

# 編譯模型
model.compile(optimizer=SGD(), loss=mse)

# 訓練模型
train = model.fit(X_train, y_train, epochs=50)

效能分析:損失隨時間的變化

最後,我們可以繪製損失隨時間的變化圖,觀察模型的訓練過程。

# 繪製損失隨時間的變化圖
plt.plot(train.history['loss'], label='loss')
plt.legend()
plt.show()

內容解密:

在這個例子中,我們使用Pandas載入資料集,然後選擇要保留的變數。接下來,我們刪除含有缺失值的列,並將資料分為訓練集和測試集。然後,我們建立一個Sequential模型,新增一個Dense層,並編譯模型。最後,我們訓練模型並繪製損失隨時間的變化圖。

圖表翻譯:

以下是損失隨時間的變化圖:

  flowchart TD
    A[開始] --> B[載入資料集]
    B --> C[選擇變數]
    C --> D[刪除缺失值]
    D --> E[分割資料]
    E --> F[建立模型]
    F --> G[編譯模型]
    G --> H[訓練模型]
    H --> I[繪製損失圖]
    I --> J[結束]

這個圖表展示了我們的資料處理和模型訓練過程。

線性迴歸模型的實作與預測

在上一節中,我們已經建立了一個簡單的線性迴歸模型,現在讓我們進一步探討如何使用這個模型進行預測和視覺化。

視覺化模型的訓練過程

首先,我們可以使用matplotlib函式庫來視覺化模型的訓練過程。以下是相關的程式碼:

import matplotlib.pyplot as plt

# 設定x軸和y軸的標籤
plt.xlabel('epochs')
plt.ylabel('loss')

# 顯示訓練過程中的loss曲線
plt.show()

這段程式碼會生成一個簡單的loss曲線圖,展示模型在訓練過程中的損失函式變化。

預測和視覺化

接下來,我們可以使用模型進行預測並視覺化結果。以下是相關的程式碼:

# 使用模型進行預測
y_pred = model.predict(X_train)

# 取得模型的權重和偏差
w0 = model.layers[0].get_weights()[0][0]
b = model.layers[0].get_weights()[1]

# 列印預出線性迴歸方程
print("Linear Regression Equation: %f x X_train + %f"%(w0,b))

# 繪製訓練資料點和預測曲線
plt.scatter(X_train, y_train, c='blue')
plt.plot(X_train, y_pred, color='green')

# 繪製線性迴歸方程曲線
plt.plot(X_train, w0*X_train + b, color='red')

# 設定x軸和y軸的標籤
plt.xlabel('X_train')
plt.ylabel('y_train')

# 顯示圖片
plt.show()

這段程式碼會生成一個包含訓練資料點、預測曲線和線性迴歸方程曲線的圖片。

預測新值

最後,我們可以使用模型進行新值的預測。以下是相關的程式碼:

# 使用模型進行新值預測
new_predictions = model.predict(X_test)
print(new_predictions)

這段程式碼會輸出模型對新輸入資料的預測結果。

內容解密:

  • model.predict(X_train):使用模型進行預測,輸入為X_train
  • model.layers[0].get_weights()[0][0]:取得模型的權重。
  • model.layers[0].get_weights()[1]:取得模型的偏差。
  • plt.scatter(X_train, y_train, c='blue'):繪製訓練資料點。
  • plt.plot(X_train, y_pred, color='green'):繪製預測曲線。
  • plt.plot(X_train, w0*X_train + b, color='red'):繪製線性迴歸方程曲線。

圖表翻譯:

  • 線性迴歸方程曲線(紅色):代表模型學習到的最佳擬合線。
  • 預測曲線(綠色):代表模型對訓練資料的預測結果。
  • 訓練資料點(藍色):代表原始訓練資料。

儲存模型以供未來使用

在完成模型訓練後,為了方便未來的使用和評估,我們需要將模型儲存起來。以下是如何使用Keras將線性迴歸模型儲存為檔案的步驟:

# 匯入必要的函式庫
from keras.models import load_model
from keras.models import Sequential
from keras.layers import Dense
import numpy as np

# 建立一個簡單的線性迴歸模型
model = Sequential()
model.add(Dense(1, input_dim=1))

# 編譯模型
model.compile(loss='mean_squared_error', optimizer='adam')

# 假設我們已經有訓練資料X_train和y_train
X_train = np.array([30, 31, 32, 33, 34, 35, 36, 37]).reshape(-1, 1)
y_train = np.array([10.906912, 10.992794, 10.961627, 11.023456, 11.054321, 11.085643, 11.116758, 11.147963]).reshape(-1, 1)

# 訓練模型
model.fit(X_train, y_train, epochs=100, verbose=0)

# 儲存模型
model.save('../Outputs/keras_linear_model')

# 載入儲存的模型
loaded_model = load_model('../Outputs/keras_linear_model')

# 使用載入的模型進行預測
predictions = loaded_model.predict(X_train)

# 印出預測結果
print(predictions)

在這個例子中,我們首先建立了一個簡單的線性迴歸模型,然後使用給定的訓練資料進行訓練。接著,我們儲存這個模型為檔案,然後再載入它以進行預測。這樣可以確保我們的模型可以在未來被重複使用和評估。

內容解密:

  • model.save('../Outputs/keras_linear_model'):這行程式碼用於儲存訓練好的模型到指定的路徑。
  • loaded_model = load_model('../Outputs/keras_linear_model'):這行程式碼用於載入之前儲存的模型,以便進行預測或進一步的分析。
  • predictions = loaded_model.predict(X_train):這行程式碼使用載入的模型對訓練資料進行預測,得到預測結果。

圖表翻譯:

  flowchart TD
    A[建立模型] --> B[編譯模型]
    B --> C[訓練模型]
    C --> D[儲存模型]
    D --> E[載入模型]
    E --> F[進行預測]

圖表翻譯:

此流程圖描述了從建立模型到使用載入的模型進行預測的整個過程。每個步驟都對應到上述程式碼中的特定部分,展示瞭如何從頭到尾完成一個基本的機器學習任務。

線性迴歸模型的實作和預測

在進行線性迴歸分析時,我們需要選擇適合的學習率和訓練迭代次數(epochs)。在這個例子中,我們選擇了學習率為 0.0001 和 50 個 epochs。

繪製迴歸線

繪製迴歸線可以透過兩種不同的方法實作,兩者都能夠產生相同的結果。第一種方法是計算模型的權重和偏差,然後繪製出對應的線性方程。第二種方法更為直接,只需使用模型預測的值即可。

方法一:計算權重和偏差

首先,我們需要從模型中提取出權重和偏差:

w0 = model.layers[0].get_weights()[0][0]
b = model.layers[0].get_weights()[1]

然後,我們可以使用這些引數繪製出線性方程:

plt.plot(X_train, w0*X_train + b, color='r')

方法二:直接使用預測值

或者,我們可以直接使用模型預測的值來繪製迴歸線:

plt.plot(X_train, y_pred, color='green')

預測新值

現在,模型已經準備好可以用來預測新的值了。假設我們有一組新的輸入資料 X_test,我們可以使用以下程式碼來進行預測:

new_predictions = model.predict(X_test)
print(new_predictions)

比較真實值和預測值

最後,我們可以透過散點圖來比較真實值 y_test 和預測值 new_predictions

plt.scatter(y_test, new_predictions, color='b')

這個圖表可以幫助我們直觀地評估模型的效能,瞭解它對新資料的預測能力如何。

多變數線性迴歸模型

在瞭解單變數線性迴歸的基礎後,我們現在要探討如何使用Keras和TensorFlow建立一個多變數線性迴歸模型。這種模型可以處理多個輸入特徵,以預測一個連續的輸出值。

資料準備

首先,我們需要載入必要的函式庫,包括TensorFlow、Pandas、NumPy和Matplotlib。接著,我們載入資料集,並選擇我們感興趣的變數。

import tensorflow as tf
import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
from tensorflow import keras
from tensorflow.keras import layers
from sklearn import preprocessing

# 載入資料集
csv_data = '../data/datasets/bottle.csv'
df = pd.read_csv(csv_data, delimiter=',')

# 選擇變數
df = df[['T_degC','Salnty','O2ml_L']]

資料預處理

在建立模型之前,通常需要對資料進行預處理。這包括處理缺失值、資料標準化或正規化等步驟。以下示範如何使用Sklearn進行資料標準化:

# 資料標準化
scaler = preprocessing.StandardScaler()
df[['T_degC','Salnty','O2ml_L']] = scaler.fit_transform(df[['T_degC','Salnty','O2ml_L']])

多變數線性迴歸模型

現在,我們可以開始建立多變數線性迴歸模型了。首先,需要定義模型的架構,包括輸入層、隱藏層和輸出層。

# 建立模型
model = keras.Sequential([
    layers.Dense(64, activation='relu', input_shape=(3,)),  # 輸入層
    layers.Dense(32, activation='relu'),  # 隱藏層
    layers.Dense(1)  # 輸出層
])

編譯模型

在定義模型架構後,需要編譯模型,指定損失函式、最佳化器和評估指標。

# 編譯模型
model.compile(optimizer='adam', loss='mean_squared_error', metrics=['mean_absolute_error'])

訓練模型

有了資料和模型後,就可以開始訓練模型了。需要將資料分割為訓練集和測試集,並指定訓練的epoch數和batch size。

# 分割資料
from sklearn.model_selection import train_test_split
X = df[['T_degC','Salnty']]
y = df['O2ml_L']
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42)

# 訓練模型
model.fit(X_train, y_train, epochs=100, batch_size=32, validation_data=(X_test, y_test))

評估模型

訓練完成後,可以使用測試集評估模型的效能。

# 評估模型
test_loss, test_mae = model.evaluate(X_test, y_test)
print(f'Test MAE: {test_mae:.2f}')

儲存模型

最後,可以將訓練好的模型儲存下來,以便未來使用。

# 儲存模型
model.save('../Outputs/keras_linear_model')

這樣,就完成了使用Keras和TensorFlow建立多變數線性迴歸模型的過程。這個模型可以用於預測連續值,並且可以根據實際需求進行調整和最佳化。

資料預處理與模型建立

在進行資料分析之前,首先需要對資料進行預處理,以確保資料的品質和完整性。這包括移除含有缺失值的列、分割資料為訓練和測試集、以及對資料進行標準化。

移除含有缺失值的列

df = df.dropna()

這一步驟是為了確保資料的完整性,移除任何含有缺失值的列。

分割資料為訓練和測試集

from sklearn.model_selection import train_test_split
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42)

這一步驟是將資料分割為訓練集和測試集,訓練集佔據80%,測試集佔據20%。

標準化資料

from sklearn.preprocessing import Normalizer
normalizer = Normalizer()
X_train = normalizer.fit_transform(X_train)
X_test = normalizer.transform(X_test)

這一步驟是對資料進行標準化,確保所有特徵的尺度是一致的。

建立模型

from tensorflow.keras.models import Sequential
from tensorflow.keras.layers import Dense
model = Sequential()
model.add(Dense(1, input_dim=2, activation='linear'))
model.summary()

這一步驟是建立一個簡單的神經網路模型,輸入層有2個神經元,輸出層有1個神經元,使用線性啟用函式。

編譯模型

from tensorflow.keras.optimizers import SGD
from tensorflow.keras.losses import MeanSquaredError
model.compile(optimizer=SGD(), loss=MeanSquaredError())

這一步驟是編譯模型,選擇最佳化器和損失函式。

訓練模型

train = model.fit(X_train, y_train, epochs=10)

這一步驟是訓練模型,使用訓練集進行訓練,共10個epoch。

效能分析

import matplotlib.pyplot as plt
plt.plot(train.history['loss'], label='loss')
plt.legend()
plt.show()

這一步驟是分析模型的效能,繪製損失函式隨著epoch的變化曲線。

圖表翻譯:

上述程式碼中,我們使用了幾個重要的步驟來建立和訓練一個簡單的神經網路模型。首先,我們移除了含有缺失值的列,然後分割資料為訓練和測試集。接下來,我們標準化了資料,然後建立了一個簡單的神經網路模型。編譯模型後,我們訓練了模型,並分析了模型的效能。最終,我們繪製了損失函式隨著epoch的變化曲線,以評估模型的效能。

機器學習模型評估與視覺化

在機器學習中,模型的評估和視覺化是兩個非常重要的步驟。評估模型的效能可以幫助我們瞭解模型的優缺點,而視覺化則可以讓我們更直觀地看到模型的預測結果和實際值之間的差異。

繪製訓練過程中的損失函式

import matplotlib.pyplot as plt

# 繪製訓練過程中的損失函式
plt.xlabel('訓練迭代次數')
plt.ylabel('損失函式值')
plt.show()

這段程式碼會生成一張圖表,顯示模型在訓練過程中的損失函式變化情況。

模型預測

# 使用模型進行預測
y_pred = model.predict(X_train)

這段程式碼會使用模型對訓練資料進行預測,得到預測結果 y_pred

提取模型權重和偏差

# 提取模型的權重和偏差
weights = model.layers[0].get_weights()[0]
bias = model.layers[0].get_weights()[1]

print('模型的截距和權重:')
print("截距:")
print(bias)
print("權重:")
print(weights)

這段程式碼會提取模型的權重和偏差,並將其印出。

評估模型效能

# 評估模型效能
from sklearn.metrics import mean_squared_error, r2_score

# 計算均方誤差
mse = mean_squared_error(y_true, y_pred)

# 計算R-squared值
r2 = r2_score(y_true, y_pred)

print('模型效能評估結果:')
print("均方誤差:")
print(mse)
print("R-squared值:")
print(r2)

這段程式碼會計算模型的均方誤差和R-squared值,並將其印出。

圖表翻譯:

  flowchart TD
    A[訓練資料] --> B[模型預測]
    B --> C[評估模型效能]
    C --> D[計算均方誤差和R-squared值]
    D --> E[印出評估結果]

這個流程圖表明了評估模型效能的步驟,從訓練資料到模型預測,然後到評估模型效能,最後印出評估結果。

Keras 模型評估與預測

在完成模型訓練後,評估模型的效能是非常重要的步驟。這裡,我們將使用均方根誤差(RMSE)和決定係數(R2 Score)來評估模型的好壞。

評估指標

  • 均方根誤差(RMSE):衡量預測值與實際值之間的差異。RMSE越小,表示模型的預測越準確。
  • 決定係數(R2 Score):衡量模型對資料的解釋程度。R2 Score越接近1,表示模型的預測越好。

實施評估

from sklearn.metrics import mean_squared_error, r2_score

# 評估模型
rmse = mean_squared_error(y_train, y_pred)
r2 = r2_score(y_train, y_pred)

print('Root mean squared error: ', rmse)
print('R2 score: ', r2)

預測新值

使用訓練好的模型對測試資料進行預測。

# 對測試資料進行預測
y_pred_new = model.predict(X_test)

print('Predictions: ')
print(y_pred_new)

新預測

重複對測試資料進行預測,以確認結果的一致性。

# 再次對測試資料進行預測
new_predictions = model.predict(X_test)

print('New Predictions: ')
print(new_predictions)

內容解密:

在上述程式碼中,我們首先計算了模型在訓練資料上的RMSE和R2 Score,以評估模型的效能。接著,我們使用訓練好的模型對測試資料進行預測,得到預測結果y_pred_new。最後,為了確認預測結果的一致性,我們再次對測試資料進行預測,得到new_predictions

圖表翻譯:

  flowchart TD
    A[模型訓練] --> B[評估模型]
    B --> C[預測新值]
    C --> D[確認預測結果]

此圖表描述了從模型訓練到評估和預測的流程。首先,模型需要被訓練;然後,評估模型的效能;接著,使用模型對新資料進行預測;最後,確認預測結果的一致性。

3.1 線性迴歸評估

在進行線性迴歸分析時,評估模型的效能是非常重要的。一個常用的評估指標是均方根誤差(Root Mean Squared Error, RMSE),它可以衡量模型預測值與實際值之間的差異。另一個重要的指標是R-squared(R²),它可以衡量模型對資料的解釋程度。

3.1.1 均方根誤差(RMSE)

均方根誤差是衡量模型預測值與實際值之間差異的指標。它的計算公式為:

RMSE = √(Σ(y_i - y_pred_i)^2 / n)

其中,y_i是實際值,y_pred_i是預測值,n是樣本數。

3.1.2 R-squared(R²)

R-squared是衡量模型對資料的解釋程度的指標。它的計算公式為:

R² = 1 - (Σ(y_i - y_pred_i)^2 / Σ(y_i - y_mean)^2)

其中,y_i是實際值,y_pred_i是預測值,y_mean是實際值的平均值。

3.2 邏輯迴歸

邏輯迴歸是一種監督式機器學習分類別器,用於預測類別變數或離散值。它的應用包括預測心臟病發生的機率、過濾郵件、或計算在競賽中被接受的機率。

3.2.1 二元邏輯迴歸

二元邏輯迴歸的目的是進行二元決策。它學習一組權重(w)和偏差項(b),然後將輸入特徵乘以權重、加上偏差項,最後透過sigmoid函式生成機率。

z = w * x + b

sigmoid(z) = 1 / (1 + exp(-z))

其中,z是輸入特徵與權重的點積加上偏差項,sigmoid(z)是sigmoid函式的輸出。

3.2.2 Sigmoid函式

Sigmoid函式是一種S形曲線,用於將實數對映到0到1之間的機率。

sigmoid(z) = 1 / (1 + exp(-z))

其中,exp(-z)是e的-z次方。

3.2.3 跨熵損失函式

跨熵損失函式是一種常用的損失函式,用於衡量模型預測值與實際值之間的差異。

L(y, y_pred) = -[y * log(y_pred) + (1-y) * log(1-y_pred)]

其中,y是實際值,y_pred是預測值。

從商業價值視角來看,掌握Python和Pandas進行資料預處理和模型建立,對於提升資料分析效率和商業決策至關重要。透過本文逐步講解的資料載入、清洗、轉換、建模、訓練、評估到儲存的完整流程,可以發現,利用這些工具能有效降低資料分析門檻,讓更多商業人員能參與到資料驅動的決策過程中。然而,模型的選擇和引數調整仍需專業知識,例如學習率和epochs的設定,以及不同評估指標(RMSE、R-squared)的解讀,才能避免模型過擬合或欠擬合等問題,真正發揮資料的商業價值。玄貓認為,未來低程式碼或無程式碼的機器學習平臺將進一步簡化建模流程,但深入理解資料分析的底層邏輯仍是不可或缺的核心能力,才能在快速變化的商業環境中保持競爭優勢。對於希望利用資料驅動商業決策的企業,投資於資料科學人才的培養和工具的應用將是重要的策略方向。