在資料科學領域,迴歸分析是一項重要的技術,用於預測連續型變數。本文將示範如何運用 Copilot Chat 輔助進行迴歸分析,包含資料預處理、探索性資料分析、模型訓練與評估等步驟。首先,我們會檢查資料型別並進行必要的轉換,例如將日期字串轉換為日期時間格式,以及將價格字串轉換為浮點數。接著,進行探索性資料分析,檢查缺失值和離群值,並使用視覺化工具,如箱型圖,來理解資料分佈。為了深入瞭解變數之間的關係,我們會計算相關係數並使用熱力圖進行視覺化。在資料準備階段,會將資料分割成訓練集和測試集,以便後續模型訓練和評估。模型訓練階段會使用線性迴歸模型,並示範如何處理日期欄位以避免訓練錯誤。最後,使用多種評估指標,例如 MAE、MSE、RMSE 和 R 平方,來評估模型的效能,並提供後續分析和改進方向。

使用 Copilot Chat 進行迴歸分析

資料型別檢查與轉換

在進行資料分析之前,檢查 DataFrame 中的欄位資料型別是非常重要的步驟。可以使用 dtypes 屬性來檢查每個欄位的資料型別。

# 檢查每個欄位的資料型別
print(df.dtypes)

輸出結果顯示如下:

Date           object
Close/Last     object
Volume          int64
Open           object
High           object
Low            object
dtype: object

從輸出結果可以看出,「Date」欄位和價格欄位(「Close/Last」、「Open」、「High」、「Low」)被讀取為「object」型別,這在本質上是 pandas 中的字串。然而,為了進行分析,我們需要將「Date」欄位轉換為日期時間格式,將價格欄位轉換為浮點數型別。

# 將 'Date' 轉換為日期時間格式
df['Date'] = pd.to_datetime(df['Date'])

# 移除價格欄位中的 '$' 符號並轉換為浮點數
price_columns = ['Close/Last', 'Open', 'High', 'Low']
for col in price_columns:
    df[col] = df[col].str.replace('$', '').astype(float)

# 再次檢查資料型別
print(df.dtypes)

轉換後的輸出結果如下:

Date           datetime64[ns]
Close/Last            float64
Volume                  int64
Open                  float64
High                  float64
Low                   float64
dtype: object

探索性資料分析

在完成資料型別轉換後,我們可以進行探索性資料分析(Exploratory Data Analysis, EDA)。首先,檢查資料集中是否有缺失值。

# 檢查缺失值
print(df.isnull().sum())

輸出結果顯示如下:

Date        0
Close/Last  0
Volume      0
Open        0
High        0
Low         0
dtype: int64

結果表明資料集中沒有缺失值。接下來,我們可以進行資料視覺化並檢查是否有離群值。

資料視覺化與離群值檢查

可以使用 Matplotlib 或 Seaborn 等 Python 函式庫來視覺化資料。箱形圖(Boxplot)是檢查離群值的有效工具。

import matplotlib.pyplot as plt
import seaborn as sns

# 設定 matplotlib 圖形
f, axes = plt.subplots(2, 2, figsize=(15, 10))

# 為價格欄位繪製箱形圖
sns.boxplot(data=df['Close/Last'], ax=axes[0, 0])
sns.boxplot(data=df['Open'], ax=axes[0, 1])
sns.boxplot(data=df['High'], ax=axes[1, 0])
sns.boxplot(data=df['Low'], ax=axes[1, 1])

# 顯示圖形
plt.show()

圖表解讀:

此圖示展示了各價格欄位的分佈情況及可能的離群值。

透過視覺化檢查,我們可以更深入地瞭解資料的分佈特性,並進一步決定是否需要處理離群值。

後續步驟

在完成探索性資料分析和視覺化後,下一步是將資料分割為訓練集和測試集,並建立迴歸模型。這將有助於我們評估模型的效能並進行預測。

後續工作重點:

  1. 資料分割:將資料集分割為訓練集和測試集。
  2. 模型建立:使用訓練集建立迴歸模型。
  3. 模型評估:使用測試集評估模型的效能。

透過這些步驟,我們可以更全面地理解資料並建立有效的預測模型。

資料視覺化與相關性分析

在進行迴歸分析之前,我們需要了解資料的分佈情況以及變數之間的關係。首先,我們使用箱型圖(boxplot)來視覺化股價資料的分佈。

箱型圖視覺化

import matplotlib.pyplot as plt
import seaborn as sns

# 設定 matplotlib 圖形
f, axes = plt.subplots(2, 2, figsize=(15, 10))

# 繪製箱型圖
sns.boxplot(data=df[' Close/Last'], ax=axes[0, 0])
axes[0, 0].set_title('Close/Last')
sns.boxplot(data=df[' Open'], ax=axes[0, 1])
axes[0, 1].set_title('Open')
sns.boxplot(data=df[' High'], ax=axes[1, 0])
axes[1, 0].set_title('High')
sns.boxplot(data=df[' Low'], ax=axes[1, 1])
axes[1, 1].set_title('Low')

plt.tight_layout()

