【问题标题】:Python Scikit-Learn improve Logistic Regression model vs Statsmodels significant variablesPython Scikit-Learn 改进逻辑回归模型与 Statsmodels 显着变量
【发布时间】:2022-08-17 21:52:00
【问题描述】:

我正在研究二进制分类预测并使用逻辑回归。 我知道使用 Stats 模型,可以通过 p 值了解重要变量并删除不重要的变量以获得更高性能的模型。

import statsmodels.api as sm
# Add a constant to get an intercept
X_train_std_sm = sm.add_constant(X_train_std)
# Fit the model
log_reg = sm.Logit(y_train, X_train_std_sm).fit()
# show results
log_reg.summary()

Logit Regression Results Dep. Variable:     y   No. Observations:   1050
Model:  Logit                           Df Residuals:   1043
Method:     MLE                         Df Model:   6
Date:   Wed, 17 Aug 2022                Pseudo R-squ.:  0.9562
Time:   13:26:12                        Log-Likelihood:     -29.285
converged:  True                        LL-Null:    -668.34
Covariance Type:    nonrobust           LLR p-value:    5.935e-273
        coef        std err     z   P>|z|   [0.025  0.975]
const   1.9836      0.422   4.699   0.000   1.156   2.811
x1      0.1071      0.414   0.259   0.796   -0.704  0.918
x2      -0.4270     0.395   -1.082  0.279   -1.200  0.346
x3      -0.7979     0.496   -1.610  0.107   -1.769  0.173
x4      -3.5670     0.702   -5.085  0.000   -4.942  -2.192
x5      -2.1548     0.608   -3.542  0.000   -3.347  -0.962
x6      5.4692      0.929   5.885   0.000   3.648   7.291

在这种使用 Statsmodel 的情况下,我应该删除 6 个变量中的 3 个,只保留重要的变量,然后重新加载模型。

是否可以对 sklearn 做同样的事情?如果 p 值 >5% ,如何知道要删除的变量?如何使用 Sklearn 提高逻辑回归模型的性能?我是否需要实现 Statsmodel 然后使用正确的变量来使用 Sklearn 的模型?

这是我的代码:

from sklearn.model_selection import train_test_split
from sklearn import preprocessing
from sklearn.linear_model import LogisticRegression
from sklearn import metrics

#transform data
y = df.is_genuine.values
X = df[df.columns[1:]].values
X_name = df[df.columns[1:]].columns

# split data
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.3, random_state=42, stratify=y)

#standardize data
std_scale = preprocessing.StandardScaler().fit(X_train)
# transform X data to fit the Scaler
X_train_std = std_scale.transform(X_train)
X_test_std = std_scale.transform(X_test)

#logistic regression
reg_log = LogisticRegression(penalty=\'none\', solver=\'newton-cg\')
reg_log.fit(X_train_std, y_train)

#model training performance
reg_log.score(X_train_std, y_train)
>>> 0.9914285714285714

#model prediction
y_pred = reg_log.predict(X_test_std)

#test the model
pred = pd.DataFrame(X_test_std, columns=X_name)
pred[\'is_genuine\'] =  y_test
pred[\'pred_reglog\'] =  y_pred
pred[\'is_genuine_reglog\'] = pred[\'pred_reglog\'].apply(lambda x: True if x >0 else False)

# model evaluation
print (metrics.accuracy_score(y_test, y_pred))
>>> 0.9888888888888889
  • 据我所知(如果我错了,请纠正我),p-value 它没有在 Scikit-learn 中实现。所以你必须使用 StatsModel。

标签: python machine-learning scikit-learn classification logistic-regression


【解决方案1】:

简短的回答:只需使用 statsmodels。

This question 在答案部分有几个此功能的 sklearn 实现。 您还可以求助于像 sklearn.feature_selection.f_regression()sklearn.feature_selection.chi2() 这样的单变量测试,而不是使用实际模型的值。

【讨论】:

  • 好吧,所以在不寻找意义的情况下使用 Sklearn 也是正确的吗?我之前不需要进行任何测试,我可以毫无疑问地使用 SKlearn 结果?
猜你喜欢
  • 2018-10-29
  • 1970-01-01
  • 2013-09-30
  • 2016-06-17
  • 2017-12-31
  • 2018-01-14
  • 2016-02-21
  • 2017-03-31
  • 2020-09-12
相关资源
最近更新 更多