深度學習模型的效能取決於資料品質與模型架構。本文以 TSLA 股票價格預測為例,說明如何運用深度學習技術提升預測準確度。首先,使用 PySpark 讀取並預處理資料,包含特徵工程、向量組合與標準化,確保資料品質符合模型訓練需求。接著,利用 TensorFlow/Keras 建構多層感知器模型,並使用 Adam 最佳化器與均方誤差作為損失函式進行訓練。訓練過程中,調整學習率、批次大小等超引數以最佳化模型效能。最後,使用測試集評估模型,計算測試損失與 R2 分數,驗證模型的預測能力與泛化能力,確保模型能有效應用於實際股票價格預測。
提升模型效能的技術:以TSLA股票價格預測為例
在機器學習領域,模型的效能直接影響到預測的準確性。本文將介紹幾種提升模型效能的技術,並以TSLA股票價格預測為例進行實作。
資料預處理
首先,我們需要對資料進行預處理。這包括讀取資料、特徵工程和資料分割。
程式碼實作:資料預處理
def preprocess_data(self, file_path):
"""
預處理資料。
引數:
- file_path (str):CSV檔案路徑。
傳回:
- tuple:包含訓練和測試DataFrame的元組。
"""
df = self.spark.read.csv(file_path, header=True, inferSchema=True)
assembler = VectorAssembler(inputCols=['Open', 'High', 'Low', 'Volume'], outputCol='features')
df = assembler.transform(df)
scaler = StandardScaler(inputCol='features', outputCol='scaled_features', withMean=True, withStd=True)
scaler_model = scaler.fit(df)
df = scaler_model.transform(df)
train_df, test_df = df.randomSplit([0.8, 0.2], seed=42)
return train_df, test_df
內容解密:
- 使用Spark讀取CSV檔案並進行初步轉換。
- 利用
VectorAssembler將多個特徵欄位合併成一個向量欄位。 - 使用
StandardScaler對特徵進行標準化處理,以提高模型的穩定性。 - 將資料分割成訓練集和測試集。
建立與訓練模型
接下來,我們建立一個神經網路模型並進行訓練。
程式碼實作:建立與訓練模型
def create_and_train_model(self, train_features, train_labels):
"""
建立並訓練神經網路模型。
引數:
- train_features (ndarray):訓練特徵。
- train_labels (ndarray):訓練標籤。
傳回:
- History:包含每個Epoch損失值的訓練歷史。
"""
self.model = Sequential([
Dense(64, activation='relu', input_shape=(train_features.shape[1],)),
Dropout(0.5),
Dense(32, activation='relu'),
Dropout(0.5),
Dense(16, activation='relu'),
Dense(1)
])
self.model.compile(optimizer='adam', loss='mse')
history = self.model.fit(train_features, train_labels, epochs=100, batch_size=32, verbose=0)
return history
內容解密:
- 使用
SequentialAPI建立一個多層感知器(MLP)模型。 - 在模型中使用
Dropout層進行正則化,以避免過擬合。 - 使用Adam最佳化器和均方誤差(MSE)作為損失函式。
- 對模型進行訓練,並傳回訓練歷史。
模型評估
最後,我們對訓練好的模型進行評估。
程式碼實作:模型評估
def evaluate_model(self, test_features, test_labels):
"""
評估訓練好的模型。
引數:
- test_features (ndarray):測試特徵。
- test_labels (ndarray):測試標籤。
傳回:
- float:測試損失。
"""
test_loss = self.model.evaluate(test_features, test_labels)
return test_loss
內容解密:
- 使用測試資料對模型進行評估。
- 傳回模型的測試損失。
預測與評估
我們使用訓練好的模型進行預測,並評估預測結果。
程式碼實作:預測與評估
def predict_and_evaluate(self, test_features, test_labels):
"""
預測並評估神經網路模型。
引數:
- test_features (ndarray):測試特徵。
- test_labels (ndarray):測試標籤。
傳回:
- float:R2分數。
"""
test_predictions = self.model.predict(test_features)
r2_score_value = r2_score(test_labels, test_predictions)
return r2_score_value
內容解密:
- 使用模型對測試特徵進行預測。
- 計算預測結果的R2分數,以評估模型的預測能力。
主函式
最後,我們定義一個主函式來整合整個工作流程。
程式碼實作:主函式
def main(file_path):
try:
tsla_regressor = TSLARegressor()
train_df, test_df = tsla_regressor.preprocess_data(file_path)
train_features, train_labels, test_features, test_labels = tsla_regressor.convert_to_numpy(train_df, test_df)
history = tsla_regressor.create_and_train_model(train_features, train_labels)
test_loss = tsla_regressor.evaluate_model(test_features, test_labels)
r2_score_value = tsla_regressor.predict_and_evaluate(test_features, test_labels)
logging.info("Test Loss: {}".format(test_loss))
logging.info("R2 Score: {}".format(r2_score_value))
except Exception as e:
logging.error(f"An error occurred: {e}")
內容解密:
- 建立
TSLARegressor物件並呼叫其方法進行資料預處理、模型建立與訓練、模型評估和預測評估。 - 列印測試損失和R2分數,以評估模型的效能。
深度學習在股票價格預測中的應用:以TSLA股票為例
本篇文章將探討如何使用深度學習技術來預測股票價格,以TSLA股票為研究物件。我們將使用PySpark進行資料預處理,並利用TensorFlow建立神經網路模型。
資料預處理
首先,我們需要對資料進行預處理。我們使用PySpark的SparkSession來讀取CSV檔案,並使用VectorAssembler將特徵欄位組合成一個向量。接著,我們使用StandardScaler對特徵進行標準化處理。
程式碼實作
from pyspark.sql import SparkSession
from pyspark.ml.feature import VectorAssembler, StandardScaler
# 建立SparkSession
spark = SparkSession.builder.appName("TSLA_Regression").getOrCreate()
# 讀取CSV檔案
df = spark.read.csv(file_path, header=True, inferSchema=True)
# 組合特徵欄位
assembler = VectorAssembler(inputCols=['Open', 'High', 'Low', 'Volume'], outputCol='features')
df = assembler.transform(df)
# 標準化特徵
scaler = StandardScaler(inputCol='features', outputCol='scaled_features', withMean=True, withStd=True)
scaler_model = scaler.fit(df)
df = scaler_model.transform(df)
內容解密:
- 建立SparkSession:使用
SparkSession.builder建立一個SparkSession物件,設定應用程式名稱為"TSLA_Regression"。 - 讀取CSV檔案:使用
spark.read.csv方法讀取CSV檔案,設定header=True表示第一行是欄位名稱,inferSchema=True表示自動推斷資料型別。 - 組合特徵欄位:使用
VectorAssembler將特徵欄位組合成一個向量,輸出欄位名稱為’features’。 - 標準化特徵:使用
StandardScaler對特徵進行標準化處理,輸入欄位名稱為’features’,輸出欄位名稱為’scaled_features’。
資料分割與轉換
接下來,我們需要將資料分割成訓練集和測試集,並將資料轉換成NumPy陣列。
程式碼實作
# 分割資料
train_df, test_df = df.randomSplit([train_ratio, 1-train_ratio], seed=seed)
# 轉換成NumPy陣列
train_features = np.array(train_df.select('scaled_features').rdd.map(lambda x: x.scaled_features.toArray()).collect())
train_labels = np.array(train_df.select('Close').rdd.map(lambda x: x.Close).collect())
test_features = np.array(test_df.select('scaled_features').rdd.map(lambda x: x.scaled_features.toArray()).collect())
test_labels = np.array(test_df.select('Close').rdd.map(lambda x: x.Close).collect())
內容解密:
- 分割資料:使用
randomSplit方法將資料分割成訓練集和測試集,設定訓練集比例為train_ratio,隨機種子為seed。 - 轉換成NumPy陣列:使用
np.array將Spark DataFrame轉換成NumPy陣列,分別提取特徵和標籤欄位。
建立與訓練神經網路模型
現在,我們可以使用TensorFlow建立神經網路模型,並使用訓練資料進行訓練。
程式碼實作
from tensorflow.keras.models import Sequential
from tensorflow.keras.layers import Dense
from tensorflow.keras.regularizers import l1
# 建立神經網路模型
model = Sequential([
Dense(64, activation='relu', input_shape=(train_features.shape[1],), kernel_regularizer=l1(0.01)),
Dense(32, activation='relu', kernel_regularizer=l1(0.01)),
Dense(16, activation='relu', kernel_regularizer=l1(0.01)),
Dense(1)
])
# 編譯模型
model.compile(optimizer='adam', loss='mse')
# 訓練模型
history = model.fit(train_features, train_labels, epochs=epochs, batch_size=batch_size, verbose=0)
內容解密:
- 建立神經網路模型:使用
Sequential建立一個神經網路模型,包含四個全連線層,使用ReLU啟用函式和L1正則化。 - 編譯模型:使用
compile方法編譯模型,設定最佳化器為Adam,損失函式為均方誤差。 - 訓練模型:使用
fit方法訓練模型,設定訓練資料、迭代次數、批次大小和顯示模式。
模型評估與預測
最後,我們需要評估模型的效能,並使用測試資料進行預測。
程式碼實作
# 評估模型
test_loss = model.evaluate(test_features, test_labels)
# 預測
test_predictions = model.predict(test_features)
# 計算R2分數
r2_score_value = r2_score(test_labels, test_predictions)
內容解密:
- 評估模型:使用
evaluate方法評估模型的效能,計算測試資料的損失值。 - 預測:使用
predict方法進行預測,輸出測試資料的預測值。 - 計算R2分數:使用
r2_score函式計算R2分數,評估模型的擬合優度。
深度學習在股票價格預測中的應用:以TSLA股票為例
本篇文章將探討如何使用深度學習技術來預測股票價格,以特斯拉(TSLA)股票為具體案例進行分析。我們將介紹資料預處理、模型建立與訓練、模型評估等步驟,並提供完整的程式碼實作。
資料預處理
在進行股票價格預測之前,我們需要對原始資料進行預處理。這包括讀取CSV檔案、特徵工程、資料標準化等步驟。
程式碼實作:資料預處理
def preprocess_data(self, file_path, feature_cols=['Open', 'High', 'Low', 'Volume'], train_ratio=0.8, seed=42):
"""
預處理資料。
引數:
- file_path (str):CSV檔案的路徑。
- feature_cols (list):特徵欄位的列表。
- train_ratio (float):訓練資料的比例。
- seed (int):隨機種子,用於資料分割。
傳回:
- tuple:包含訓練和測試DataFrames的元組。
"""
df = self.spark.read.csv(file_path, header=True, inferSchema=True)
assembler = VectorAssembler(inputCols=feature_cols, outputCol='features')
df = assembler.transform(df)
scaler = StandardScaler(inputCol='features', outputCol='scaled_features', withMean=True, withStd=True)
scaler_model = scaler.fit(df)
df = scaler_model.transform(df)
train_df, test_df = df.randomSplit([train_ratio, 1-train_ratio], seed=seed)
return train_df, test_df
內容解密:
- 讀取CSV檔案:使用SparkSession讀取CSV檔案,並自動推斷資料型態。
- 特徵工程:使用VectorAssembler將多個特徵欄位合併成一個向量。
- 資料標準化:使用StandardScaler對特徵向量進行標準化處理,以提高模型訓練的穩定性。
- 資料分割:將資料分割成訓練集和測試集。
模型建立與訓練
接下來,我們將建立一個深度學習模型來預測股票價格。我們使用Keras的Sequential API來建立模型,並使用Adam最佳化器和均方誤差(MSE)作為損失函式。
程式碼實作:模型建立與訓練
def create_and_train_model(self, train_features, train_labels, epochs=100, batch_size=32):
"""
建立並訓練神經網路模型。
引數:
- train_features (ndarray):訓練特徵。
- train_labels (ndarray):訓練標籤。
- epochs (int):訓練的輪數。
- batch_size (int):批次大小。
傳回:
- History:包含每個輪次損失值的訓練歷史。
"""
self.input_shape = (train_features.shape[1],)
self.model = Sequential([
Dense(64, activation='relu', input_shape=self.input_shape),
Dense(32, activation='relu'),
Dense(16, activation='relu'),
Dense(1)
])
optimizer = Adam(learning_rate=0.01)
self.model.compile(optimizer=optimizer, loss='mse')
history = self.model.fit(train_features, train_labels, epochs=epochs, batch_size=batch_size, verbose=0)
return history
內容解密:
- 模型架構:使用四層全連線神經網路,第一層有64個神經元,第二層有32個,第三層有16個,最後一層輸出單一值。
- 啟用函式:前三層使用ReLU啟用函式,以引入非線性。
- 最佳化器和損失函式:使用Adam最佳化器和均方誤差(MSE)作為損失函式,以最小化預測誤差。
模型評估
在完成模型訓練後,我們需要對模型進行評估,以瞭解其在測試資料上的表現。
程式碼實作:模型評估
def evaluate_model(self, test_features, test_labels):
"""
評估訓練好的模型。
引數:
- test_features (ndarray):測試特徵。
- test_labels (ndarray):測試標籤。
傳回:
- float:測試損失。
"""
test_loss = self.model.evaluate(test_features, test_labels)
return test_loss
def predict_and_evaluate(self, test_features, test_labels):
"""
預測並評估神經網路模型。
引數:
- test_features (ndarray):測試特徵。
- test_labels (ndarray):測試標籤。
傳回:
- float:R2分數。
"""
test_predictions = self.model.predict(test_features)
r2_score_value = r2_score(test_labels, test_predictions)
return r2_score_value
內容解密:
- 測試損失:使用模型的
evaluate方法計算測試資料上的損失。 - R2分數:使用
r2_score函式計算預測值與真實值之間的R2分數,以評估模型的擬合優度。