數據預處理:解決運營數據的共線性問題

 所謂共線性(又稱多重共線性)問題指的是輸入的自變量之間存在較高的先行相關度。共線性問題會導致迴歸模型的文檔行和準確性大大降低,另外,過多無關的維度參與計算也會浪費計算資源和時間。

 共線性問題是否常見取決於具體業務場景,常見的具有明顯的共線性的維度或變量包括如下:

  • 訪問量和頁面瀏覽量
  • 頁面瀏覽量和訪問時間
  • 訂單量和銷售額
  • 訂單量和轉化率

導致出現變量間共線性的原因可能包括:

  1. 數據樣本不夠,導致共線性存在偶然性,這其實反映了缺少數據對於數據建模的影響,共線性僅僅是影響的一部分。
  2. 多個變量都基於時間有共同或相反的演變趨勢,例如春節期間的網絡銷售量和銷售額都相對於正常時間有下降趨勢。
  3. 多個變量間存在一定的推移關係,但總體上變量間的趨勢一致,只是發生的時間點不一致,例如品牌廣告費用和銷售額之間,通常是品牌廣告先進行大範圍的曝光和信息推送,經過一定時間傳播後,銷售額才能爆發出來。
  4. 多個變量間存在近似線性相關的關係。例如,如果用y代表訪客數,用x代表展示廣告費用,那麼二者的關係很可能是y=2*x+b,即每投放1塊錢,可以帶來大概2~3個房客。

1. 如何檢驗共線性

 共線性一般通過容忍度,方差膨脹因子,特徵值這幾個特徵數據來判斷。

  • 容忍度(Tolerance):容忍度是每個自變量作爲因變量對其他自變量進行迴歸建模時得到的殘差比例,大小用1減得到的決定係數來表示。容忍度的值介於0.1和1之間,如果值越小,說明這個自變量與其他自變量間越可能存在共線性問題
  • 方差膨脹因子(Variance Inflation Factor, VIF):VIF是容忍度的倒數,值越大則共線性問題越明顯,通常以10作爲判斷邊界。當VIF<10,不存在多重共線性;當10<=VIF<100,存在較強的多重共線性;當VIF>=100,存在嚴重多重共線性
  • 特徵值(Eigenvalue):該方法實際上就是對自變量進行主成分分析,如果多個維度的特徵值等於0,則肯能有比較嚴重的共線性。

除此之外,還可以使用相關係數輔助判斷,當相關係數R>0.8時就表示可能存在較強的相關性。

2. 解決共線性的5種常用方法

解決共線性的5種常用方法如下:

  1. 增大樣本量:通過增加樣本量,來消除由於數據量補足而出現的偶然共線性現象,在可行的前提下,這種方法是需要考慮的;但即使增加了樣本量,也可能無法解決共線性問題,原因是很可能變量間確實存在這個問題。

  2. 嶺迴歸法(Ridge Regression):嶺迴歸分析是一種專用於共線性問題的有偏估計迴歸方法,實質上是一種改良的最小二乘估計法。它通過放棄最小二乘法的無偏性,以損失部分信息,降低精度爲代價來獲得更實際和可靠性更強的迴歸係數。因此嶺迴歸在存在較強共線性的迴歸應用中較爲常用。

  3. 逐步迴歸法(Stepwise Regression):逐步迴歸法是 每次引入一個自變量並進行統計檢驗,然後逐步引入其他變量,同時對所有變量的迴歸係數進行檢驗。如果原來引入的變量由於後面變量的引入而變得不再顯著,那麼就將其剔除,逐步得到最優迴歸方程。

  4. 主成分迴歸(Principal Components Regression):通過主成分分析,將原始參與建模的變量轉換爲少數幾個主成分,每個主成分是原變量的共線性組合,然後基於主成分做迴歸分析,這樣也可以在不丟失重要數據特徵的前提下避開共線性問題。

  5. 人工去重:直接結合人工經驗,對參與迴歸模型計算的自變量進行刪減,也是一個較爲常用的方法,但這種方法需要操作者對於業務,模型和數據都有相對深入的立即。

3. Python處理共線性問題

import numpy as np
from sklearn.linear_model import Ridge

import pandas as pd

#讀取數據
# data = np.loadtxt('/Users/nxcjh/learn/python-yunying/python_book/chapter3/data5.txt', delimiter='\t')
data = pd.read_table('/Users/nxcjh/learn/python-yunying/python_book/chapter3/data5.txt', delimiter='\t')
x = data.iloc[:, :-1] # 切分變量
y = data.iloc[:, -1] # 切分預測變量
# 使用嶺迴歸算法進行迴歸分析
model_ridge = Ridge(alpha=1.0) # 建立嶺迴歸模型對象
model_ridge.fit(x, y) # 輸入x/y訓練模型
print("輸出自變量的係數:")
print(model_ridge.coef_) # 打印輸出自變量的係數
print("輸出截距:")
print(model_ridge.intercept_) # 打印輸出截距


輸出自變量的係數:
[ 8.49478788e+01 -1.06717591e-03  9.71111938e-04 -9.75225980e-04
  2.12686655e-05  2.22421692e-04 -3.02339279e-06 -8.85519635e-06
  5.47707940e-07]
輸出截距:
-7436.9872186787

使用主成分迴歸進行迴歸分析

from sklearn.decomposition import PCA
from sklearn.linear_model import LinearRegression


model_pca = PCA() # 建立PCA模型對象
data_pca = model_pca.fit_transform(x) # 將x進行主成分分析
ratio_cumsm = np.cumsum(model_pca.explained_variance_ratio_) # 得到所有主成分方差佔比的累積數據
print("所有主成分方差佔比的累積數據:")
print(ratio_cumsm)

rule_index = np.where(ratio_cumsm > 0.8) # 獲取方差佔比超過0.8 的所有索引值
min_index = rule_index[0][0] # 獲取方差最小索引值
data_pca_result = data_pca[:, :min_index + 1] # 根據最小索引值提取主成分
model_liner = LinearRegression() # 建立迴歸模型對象
model_liner.fit(data_pca_result, y) # 輸入主成分數據和預測變量y 並訓練模型
print("輸出自變量的係數:")
print(model_liner.coef_) # 打印輸出自變量的係數
print("輸出截距:")
print(model_liner.intercept_) # 打印輸出截距
所有主成分方差佔比的累積數據:
[0.90407972 0.98566955 0.99957336 0.99995927 0.99999562 0.99999939
 0.99999999 1.         1.        ]
輸出自變量的係數:
[1.24317745e-05]
輸出截距:
1058.7735735735737
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章