Python statsmodel包訓練LR模型
阿新 • • 發佈:2018-12-12
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)。