我同时使用了Scikit-Learn和Seaborn逻辑回归函数-前者用于提取模型信息(即对数奇数,参数等),而后者用于绘制所得的S形曲线以拟合概率估计
也许我的直觉对于解释这种情节是不正确的,但是我似乎并没有得到我期望的结果:
#Build and visualize a simple logistic regression
ap_X = ap[['TOEFL Score']].values
ap_y = ap['Chance of Admit'].values
ap_lr = LogisticRegression()
ap_lr.fit(ap_X, ap_y)
def ap_log_regplot(ap_X, ap_y):
plt.figure(figsize=(15,10))
sns.regplot(ap_X, ap_y, logistic=True, color='green')
return None
ap_log_regplot(ap_X, ap_y)
plt.xlabel('TOEFL Score')
plt.ylabel('Probability')
plt.title('Logistic Regression: Probability of High Chance by TOEFL Score')
plt.show
看起来不错,但随后我尝试使用Scikit-Learn中的predict_proba
函数,以给定Chance to Admit
的任意值来查找TOEFL Score
的概率(在本例中为108、104和112):
eight = ap_lr.predict_proba(108)[:, 1]
four = ap_lr.predict_proba(104)[:, 1]
twelve = ap_lr.predict_proba(112)[:, 1]
print(eight, four, twelve)
我在哪里:
[0.49939019] [0.44665597] [0.55213799]
对我来说,这似乎表明TOEFL得分为112,根据该数据集,个人被录取的机会为55%。如果我将一条垂直线从x轴上的112延伸到S形曲线,我希望交点在.90附近。
我正确解释/建模吗?我意识到我正在使用两个不同的程序包来计算模型系数,但是对于另一个使用不同数据集的模型,我似乎可以得到符合逻辑曲线的正确预测。
任何想法还是我会完全不正确地建模/解释这个问题?
答案 0 :(得分:0)
from sklearn.linear_model import LogisticRegression
from sklearn import metrics
x_train, x_test, y_train, y_test = train_test_split(x, y, test_size=0.4, random_state=4)
print(x_train.shape)
print(x_test.shape)
print(y_train.shape)
print(y_test.shape)
logreg = LogisticRegression()
logreg.fit(x_train, y_train)
y_pred = logreg.predict(x_test)
print('log: ', metrics.accuracy_score(y_test, y_pred))
您可以轻松地找到这样的模型精度,并确定可以用于应用程序数据的模型。
答案 1 :(得分:0)
经过一番搜索,“交叉验证”为我的问题提供了正确的答案。尽管它已经存在于Cross-Validated中,但我也想在Stack Overflow上提供此答案。
简单地说,Scikit-Learn自动向逻辑模型添加正则化罚分,以缩小系数。 Statsmodels不会添加此罚款。显然无法关闭此功能,因此必须将C=
实例化中的LogisticRegression
参数设置为某个任意高的值,例如C=1e9
。
尝试此方法并将Scikit-Learn predict_proba()
与regplot
(使用statsmodels进行计算)生成的S形图进行比较之后,概率估计会对齐。
链接到完整的帖子:https://stats.stackexchange.com/questions/203740/logistic-regression-scikit-learn-vs-statsmodels