1.皮爾森相關系數

參考文檔:https://www.zhihu.com/question/20852004
2.方差膨脹因子
圖檔來源:http://sofasofa.io/forum_main_post.php?postid=1000484
R²稱為可決系數(Coefficient of determination)。
複相關系數Ri等于:(來源百度百科)
3.二者差別
皮爾森相關系數:
複相關系數R:
圖檔來源:https://zhuanlan.zhihu.com/p/37605060
皮爾森相關系數中的Y是一個單變量
而複相關系數R中的y^則是除了xi之外其餘x的拟合 y(也就是xi) 的值
在計算結果上:
圖檔來源:
https://www.cnblogs.com/wqbin/p/11109650.html
https://www.zhihu.com/question/270451437
總結:
方差膨脹因子多用于金融領域,判斷單變量和多變量的相關關系,進而通過逐漸回歸的方式,在特征盡可能少的情況下,得到最優模型。
皮爾森相關系數多用于機器學習領域,判斷單變量和單變量之間的關系,消除特征間相關性。
相關教材參考連接配接:點選跳轉1 | 點選跳轉2
附python代碼:
1.相關系數:
import pandas as pd
tt = pd.DataFrame({"A":[1,2,3,4,5,6,7],"B":[4,5,9,8,7,6,0],"C":[11,34,55,77,88,99,44],"D":[34,56,87,47,5,9,13]})
tt.head()
A B C D
0 1 4 11 34
1 2 5 34 56
2 3 9 55 87
3 4 8 77 47
4 5 7 88 5
pearson_value = tt.corr()
# pearson_value.to_csv("./data/pearson_value.csv")
pearson_value.head()
結果:
A B C D
A 1.000000 -0.309426 0.642899 -0.617804
B -0.309426 1.000000 0.463917 0.495642
C 0.642899 0.463917 1.000000 -0.363149
D -0.617804 0.495642 -0.363149 1.000000
其中tt為df,且必須全為數值型,并且不能有空值。
2.VIF計算
import numpy as np
import pandas as pd
from statsmodels.stats.outliers_influence import variance_inflation_factor
vif = pd.DataFrame()
vif["VIF Factor"] = [variance_inflation_factor(tt.values, i) for i in range(tt.shape[1])]
vif["features"] = tt.columns
vif.head()
結果:
VIF Factor features
0 29.076246 A
1 66.955265 B
2 96.312763 C
3 15.317779 D
3.利用方法删除相關性過高特征
代碼來源:點選跳轉
- pearson相關性:
利用相關系數删除相關性過高的變量(df中變量先得按IV值從大到小排序)
# cutoff 為(-1.1) 按順序删除相關性高于cutoff的特征
import numpy as np
import pandas as pd
def get_var_no_colinear(cutoff, df):
corr_high = df.corr().applymap(lambda x: np.nan if x>cutoff else x).isnull()
col_all = corr_high.columns.tolist()
del_col = []
i = 0
while i < len(col_all)-1:
ex_index = corr_high.iloc[:,i][i+1:].index[np.where(corr_high.iloc[:,i][i+1:])].tolist()
for var in ex_index:
col_all.remove(var)
corr_high = corr_high.loc[col_all, col_all]
i += 1
return col_all
get_var_no_colinear(0.5,tt)
#輸出為可用特征列
結果:
['A', 'B', 'D']
- VIF
一般VIF高于10的特征需要删除
import numpy as np
import pandas as pd
from statsmodels.stats.outliers_influence import variance_inflation_factor
## 每輪循環中計算各個變量的VIF,并删除VIF>threshold 的變量
def vif(x, thres=10.0):
X_m = np.matrix(x)
VIF_list = [variance_inflation_factor(X_m, i) for i in range(X_m.shape[1])]
maxvif=pd.DataFrame(VIF_list,index=x.columns,columns=["vif"])
col_save=list(maxvif[maxvif.vif<=float(thres)].index)
col_delete=list(maxvif[maxvif.vif>float(thres)].index)
print(maxvif)
print('删除特征:', col_delete)
return x[col_save]
vif(tt)
結果:
"删除特征: ['A', 'B', 'C', 'D']"
說明:全被删除,說明我們造的資料不好,/[哭笑不得]
def vif2(x, thres=10.0):
X_m = np.matrix(x)
VIF_list = [variance_inflation_factor(X_m, i) for i in range(X_m.shape[1])]
maxvif=pd.DataFrame(VIF_list,index=x.columns,columns=["VIF"])
# print(maxvif[:10])
col_save=list(maxvif[maxvif.VIF<=float(thres)].index)
col_delete=list(maxvif[maxvif.VIF>float(thres)].index)
# print(maxvif)
print('删除特征:', col_delete)
return maxvif
vif_feature = tttfeature[ss]
vif_data = vif2(vif_feature)
vif_data.sort_values(by='VIF', ascending=False, inplace=True)
vif_data.to_csv("./data/0521-step-3-vif_value.csv")
vif_data.head()
結果:
VIF
XXX數 3.871011
XXX息 3.509363
XXXXX 3.354639
XXXXXA 3.287080
XXXXXV 3.151003