天天看點

皮爾森相關系數與方差膨脹因子介紹及關系 附python代碼附python代碼:

1.皮爾森相關系數

皮爾森相關系數與方差膨脹因子介紹及關系 附python代碼附python代碼:

參考文檔:https://www.zhihu.com/question/20852004

2.方差膨脹因子

皮爾森相關系數與方差膨脹因子介紹及關系 附python代碼附python代碼:

圖檔來源:http://sofasofa.io/forum_main_post.php?postid=1000484

R²稱為可決系數(Coefficient of determination)。

皮爾森相關系數與方差膨脹因子介紹及關系 附python代碼附python代碼:

複相關系數Ri等于:(來源百度百科)

皮爾森相關系數與方差膨脹因子介紹及關系 附python代碼附python代碼:

3.二者差別

皮爾森相關系數:

皮爾森相關系數與方差膨脹因子介紹及關系 附python代碼附python代碼:

複相關系數R:

皮爾森相關系數與方差膨脹因子介紹及關系 附python代碼附python代碼:

圖檔來源:https://zhuanlan.zhihu.com/p/37605060

皮爾森相關系數中的Y是一個單變量

而複相關系數R中的y^則是除了xi之外其餘x的拟合 y(也就是xi) 的值

在計算結果上:

皮爾森相關系數與方差膨脹因子介紹及關系 附python代碼附python代碼:

圖檔來源:

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