前言
在機器學習項目里,目標變量 (Y) 的定義決定了你能解答什么問題,以及模型能給業務帶來什么價值。選擇不當不僅可能導致模型誤差大、偏差嚴重,還可能讓業務決策方向偏離。
本文分兩大場景:
- 供應鏈項目中的 銷量預測(回歸問題)
- 營銷項目中的 高潛力回購用戶預測(分類問題)
本篇將針對每個場景,給出多種 Y 的設定方案,是比較 通俗易懂的方案,每種方案的優缺點與適用情形;然后給出詳盡的 特征工程流程與技巧。
1 場景一:銷量預測回歸模型
1.1 多種 Y 的設定方案(目標變量)
以下是常見的不同定義方式:
方案編號 | Y 定義 | 數學表達 | 優點 | 風險 / 注意點 | 典型適用情境 |
---|---|---|---|---|---|
方案 A1:原始銷量 | 當期銷量數值 | Yt=Salest Y_t = Sales_t Yt?=Salest? | 易解釋;直接與庫存/補貨/生產規劃對應 | 分布可能有長尾,極端值/促銷衰退期/零銷量期噪聲大;誤差度量敏感 | 產品穩定、歷史銷量記錄豐富、促銷波動較小 |
方案 A2:對數變換后的銷量 | 用 log 或類似變換平滑銷量 | Yt=log?(Salest+c) Y_t = \log(Sales_t + c) Yt?=log(Salest?+c)(例如 (c = 1) 平滑零銷量) | 縮小長尾影響;使誤差分布近似正態;對比例誤差敏感性降低 | 反變換后解釋比較復雜;零或負銷量需處理;業務方可能不喜歡“對數銷量”這個概念 | 零銷量/低銷量很多,銷量跨度大(small SKUs + large SKUs 混在一起) |
方案 A3:環比/同比增長率 | 與上期/同期相比的變化 | Yt=SalestSalest?1?1 Y_t = \frac{Sales_t}{Sales_{t-1}} - 1 Yt?=Salest?1?Salest???1 或者 Yt=SalestSalest?P?1 Y_t = \frac{Sales_t}{Sales_{t - P}} - 1 Yt?=Salest?P?Salest???1(P 為周期,如 52 周、12 月) | 弱化趨勢與季節性影響;更關注變化/促銷/市場事件的影響 | 增長率極端值問題(基期小或為零);對業務解釋性下降;未來預測可能不穩定 | 如果你的業務關心“相對提升”多于“絕對銷量”,如促銷、預算評估、增長指標 |
方案 A4:差分銷量(絕對變化量) | 本期銷量減去上期銷量 | Yt=Salest?Salest?1 Y_t = Sales_t - Sales_{t-1} Yt?=Salest??Salest?1? | 強調絕對變化;可捕捉向上的“需求增量”或下滑;便于用差分方法處理非平穩性 | 噪聲大;上下波動可能互相抵消;趨勢 /季節性仍可能殘留;如果滯后太短可能誤導 | 快消品、促銷頻繁的品類;補貨周期短 |
方案 A5:未來窗口內銷量總和 | 預測未來 (k) 個時間單位(天/周/月)之和 | Yt=∑i=1kSalest+i Y_t = \sum_{i=1}^k Sales_{t+i} Yt?=i=1∑k?Salest+i? | 與業務補貨/生產周期一致;可適用于中短期計劃;減少每天的波動 | 窗口大小敏感;若窗口大,預測延遲;特征滯后要處理好;可能 data leakage 問題 | 補貨周期為月或數周的供應鏈;對于季節性商品或物流周期長的情況 |
1.2 特征工程教程
為不同 Y 定義準備特征,下面是一個詳細流程與技巧,包含公式和步驟:
1.2.1 步驟 1:數據準備 &清洗
- 收集歷史銷量數據 (Sales_t),包括產品/SKU/店鋪/區域維度
- 收集與銷量可能相關的輔助變量:價格、促銷活動、節假日、天氣、庫存水平、廣告投放 etc.
- 處理缺失值與零銷量:如果大量零銷量,可能需要平滑(如對數變換 + 常數),或考慮零銷量與非零銷量分開建模
1.2.2 步驟 2:時間序列特征
為捕捉過去銷量對未來的影響,常用以下特征:
-
滯后銷量:
Xlag(k)=Salest?k X_{lag(k)} = Sales_{t-k} Xlag(k)?=Salest?k?
可以取多個滯后值 ( k=1,2,3,\dots )
-
滾動統計(滑動窗口):
Xma(k)=1k∑i=1kSalest?i X_{ma(k)} = \frac{1}{k} \sum_{i=1}^k Sales_{t-i} Xma(k)?=k1?i=1∑k?Salest?i?
-
滾動最大/最小/標準差:
Xstd(k)=1k∑i=1k(Salest?i?Xma(k))2 X_{std(k)} = \sqrt{\frac{1}{k} \sum_{i=1}^k (Sales_{t-i} - X_{ma(k)})^2} Xstd(k)?=k1?i=1∑k?(Salest?i??Xma(k)?)2?
-
周期性 / 日期特征:
-
日、周、月指標
-
周幾 / 月份 /季度 one-hot 編碼
-
年/季節周期正余弦編碼(sine / cosine):
Xsin=sin?(2π?dayOfYear365),Xcos=cos?(2π?dayOfYear365) X_{sin} = \sin\left(\frac{2\pi \cdot dayOfYear}{365}\right), \quad X_{cos} = \cos\left(\frac{2\pi \cdot dayOfYear}{365}\right) Xsin?=sin(3652π?dayOfYear?),Xcos?=cos(3652π?dayOfYear?)
-
1.2.3 步驟 3:促銷、價格與市場活動特征
-
折扣率/促銷強度:
DiscountRatet=Priceoriginal,t?Pricediscounted,tPriceoriginal,t DiscountRate_t = \frac{Price_{\text{original}, t} - Price_{\text{discounted}, t}}{Price_{\text{original}, t}} DiscountRatet?=Priceoriginal,t?Priceoriginal,t??Pricediscounted,t??
-
是否有促銷事件:
Binary 特征 ( Promo_t = 1 ) if 有活動 else 0
-
廣告投入 /市場預算 /競爭者活動等
1.2.4 步驟 4:外部變量
- 天氣(溫度、降水、節氣 etc.)
- 節假日/公共假期前后影響
- 宏觀經濟指標(若適用,如零售業可能關心消費者購買力、人口變動 etc.)
1.2.5 步驟 5:處理趨勢與平穩性
-
若銷量序列整體趨勢明顯,可用差分(如一階差分):
ΔSalest=Salest?Salest?1 \Delta Sales_t = Sales_t - Sales_{t-1} ΔSalest?=Salest??Salest?1?
-
或者進行去趨勢 + 季節性分解 (seasonal decomposition)
1.2.6 步驟 6:劃分訓練 /驗證與防止數據泄露
- 用時間切片(time-based split):訓練集的時間晚于驗證集要早,未來窗口不能被提前泄露
- 若用未來窗口預測 ∑i=1kSalest+i\sum_{i=1}^k Sales_{t+i}∑i=1k?Salest+i?,要確保特征都是在時間 ( t ) 或之前的,不含未來信息
1.2.7 步驟 7:模型指標與評估
- 常用指標:MAE(平均絕對誤差)、RMSE、MAPE(平均絕對百分比誤差)
- 如果對大額/高銷量 SKU 更在乎,可以加權評估(按銷量權重或按利潤權重)
- 做殘差分析,檢查季節或促銷期預測誤差是否系統性偏高或低
2 場景二:營銷中高潛力回購用戶分類模型
2.1 多種 Y=1 定義方案(“會回購”的客戶)
下面是常見的不同方式來定義 “回購”/“高潛力回購用戶”:
方案編號 | Y = 1 的定義 | 優點 | 風險 / 注意點 | |
---|---|---|---|---|
方案 B1:未來窗口內至少一次回購 | 客戶在基準時間 (T_0) 之后的未來窗口大小為 (W)(如 3 個月/6 個月)內有一次或以上購買 | 定義明確;多數客戶樣本可獲取;易于計算與解釋 | 窗口選得太短可能漏掉潛在的慢購物客;太長可能標簽延遲;樣本不平衡;業務方可能要求頻次或金額更高的“回購” | |
方案 B2:回購頻次閾值 | 在 (W) 窗口內購買次數 ≥ (K)(例如 ≥ 2 次/3 次等) | 能區分更忠誠/高頻客戶;營銷資源更值得投入在這些客戶上 | 如果 K 閾值太高客戶少;頻次受產品類別/客單價影響;可能忽略高價值但少次購買者 | |
方案 B3:回購金額閾值 | 在未來窗口內總消費金額 ≥ 閾值 (M) | 聚焦高價值用戶;對營收貢獻重;能和銷售/利潤目標對齊 | 金額閾值敏感;受品類價格變動的影響;少次但金額高 vs 多次但金額低可能被偏向;業務方可能難設置合理閾值 | |
方案 B4:回購速度/間隔限制 | 在未來窗口內有回購,且首次到回購間隔 ≤ 某閾值 (D)(例如 ≤ 30 天/90 天等) | 更能捕捉“活躍度高的潛力客戶”;早期反應快的用戶;有利于短期營銷策略 | 若客戶自然購買周期長的產品,可能誤判;間隔的閾值需要業務與數據雙重調優;可能忽略穩定但周期長的復購用戶 | |
方案 B5:組合定義 | 比如頻次 + 金額 + 時間間隔綜合規則 | 更精細區分;高潛力用戶定義更符合業務標準;營銷投入回報率可能更高 | 定義復雜,標簽樣本可能很少;解釋與溝通成本高;可能會忽略某些邊緣客戶;需要進行閾值調優與驗證 |
2.2. 特征工程流程
2.2.1 步驟 1:樣本集定義 &標簽生成
- 確定基準時間 (T_0)(cut-off date),所有 “潛在客戶” 的歷史行為均在≤T0\le T_0≤T0?時間內
- 確定未來窗口大小 ( W ) 用于標簽定義
- 根據所選方案(B1~B5),為每個客戶在訓練集中生成標簽 Y∈{0,1}Y \in \{0,1\}Y∈{0,1}
2.2.2 步驟 2:客戶歷史行為特征(基于 ( \le T_0 ) 時間段)
-
RFM 特征:
-
Recency: 最近一次購買到 (T_0) 的時間間隔
Ri=T0?tlast?purchase?by?customer?i R_i = T_0 - t_{\text{last purchase by customer i}} Ri?=T0??tlast?purchase?by?customer?i? -
Frequency: 在歷史期內購買次數
Fi=Norders?by?i?in?history F_i = N_{\text{orders by i in history}} Fi?=Norders?by?i?in?history? -
Monetary: 歷史期總消費金額
Mi=∑orders≤T0Amount M_i = \sum_{orders \le T_0} Amount Mi?=orders≤T0?∑?Amount
-
-
購買間隔特征:
-
平均購買間隔(如果有多次購買)
Δtˉi=1Fi?1∑j=2Fi(tj?tj?1)if?Fi≥2 \bar{\Delta t}_i = \frac{1}{F_i - 1} \sum_{j=2}^{F_i} (t_j - t_{j-1}) \quad \text{if } F_i \ge 2 Δtˉi?=Fi??11?j=2∑Fi??(tj??tj?1?)if?Fi?≥2 -
最后兩次購買間隔
-
-
品類/產品偏好特征:
- 買過哪些產品/品類的分布:one‐hot 或 count
- 客單價分布:平均/中位數/最大/最小
-
行為特征(若有行為數據):
- 瀏覽量、加購未付、促銷點擊率/優惠券領取情況
- 市場活動/郵件/Push 響應情況
-
時間/周期特征:
- 過去購買的時間分布:是否偏向某些月/節假日/周末
- 客戶注冊時間/首購時間:新客戶 vs 老客戶
2.2.3 步驟 3:特征處理與標準化
- 對數變換:對于如消費金額這類正偏分布的特征可做 log 轉換
- 縮放(standardization / min-max)
- 類別變量編碼:one-hot 或 target encoding
2.2.4 步驟 4:訓練 /驗證劃分與防止泄露
- 用時間切片 split:訓練集含所有 ( \le T_0 ) 的行為與特征,標簽由 (T0,T0+W](T_0, T_0 + W](T0?,T0?+W]決定
- 若客戶在≤T0\le T_0≤T0? 時間購買行為中使用未來標簽窗口的信息,要避免
2.2.5 步驟 5:模型評價指標
- 二分類常用指標:ROC‐AUC,Precision, Recall, F1‐score
- 針對業務,也看 Precision@K、Lift(提升率)準則:你可能只對 top-10% 的潛力客戶做營銷投入
- 可區分不同閾值設定下的召回 vs 精確度 Trade-off
2.3 模擬未來一個月消費者回購概率模型
2.3.1 Y變量設計
- 預測目標:預測未來一個月(9月 → 10月)是否回購。
- Y = 1:用戶在預測窗口內至少一次購買。
- Y = 0:用戶在預測窗口內無購買。
- 正樣本選擇:所有在預測窗口內有回購的用戶。
示例:
用戶ID | 訓練窗口內交易 | 預測窗口內交易 | Y |
---|---|---|---|
A | 1次 | 2次 | 1 |
B | 3次 | 0次 | 0 |
2.3.2 滾動切片設計
切片編號 | 訓練時間窗口 | 預測時間窗口 |
---|---|---|
1 | 2025-07-01~07-31 | 2025-08-01~08-31 |
2 | 2025-07-08~08-07 | 2025-08-08~09-07 |
3 | 2025-07-15~08-14 | 2025-08-15~09-14 |
說明:每次訓練用過去30天數據預測未來30天回購,步長可設為7天或其他。
2.3.3 滾動切片模擬代碼
import pandas as pd
import numpy as np# 模擬用戶每日交易數據
dates = pd.date_range("2025-06-01", "2025-09-30")
users = range(1, 101)
data = pd.DataFrame([(u, d) for u in users for d in dates], columns=['user_id', 'date'])
np.random.seed(42)
data['purchase'] = np.random.binomial(1, 0.05, len(data)) # 5%概率購買# 滾動切片參數
train_window = 30
predict_window = 30
step = 7slices = []
start_date = data['date'].min()
end_date = data['date'].max()while start_date + pd.Timedelta(days=train_window+predict_window-1) <= end_date:slices.append({'train_start': start_date,'train_end': start_date + pd.Timedelta(days=train_window-1),'pred_start': start_date + pd.Timedelta(days=train_window),'pred_end': start_date + pd.Timedelta(days=train_window+predict_window-1)})start_date += pd.Timedelta(days=step)pd.DataFrame(slices).head(3)
2.3.4 交叉驗證方法
-
時間序列交叉驗證(TimeSeriesSplit):
- 保持時間順序,訓練集總是早于驗證集
- sklearn示例:
from sklearn.model_selection import TimeSeriesSplittscv = TimeSeriesSplit(n_splits=3)
for train_index, test_index in tscv.split(data):print("TRAIN:", train_index, "TEST:", test_index)
2.3.5 特征泄露風險與案例
-
易泄露特征:
- 未來購買金額、未來交易次數
- 未來優惠券使用情況
-
案例:
- 用“未來30天消費金額總和”作為訓練特征 → 模型預測幾乎完美,但不可落地
- 用“優惠券領取后是否使用”預測回購,如果領取在預測窗口內 → 泄露未來信息
4 對比 &實戰建議
在實際項目中,要根據你的業務與數據情況來選擇哪一種 Y 定義方案:
- 如果你在供應鏈里關心 絕對銷量 與庫存/生產計劃,則方案 A1 或 A5 較好
- 如果銷量分布長尾、促銷/季節性強,則 A2 或 A3 更穩健
- 在回購預測中,如果營銷預算有限且希望集中資源,則 B2/B3/B4(頻次/金額/速度)更合適
- 若目標是寬泛識別潛在客戶,則 B1 簡單且覆蓋面廣
5 公式匯總
為了便于快速應用以下是常見公式:
-
滯后特征:
Xlag(k)=Salest?k X_{lag(k)} = Sales_{t-k} Xlag(k)?=Salest?k? -
滾動平均:
Xma(k)=1k∑i=1kSalest?i X_{ma(k)} = \frac{1}{k} \sum_{i=1}^k Sales_{t-i} Xma(k)?=k1?i=1∑k?Salest?i? -
差分銷量:
ΔSalest=Salest?Salest?1 \Delta Sales_t = Sales_t - Sales_{t-1} ΔSalest?=Salest??Salest?1? -
對數變換銷量:
Yt=log?(Salest+c) Y_t = \log(Sales_t + c) Yt?=log(Salest?+c) -
回購頻次閾值標簽:
Y(2)=1?????Npurchases?in?(T0,T0+W]≥K Y^{(2)} = 1 \iff N_{\text{purchases in }(T_0, T_0+W]} \ge K Y(2)=1?Npurchases?in?(T0?,T0?+W]?≥K -
回購金額閾值標簽:
Y(3)=1?????∑orders∈(T0,T0+W]Amount≥M Y^{(3)} = 1 \iff \sum_{orders \in (T_0, T_0 + W]} Amount \ge M Y(3)=1?orders∈(T0?,T0?+W]∑?Amount≥M -
回購速度標簽:
Y(4)=1?????(exists?purchase?in?(T0,T0+W])∧(Δtfirst?repeat≤D) Y^{(4)} = 1 \iff (\text{exists purchase in } (T_0, T_0 + W] ) \land (\Delta t_{\text{first repeat}} \le D) Y(4)=1?(exists?purchase?in?(T0?,T0?+W])∧(Δtfirst?repeat?≤D)
五、結語
定義 Y 看起來是一個基礎問題,但它實際上蘊含多重業務假設。一個好的 Y 不僅能讓模型訓練與調參更穩定、預測誤差更低,也能確保預測結果被業務方理解、接納、用于決策。