內容解密:

  1. 使用 matplotlibseaborn 進行資料視覺化:這段程式碼首先匯入必要的函式庫,並設定一個 2x2 的子圖格線。
  2. 箱型圖的作用:箱型圖用於顯示資料的分佈情況和潛在的異常值。每個箱型圖代表一個股價欄位的分佈。
  3. sns.boxplot 函式:用於繪製箱型圖,ax 引數指定繪製的子圖位置。
  4. set_title 方法:為每個子圖設定標題,以標示對應的股價欄位。

相關性分析與熱力圖視覺化

接下來,我們計算變數之間的相關係數,並使用熱力圖(heatmap)來視覺化這些相關性。

# 計算相關係數矩陣
corr = df.corr()

# 繪製熱力圖
sns.heatmap(corr, annot=True, cmap='coolwarm')
plt.show()

內容解密:

  1. df.corr() 方法:計算資料集中各變數之間的相關係數,傳回一個相關係數矩陣。
  2. sns.heatmap 函式:根據相關係數矩陣繪製熱力圖,annot=True 引數使相關係數顯示在圖上,cmap='coolwarm' 設定顏色對映。
  3. 相關係數的意義:相關係數範圍從 -1 到 1,接近 1 表示高度正相關,接近 -1 表示高度負相關,接近 0 表示無相關性。
  4. 結果解讀:從熱力圖中可以看出,Close/Last、Open、High 和 Low 之間具有高度正相關,而 Volume 與這些價格變數之間具有負相關。

資料準備與模型訓練

在瞭解變數之間的關係後,下一步是準備資料以進行模型訓練。

資料分割

from sklearn.model_selection import train_test_split

# 定義特徵變數和目標變數
X = df.drop(' Close/Last', axis=1)
y = df[' Close/Last']

# 分割資料為訓練集和測試集
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42)

內容解密:

  1. train_test_split 函式:用於將資料分割為訓練集和測試集,test_size=0.2 表示 20% 的資料用作測試集。
  2. random_state 引數:確保每次執行程式碼時得到相同的分割結果,便於重現實驗。
  3. 特徵變數與目標變數X 代表特徵變數,y 代表目標變數(此例中為 ‘Close/Last’ 股價)。

列印樣本形狀

print(X_train.shape, X_test.shape, y_train.shape, y_test.shape)

內容解密:

  1. 檢視資料分割結果:透過列印 X_trainX_testy_trainy_test 的形狀,可以確認資料分割是否正確。

使用 Copilot Chat 進行迴歸分析

驗證訓練集與測試集的維度

在進行迴歸分析之前,確認訓練集與測試集的維度是否正確是非常重要的。你可以使用 shape 屬性來列印訓練集和測試集的形狀。以下是一個簡單的程式碼範例:

# 列印訓練集和測試集的形狀
print("訓練集 (X):", X_train.shape)
print("訓練集 (y):", y_train.shape)
print("測試集 (X):", X_test.shape)
print("測試集 (y):", y_test.shape)

內容解密:

  1. X_train.shapey_train.shape:這兩個屬性分別代表訓練特徵資料和訓練目標變數的形狀。理想情況下,它們的行數應該相同。
  2. X_test.shapey_test.shape:同樣地,這兩個屬性代表測試特徵資料和測試目標變數的形狀,它們的行數也應該一致。
  3. X_trainX_test 的列數相同:這確保了訓練和測試資料具有相同的特徵數量。
  4. y_trainy_test 只有一列:這是因為它們代表的是目標變數,通常是一個單一的值。

執行上述程式碼後,你應該會看到類別似以下的輸出:

訓練集 (X):(2014, 5)
訓練集 (y):(2014,)
測試集 (X):(504, 5)
測試集 (y):(504,)

建立迴歸模型

在分割資料後,下一步是建立和訓練迴歸模型。你可以使用簡單的線性迴歸模型,或是根據資料特性和問題需求選擇更複雜的模型,如多項式迴歸或嶺迴歸。

使用線性迴歸模型

以下是一個使用 sklearn.linear_model 中的 LinearRegression 類別來建立和訓練線性迴歸模型的範例:

from sklearn.linear_model import LinearRegression

# 建立線性迴歸模型
model = LinearRegression()

# 訓練模型
model.fit(X_train, y_train)

內容解密:

  1. LinearRegression():建立一個線性迴歸模型的例項。
  2. model.fit(X_train, y_train):使用訓練資料來訓練模型。fit 方法會調整模型引數以最小化預測誤差。
  3. 注意事項:如果資料具有非線性關係,可能需要使用更複雜的模型,如多項式迴歸或根據樹的模型。此外,如果特徵的尺度不同,可能需要在訓練前對資料進行縮放。

執行上述程式碼可能會遇到錯誤,如 DTypePromotionError。這通常與輸入資料的型別或格式有關,需要進一步檢查和調整。

此圖示說明:
  1. 資料準備:收集並預處理資料。
  2. 分割資料:將資料分成訓練集和測試集。
  3. 驗證資料維度:確認訓練集和測試集的形狀是否正確。
  4. 建立迴歸模型:根據需求選擇合適的迴歸模型。
  5. 訓練模型:使用訓練資料調整模型引數。
  6. 評估模型:使用測試資料評估模型的效能。

