利用 Python 和 Scikit-learn 函式庫,我們可以建構一個預測客戶年度消費金額的迴歸模型。首先,將資料集分割成訓練集和測試集,分別用於模型訓練和效能評估。接著,初始化線性迴歸模型,並使用訓練資料進行擬合。模型訓練完成後,使用測試資料進行預測,並計算均方誤差(MSE)和 R 平方值等指標來評估模型效能。為了避免過擬合,我們進一步應用 Ridge 迴歸和 Lasso 迴歸等正則化技術,並使用交叉驗證來選擇最佳的正則化引數。最後,比較不同模型的效能,並討論如何生成合成資料集以增加模型複雜度,以及未來的研究方向。
使用ChatGPT建構客戶消費迴歸模型
在探討如何利用ChatGPT建構客戶消費迴歸模型的過程中,我們首先需要了解迴歸分析的基本概念及其在客戶消費行為預測中的應用。迴歸分析是一種統計方法,用於建立因變數(目標變數)與一個或多個自變數(預測變數)之間的關係模型。在本案例中,我們的目標是預測客戶每年的消費金額(Yearly Amount Spent)。
步驟1:資料準備
首先,我們需要準備資料,即將資料集分割為輸入特徵(X)和目標變數(y)。
# 提取輸入特徵(X)和目標變數(y)
X = ecommerce_data[['Avg. Session Length', 'Time on App', 'Time on Website', 'Length of Membership']]
y = ecommerce_data['Yearly Amount Spent']
內容解密:
X = ecommerce_data[['Avg. Session Length', 'Time on App', 'Time on Website', 'Length of Membership']]:此行程式碼從資料集中選取輸入特徵(‘Avg. Session Length’、‘Time on App’、‘Time on Website’、‘Length of Membership’),並將其指定給變數X。y = ecommerce_data['Yearly Amount Spent']:此行程式碼選取目標變數’Yearly Amount Spent’,並將其指定給變數y。
步驟2:資料分割
接下來,我們需要將資料分割為訓練集和測試集。
from sklearn.model_selection import train_test_split
# 將資料分割為訓練集和測試集(80%訓練,20%測試)
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42)
# 顯示訓練集和測試集的形狀
print("訓練集形狀 - X_train:", X_train.shape, "y_train:", y_train.shape)
print("測試集形狀 - X_test:", X_test.shape, "y_test:", y_test.shape)
內容解密:
from sklearn.model_selection import train_test_split:此行程式碼從sklearn.model_selection模組匯入train_test_split函式,用於將資料集分割為訓練集和測試集。train_test_split(X, y, test_size=0.2, random_state=42):此函式將輸入特徵(X)和目標變數(y)分割為訓練集和測試集。test_size引數指定了測試集的比例(本例中為20%)。random_state引數用於確保每次執行程式碼時產生相同的隨機分割結果。X_train, X_test, y_train, y_test:這些變數分別儲存了輸入特徵(X)和目標變數(y)的訓練集和測試集。print("訓練集形狀 - X_train:", X_train.shape, "y_train:", y_train.shape):此行程式碼列印訓練集輸入特徵(X_train)和目標變數(y_train)的形狀。print("測試集形狀 - X_test:", X_test.shape, "y_test:", y_test.shape):此行程式碼列印測試集輸入特徵(X_test)和目標變數(y_test)的形狀。
步驟3:模型初始化
現在,我們已經成功地將資料集分割為訓練集和測試集,接下來需要初始化線性迴歸模型。
from sklearn.linear_model import LinearRegression
# 初始化線性迴歸模型
model = LinearRegression()
內容解密:
from sklearn.linear_model import LinearRegression:此行程式碼從sklearn.linear_model模組匯入LinearRegression類別,用於建立線性迴歸模型。model = LinearRegression():此行程式碼建立了一個線性迴歸模型例項,並將其指定給變數model。
在後續步驟中,我們將繼續完善模型,包括訓練模型、評估模型效能等,以實作對客戶每年消費金額的準確預測。
使用 ChatGPT 建構客戶消費迴歸模型
逐步建構模型
在前面的章節中,我們探討瞭如何利用 ChatGPT 來進行資料預處理。在本文中,我們將進一步使用 ChatGPT 來建構一個線性迴歸模型,以預測客戶的年度消費金額。
步驟 3:模型初始化
首先,我們需要初始化一個線性迴歸模型。ChatGPT 提供以下程式碼:
from sklearn.linear_model import LinearRegression
model = LinearRegression()
內容解密:
from sklearn.linear_model import LinearRegression:這行程式碼從sklearn.linear_model模組中匯入LinearRegression類別,用於建立線性迴歸模型。model = LinearRegression():這行程式碼初始化一個線性迴歸模型物件,並將其指定給變數model。
步驟 4:模型訓練
接下來,我們需要使用訓練資料來訓練模型。ChatGPT 提供以下程式碼:
model.fit(X_train, y_train)
內容解密:
model.fit(X_train, y_train):這行程式碼使用訓練資料來訓練線性迴歸模型。fit方法接受輸入特徵(X_train)和對應的目標變數(y_train)作為引數,並調整模型的引數以最小化實際值和預測值之間的差異。
步驟 5:模型評估
模型訓練完成後,我們需要評估其在測試資料上的表現。ChatGPT 提供以下程式碼:
y_pred = model.predict(X_test)
from sklearn.metrics import mean_squared_error, r2_score
mse = mean_squared_error(y_test, y_pred)
r_squared = r2_score(y_test, y_pred)
print("Mean Squared Error (MSE):", mse)
print("R-squared (Coefficient of Determination):", r_squared)
內容解密:
model.predict(X_test):這行程式碼使用訓練好的模型對輸入特徵(X_test)進行預測,生成目標變數的預測值。from sklearn.metrics import mean_squared_error, r2_score:這行程式碼從sklearn.metrics模組中匯入mean_squared_error和r2_score函式,用於評估模型的表現。mean_squared_error(y_test, y_pred):這個函式計算實際目標變數(y_test)和預測值(y_pred)之間的均方誤差(MSE)。r2_score(y_test, y_pred):這個函式計算實際目標變數(y_test)和預測值(y_pred)之間的 R 平方(判定係數)。print("Mean Squared Error (MSE):", mse):這行程式碼列印均方誤差(MSE),它衡量了實際值和預測值之間的平均平方差。較低的 MSE 表示更好的模型表現。print("R-squared (Coefficient of Determination):", r_squared):這行程式碼列印 R 平方值,它表示模型能夠解釋的目標變數變異比例。越接近 1 的 R 平方值表示模型對資料的擬合越好。
評估結果
執行上述程式碼後,我們得到以下評估指標:
- Mean Squared Error (MSE): 109.8637411839399
- R-squared (Coefficient of Determination): 0.9778130629184127
ChatGPT 對這些結果的解釋是:
- MSE 約為 109.86,表示實際值和預測值之間的平均平方差較小,模型表現良好。
- R 平方值約為 0.978,表示模型能夠解釋約 97.8% 的目標變數變異,模型對資料的擬合非常好。
特徵 2:套用正規化技術
為了進一步提升模型的表現,我們可以使用正規化技術。ChatGPT 建議考慮使用正規化技術和交叉驗證來避免過度擬合。
是否可能過度擬合?
我們向 ChatGPT 請教是否可能過度擬合,得到的回應是我們的模型不太可能過度擬合,但仍需要考慮正規化技術和交叉驗證。
使用正規化技術的必要性
正規化技術可以幫助我們避免過度擬合,特別是在模型複雜或特徵數量較多的情況下。我們可以利用 ChatGPT 來瞭解如何套用正規化技術,以進一步提升模型的表現和穩定性。
正則化技術與交叉驗證線上性迴歸中的應用
在建立客戶消費支出的預測模型時,我們可能會遇到過擬合(overfitting)的問題。過擬合是指模型在訓練資料上表現良好,但在測試資料上表現不佳的現象。為了避免過擬合,我們可以採用正則化技術和交叉驗證方法。
過擬合的判斷指標
在判斷模型是否過擬合時,可以參考以下幾個指標:
- 訓練和測試效能之間的巨大差異:如果模型在訓練資料上的表現遠好於測試資料,則可能存在過擬合。
- 模型的複雜度:過於複雜的模型容易過擬合。線性迴歸相對簡單,但如果使用更高階的多項式迴歸,則可能增加過擬合的風險。
- 正則化技術:正則化技術(如Lasso或Ridge迴歸)可以透過對係數新增懲罰項來減少過擬合。
- 交叉驗證:使用交叉驗證技術(如k折交叉驗證)可以提供更穩健的模型效能評估。
Ridge迴歸與交叉驗證的實作
我們首先嘗試使用Ridge迴歸(L2正則化)來建立模型。Ridge迴歸透過在損失函式中新增係數的平方和(L2範數)來懲罰大係數。
from sklearn.linear_model import RidgeCV
# 初始化Ridge迴歸模型並進行交叉驗證
ridge_model = RidgeCV(alphas=[0.1, 1.0, 10.0], cv=5)
# 訓練Ridge迴歸模型
ridge_model.fit(X_train, y_train)
# 對測試資料進行預測
ridge_y_pred = ridge_model.predict(X_test)
# 評估模型效能
ridge_mse = mean_squared_error(y_test, ridge_y_pred)
ridge_r_squared = ridge_model.score(X_test, y_test)
# 輸出評估指標
print("Ridge迴歸 - 平均平方誤差(MSE):", ridge_mse)
print("Ridge迴歸 - R平方(決定係數):", ridge_r_squared)
print("Ridge迴歸 - 最佳Alpha值:", ridge_model.alpha_)
程式碼解析:
RidgeCV(alphas=[0.1, 1.0, 10.0], cv=5):初始化Ridge迴歸模型並進行交叉驗證。alphas引數指定了要測試的正則化強度(alpha值),cv引數指定了交叉驗證的折數。ridge_model.fit(X_train, y_train):使用訓練資料訓練Ridge迴歸模型。ridge_model.predict(X_test):使用訓練好的Ridge迴歸模型對測試資料進行預測。ridge_mse = mean_squared_error(y_test, ridge_y_pred):計算實際值和預測值之間的平均平方誤差(MSE)。ridge_model.score(X_test, y_test):計算R平方值(決定係數)。ridge_model.alpha_:傳回透過交叉驗證選擇的最佳alpha值(正則化強度)。
結果分析與下一步建議
執行上述程式碼後,我們得到以下結果:
Ridge迴歸 - 平均平方誤差(MSE):109.82024999312038
Ridge迴歸 - R平方(決定係數):0.9778218459464064
Ridge迴歸 - 最佳Alpha值:0.1
這些結果表明,Ridge迴歸模型的效能與標準線性迴歸模型非常接近。下一步,我們可以嘗試使用Lasso迴歸(L1正則化)來建立模型,並比較其效能。
Lasso迴歸與交叉驗證的實作
Lasso迴歸透過在損失函式中新增係數的絕對值和(L1範數)來懲罰大係數。下面是Lasso迴歸的實作程式碼:
from sklearn.linear_model import LassoCV
# 初始化Lasso迴歸模型並進行交叉驗證
lasso_model = LassoCV(alphas=[0.1, 1.0, 10.0], cv=5)
# 訓練Lasso迴歸模型
lasso_model.fit(X_train, y_train)
# 對測試資料進行預測
lasso_y_pred = lasso_model.predict(X_test)
# 評估模型效能
lasso_mse = mean_squared_error(y_test, lasso_y_pred)
lasso_r_squared = lasso_model.score(X_test, y_test)
# 輸出評估指標
print("Lasso迴歸 - 平均平方誤差(MSE):", lasso_mse)
print("Lasso迴歸 - R平方(決定係數):", lasso_r_squared)
print("Lasso迴歸 - 最佳Alpha值:", lasso_model.alpha_)
程式碼解析:
與Ridge迴歸類別似,Lasso迴歸也使用交叉驗證來選擇最佳的alpha值。不同的是,Lasso迴歸使用L1範數來懲罰大係數。
透過比較Ridge迴歸和Lasso迴歸的效能,我們可以選擇最適合客戶消費支出預測模型的正則化技術。
建立客戶消費迴歸模型與ChatGPT的協同應用
Ridge迴歸模型的交叉驗證結果分析
在前述章節中,我們探討了使用Ridge迴歸(L2正則化)結合交叉驗證來提升模型的效能。交叉驗證的結果顯示,Ridge迴歸模型選擇的最佳α值為0.1,顯示模型採用了適度的正則化。
from sklearn.linear_model import RidgeCV
# 初始化Ridge迴歸模型並進行交叉驗證
ridge_model = RidgeCV(alphas=[0.1, 1.0, 10.0], cv=5)
# 訓練Ridge迴歸模型
ridge_model.fit(X_train, y_train)
# 對測試資料進行預測
ridge_y_pred = ridge_model.predict(X_test)
# 評估模型效能
ridge_mse = mean_squared_error(y_test, ridge_y_pred)
ridge_r_squared = ridge_model.score(X_test, y_test)
# 輸出評估指標
print("Ridge Regression - Mean Squared Error (MSE):", ridge_mse)
print("Ridge Regression - R-squared (Coefficient of Determination):", ridge_r_squared)
print("Ridge Regression - Best Alpha:", ridge_model.alpha_)
內容解密:
RidgeCV(alphas=[0.1, 1.0, 10.0], cv=5):初始化Ridge迴歸模型並設定多組α值進行交叉驗證,以找出最佳的正則化引數。ridge_model.fit(X_train, y_train):使用訓練資料對模型進行訓練。ridge_model.predict(X_test):利用訓練好的模型對測試資料進行預測。mean_squared_error(y_test, ridge_y_pred):計算預測結果的均方誤差(MSE),評估模型的預測準確度。ridge_model.score(X_test, y_test):計算模型的R-squared值,評估模型的解釋能力。
Lasso迴歸模型的交叉驗證與效能評估
接著,我們嘗試使用Lasso迴歸(L1正則化)結合交叉驗證來觀察是否能夠進一步提升模型效能。
from sklearn.linear_model import LassoCV
# 初始化Lasso迴歸模型並進行交叉驗證
lasso_model = LassoCV(alphas=[0.1, 1.0, 10.0], cv=5)
# 訓練Lasso迴歸模型
lasso_model.fit(X_train, y_train)
# 對測試資料進行預測
lasso_y_pred = lasso_model.predict(X_test)
# 評估模型效能
lasso_mse = mean_squared_error(y_test, lasso_y_pred)
lasso_r_squared = lasso_model.score(X_test, y_test)
# 輸出評估指標
print("Lasso Regression - Mean Squared Error (MSE):", lasso_mse)
print("Lasso Regression - R-squared (Coefficient of Determination):", lasso_r_squared)
print("Lasso Regression - Best Alpha:", lasso_model.alpha_)
內容解密:
LassoCV(alphas=[0.1, 1.0, 10.0], cv=5):初始化Lasso迴歸模型並進行交叉驗證,以找出最佳的α值。lasso_model.fit(X_train, y_train):訓練Lasso迴歸模型。lasso_model.predict(X_test):對測試資料進行預測。- 評估指標的計算與輸出與Ridge迴歸相同,用於比較兩者的效能差異。
結果分析與比較
實驗結果顯示,Lasso迴歸與Ridge迴歸的效能在該資料集上差異不大,均與標準線性迴歸模型的效能相當。這些結果表明,在當前資料集的複雜度下,正則化技術並未顯著提升模型的表現。然而,在更大或更複雜的資料集中,正則化技術對於防止過擬合和提升模型泛化能力可能發揮更重要的作用。
生成合成資料集以增加複雜度
為了進一步探索模型的潛力,我們使用ChatGPT生成一個合成資料集,以模擬更複雜的真實場景。
import numpy as np
import pandas as pd
# 設定隨機種子以確保可重現性
np.random.seed(42)
# 設定樣本數量
n_samples = 500
# 生成合成輸入特徵
avg_session_length = np.random.normal(loc=30, scale=5, size=n_samples)
time_on_app = np.random.normal(loc=15, scale=5, size=n_samples)
time_on_website = np.random.normal(loc=20, scale=7, size=n_samples)
length_of_membership = np.random.normal(loc=3, scale=1, size=n_samples)
# 生成合成目標變數(輸入特徵的線性組合並加入噪音)
yearly_amount_spent = 100 + (avg_session_length * 10) + (time_on_app * 20) + (time_on_website * 15) + (length_of_membership * 30) + np.random.normal(loc=0, scale=50, size=n_samples)
# 將合成資料存入DataFrame
synthetic_data = pd.DataFrame({
'Avg. Session Length': avg_session_length,
'Time on App': time_on_app,
'Time on Website': time_on_website,
'Length of Membership': length_of_membership,
'Yearly Amount Spent': yearly_amount_spent
})
# 輸出合成資料的前幾行
print(synthetic_data.head())
內容解密:
np.random.normal(loc=mean, scale=std, size=n_samples):生成符合指定平均值和標準差的正態分佈隨機數,用於模擬不同的特徵。yearly_amount_spent的計算結合了輸入特徵並加入噪音,以模擬真實的目標變數。- 將生成的資料存入DataFrame中,便於後續分析和處理。
未來方向與討論
透過本章節的實驗,我們瞭解到在特定資料集上,不同迴歸模型的表現差異不大。未來研究可以進一步探索更複雜的模型或技術,例如整合學習或深度學習,以提升預測效能。同時,生成更具代表性的合成資料集,可以幫助我們更好地理解模型在不同場景下的表現。