深度學習模型的效能取決於資料品質與模型架構。本文以 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

內容解密:

  1. 使用Spark讀取CSV檔案並進行初步轉換。
  2. 利用VectorAssembler將多個特徵欄位合併成一個向量欄位。
  3. 使用StandardScaler對特徵進行標準化處理,以提高模型的穩定性。
  4. 將資料分割成訓練集和測試集。

建立與訓練模型

接下來,我們建立一個神經網路模型並進行訓練。

程式碼實作:建立與訓練模型

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

內容解密:

  1. 使用Sequential API建立一個多層感知器(MLP)模型。
  2. 在模型中使用Dropout層進行正則化,以避免過擬合。
  3. 使用Adam最佳化器和均方誤差(MSE)作為損失函式。
  4. 對模型進行訓練,並傳回訓練歷史。

模型評估

最後,我們對訓練好的模型進行評估。

程式碼實作:模型評估

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

內容解密:

  1. 使用測試資料對模型進行評估。
  2. 傳回模型的測試損失。

預測與評估

我們使用訓練好的模型進行預測,並評估預測結果。

程式碼實作:預測與評估

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

內容解密:

  1. 使用模型對測試特徵進行預測。
  2. 計算預測結果的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}")

內容解密:

  1. 建立TSLARegressor物件並呼叫其方法進行資料預處理、模型建立與訓練、模型評估和預測評估。
  2. 列印測試損失和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)

內容解密:

  1. 建立SparkSession:使用SparkSession.builder建立一個SparkSession物件,設定應用程式名稱為"TSLA_Regression"。
  2. 讀取CSV檔案:使用spark.read.csv方法讀取CSV檔案,設定header=True表示第一行是欄位名稱,inferSchema=True表示自動推斷資料型別。
  3. 組合特徵欄位:使用VectorAssembler將特徵欄位組合成一個向量,輸出欄位名稱為’features’。
  4. 標準化特徵:使用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())

內容解密:

  1. 分割資料:使用randomSplit方法將資料分割成訓練集和測試集,設定訓練集比例為train_ratio,隨機種子為seed
  2. 轉換成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)

內容解密:

  1. 建立神經網路模型:使用Sequential建立一個神經網路模型,包含四個全連線層,使用ReLU啟用函式和L1正則化。
  2. 編譯模型:使用compile方法編譯模型,設定最佳化器為Adam,損失函式為均方誤差。
  3. 訓練模型:使用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)

內容解密:

  1. 評估模型:使用evaluate方法評估模型的效能,計算測試資料的損失值。
  2. 預測:使用predict方法進行預測,輸出測試資料的預測值。
  3. 計算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

內容解密:

  1. 讀取CSV檔案:使用SparkSession讀取CSV檔案,並自動推斷資料型態。
  2. 特徵工程:使用VectorAssembler將多個特徵欄位合併成一個向量。
  3. 資料標準化:使用StandardScaler對特徵向量進行標準化處理,以提高模型訓練的穩定性。
  4. 資料分割:將資料分割成訓練集和測試集。

模型建立與訓練

接下來,我們將建立一個深度學習模型來預測股票價格。我們使用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

內容解密:

  1. 模型架構:使用四層全連線神經網路,第一層有64個神經元,第二層有32個,第三層有16個,最後一層輸出單一值。
  2. 啟用函式:前三層使用ReLU啟用函式,以引入非線性。
  3. 最佳化器和損失函式:使用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

內容解密:

  1. 測試損失:使用模型的evaluate方法計算測試資料上的損失。
  2. R2分數:使用r2_score函式計算預測值與真實值之間的R2分數,以評估模型的擬合優度。