1. 程式人生 > >Python statsmodel包訓練LR模型

Python statsmodel包訓練LR模型

Python中訓練LR模型一般使用sklearn包,輸出模型報告和其他機器學習方法一樣。但從統計背景出發,想看更詳細的報告,statsmodel包可以幫助實現。

1.訓練模型

import statsmodels.api as sm
from statsmodels.stats.outliers_influence import variance_inflation_factor

    #train樣本上訓練模型
    y = trainData[y_name]
    X = trainData[model_list]
    X['intercept'] = [1] * X.shape[0]
    
    LR = sm.Logit(y, X).fit()

2.模型報告

	#LR自帶的summary報告,直接輸出到excel不方便
    summary = LR.summary()

    #檢視VIF
    X_m = np.matrix(X)
    VIF_list = [variance_inflation_factor(X_m, i) for i in range(X_m.shape[1])]
    #varname_list = [X.columns[i] for i in range(len(VIF_list))]
    
    #計算標準化係數
    X_new = X.drop(['intercept'],axis = 1)
    X_new2 = X_new.apply(lambda x: (x - np.mean(x)) / np.std(x))
    LR_N = sm.Logit(trainData[y_name], X_new2).fit()

    #wald檢驗
    wald_test = LR.wald_test_terms().table

    #拼接report
    model_rpt1 = pd.concat([LR.params,LR.pvalues,wald_test['statistic'],LR_N.params],sort = False,axis = 1)
    model_rpt1.columns = ['params','pvals','wald','normal_params']
    model_rpt1['VIF'] = VIF_list
    model_rpt1.sort_values(['normal_params'],ascending = True,inplace = True)
    model_rpt1.fillna(0,inplace = True)
    
    #計算模型變數間的相關係數
    corr = X.drop(['intercept'],axis = 1).corr()
    corr2 = corr.reset_index()    

3.其他

1.statsmodel訓練模型過程不涉及篩選變數,所有送進去的模型變數都會參與擬合; 2.LR.predict(X_test) 可以給其他樣本打分,其結果是p,而根據係數得到的結果是log(p/1-p)。