【发布时间】: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