機器學習模型訓練中的日期欄位處理

在進行機器學習模型訓練時,經常會遇到資料中包含日期欄位的情況。以線性迴歸模型(LinearRegression)為例,當資料集中的特徵包含日期格式的欄位時,模型訓練可能會出現錯誤。錯誤訊息通常會指出日期資料型別與其他數值型別之間無法進行適當的轉換。

問題分析

在上述範例中,當嘗試使用LinearRegression()模型進行訓練時,出現了DTypePromotionError。錯誤訊息表明,模型無法處理包含DateTime64DType的資料欄位,因為它需要的是數值型別的輸入。

錯誤訊息解析

錯誤訊息中提到,<class 'numpy.dtypes.DateTime64DType'>無法被提升為<class 'numpy.dtypes.Float64DType'>,這意味著這些資料型別之間沒有共同的資料型別可以將它們儲存在同一個陣列中,除非將資料型別設為object

解決方案

為瞭解決這個問題,可以從日期欄位中提取出有用的特徵,如年、月、日等,並將這些特徵轉換為數值型資料。以下是具體的處理步驟:

程式碼範例

# 從 'Date' 欄位中提取特徵
X_train['Year'] = X_train['Date'].dt.year
X_train['Month'] = X_train['Date'].dt.month
X_train['Day'] = X_train['Date'].dt.day

# 丟棄原始的 'Date' 欄位
X_train = X_train.drop('Date', axis=1)

# 對測試集進行相同的處理
X_test['Year'] = X_test['Date'].dt.year
X_test['Month'] = X_test['Date'].dt.month
X_test['Day'] = X_test['Date'].dt.day
X_test = X_test.drop('Date', axis=1)

# 再次嘗試訓練模型
model.fit(X_train, y_train)

內容解密

  1. 提取日期特徵:使用.dt.year.dt.month.dt.day從日期欄位中提取年、月和日,並將它們新增為新的欄位。

    • .dt.year:取得日期欄位的年份部分。
    • .dt.month:取得日期欄位的月份部分。
    • .dt.day:取得日期欄位的日期部分。
  2. 丟棄原始日期欄位:使用.drop()方法丟棄原始的日期欄位,以避免在模型訓練過程中再次遇到資料型別不符的問題。

    • axis=1引數表示丟棄的是欄位(column)而非列(row)。
  3. 一致性處理:確保訓練集和測試集都經過相同的處理,以保持資料的一致性。

  4. 重新訓練模型:完成上述處理後,再次使用處理後的資料訓練模型。

使用 Copilot Chat 進行迴歸分析

評估模型效能

在訓練完成後,我們需要使用測試資料對模型進行預測,並評估模型的效能。Copilot Chat 建議使用多種評估指標來衡量迴歸模型的表現。

常見的評估指標

常見的迴歸模型評估指標包括:

  • 平均絕對誤差(MAE):預測值與實際值之間差異的平均值,反映了預測的準確度。
  • 平均平方誤差(MSE):預測值與實際值之間差異的平方平均值,放大了大誤差的影響。
  • 均方根誤差(RMSE):MSE 的平方根,與輸出變數具有相同的單位,更容易解釋。
  • R 平方(R²):模型預測的變異數佔總變異數的比例,衡量模型對資料的擬合程度。
  • 調整後的 R 平方:根據模型中的預測變數數量進行調整的 R 平方,只有當新項改善模型的程度超過預期時才會增加。

內容解密:

這些指標各自有其優缺點,選擇合適的指標取決於具體問題和分析目標。

進行預測與評估

根據 Copilot Chat 的建議,我們可以使用以下程式碼進行預測和評估:

from sklearn import metrics
import numpy as np

# 使用模型對測試資料進行預測
y_pred = model.predict(X_test)

# 計算 MAE、MSE、RMSE 和 R2
mae = metrics.mean_absolute_error(y_test, y_pred)
mse = metrics.mean_squared_error(y_test, y_pred)
rmse = np.sqrt(mse)  # 或 metrics.mean_squared_error(y_test, y_pred, squared=False)
r2 = metrics.r2_score(y_test, y_pred)

# 輸出評估指標
print("平均絕對誤差(MAE):", mae)
print("平均平方誤差(MSE):", mse)
print("均方根誤差(RMSE):", rmse)
print("R 平方(R2):", r2)

內容解密:

這段程式碼首先使用訓練好的模型對測試資料進行預測,然後計算 MAE、MSE、RMSE 和 R²,以評估模型的效能。最後輸出這些評估指標。

執行結果

執行上述程式碼後,我們得到以下結果:

平均絕對誤差(MAE):0.458844690389933
平均平方誤差(MSE):0.4236006011305136
均方根誤差(RMSE):0.6508460656180642
R 平方(R2):0.999868004623502

內容解密:

這些結果表明模型的預測能力非常好,具有很高的準確度。

後續步驟

根據 Copilot Chat 的回應,我們可以進一步分析和改善模型。例如,可以根據評估結果調整模型的超引數,或者嘗試不同的模型架構,以進一步提高模型的效能。