简单示例中的不良逻辑回归 [scikit-learn]

Posted

技术标签:

【中文标题】简单示例中的不良逻辑回归 [scikit-learn]【英文标题】:Bad logistic regression in trivial example [scikit-learn] 【发布时间】:2019-03-22 08:57:33 【问题描述】:

我正在尝试使用sklearn.linear_model.LogisticRegression 运行一个简单的逻辑回归示例

代码如下:

import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
import seaborn as sns
from sklearn.linear_model import LogisticRegression
from sklearn import metrics

# some randomly generated data with two well differentiated groups 
x1 = np.random.normal(loc=15, scale=2, size=(30,1))
y1 = np.random.normal(loc=10, scale=2, size=(30,1))
x2 = np.random.normal(loc=25, scale=2, size=(30,1))
y2 = np.random.normal(loc=20, scale=2, size=(30,1))

data1 = np.concatenate([x1, y1, np.zeros(shape=(30,1))], axis=1)
data2 = np.concatenate([x2, y2, np.ones(shape=(30,1))], axis=1)

dfa = pd.DataFrame(data=data1, columns=["F1", "F2", "group"])
dfb = pd.DataFrame(data=data2, columns=["F1", "F2", "group"])

df = pd.concat([dfa, dfb], ignore_index=True)

# the actual fitting
features = [item for item in df.columns if item not in ("group")]
logreg = LogisticRegression(verbose=1)
logreg.fit(df[features], df.group)

# plotting and checking the result

theta = logreg.coef_[0,:] # parameters
y0 = logreg.intercept_    # intercept

print("Theta =", theta)
print("Intercept = ", y0)

xdb = np.arange(0, 30, 0.2)  # dummy x vector for decision boundary
ydb = -(y0+theta[0]*xdb) / theta[1] # decision boundary y values

fig = plt.figure()
ax = fig.add_subplot(111)
colors = 0 : "red", 1 : "blue"
for i, group in df.groupby("group"):
    plt.plot(group["F1"], group["F2"],
             MarkerFaceColor = colors[i], Marker = "o", LineStyle="",
             MarkerEdgeColor=colors[i])
plt.plot(xdb, ydb, LineStyle="--", Color="b")

令人震惊的结果是这样的:

而且,其实准确率是可以计算出来的:

predictions = logreg.predict(df[features])
metrics.accuracy_score(predictions, df["group"])

产生 0.966...

我一定做错了什么,只是不知道是什么。非常感谢任何帮助!

【问题讨论】:

想要的输出是什么?您是否有机会将逻辑回归与线性回归混为一谈?前者是一个分类模型,而不是回归模型,尽管它的名字。 plotting decision boundary of logistic regression的可能重复 准确率只是总数中的真阳性数,因此在这种情况下可能是正确的。您所附图片中的决策边界仅显示错误分类的两个点,因此分类算法似乎很合适。 我可能在这里误解了一些基本的东西,但我所期望的是一条直线,负斜率并在 x=30 附近穿过 x 轴,在 y=30 附近穿过 y 轴。这样的线完美地将数据分成两个标记组,这就是为什么我认为问题是 trivial 【参考方案1】:

这是由于正则化。线的最佳值是截距值在 -16 左右,但由于正则化,它无法达到该水平。

逻辑回归最小化由误差和权重值组合而成的损失函数。在这种情况下,当我们增加 C 模型的值时,将更多地关注减少错误(从而找到更好的决策边界)而不是权重。产生正确的决策边界。

尽管正则化在大多数现实世界场景中都非常重要。在某些情况下,重要的是不要使用一个。

进行以下更改

logreg = LogisticRegression(verbose=1, C=100)

输出如下

阅读更多关于正则化的信息以更好地理解这一点

【讨论】:

请解释正则化如何影响这一点。不只是正则化,如果我更改其他参数,如 penalty='l1'solver='lbfgs' 等,我也可以获得相同的结果。 机器学习不是关于参数的跟踪和错误。当我们增加 C 的值时,找到正确决策边界的重要性就会增加,并且会给出更小的重要性权重值。因此,在这种情况下,我们得到了更好的决策边界。 这就是我要补充的答案。 感谢您的建议;编辑了答案。除非答案不正确,否则请不要对答案投反对票。 感谢@KevalDave!我花了一段时间才意识到增加 C 实际上意味着减少对参数的惩罚。正如@VivekKumar 所提到的,改变惩罚或求解器也给出了正确的决策边界,我目前还不太明白。无论如何,我将此标记为正确答案!

以上是关于简单示例中的不良逻辑回归 [scikit-learn]的主要内容,如果未能解决你的问题,请参考以下文章

python逻辑回归(初级)

修改逻辑回归中的因子名称

数据挖掘系列 啥是逻辑回归训练模型?

(非常)使用逻辑回归的简单量子交易模型

机器学习的简单逻辑回归的Advanced Optimization

逻辑回归 vs 朴素贝叶斯