【发布时间】: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...
我一定做错了什么,只是不知道是什么。非常感谢任何帮助!
【问题讨论】:
-
想要的输出是什么?您是否有机会将逻辑回归与线性回归混为一谈?前者是一个分类模型,而不是回归模型,尽管它的名字。
-
准确率只是总数中的真阳性数,因此在这种情况下可能是正确的。您所附图片中的决策边界仅显示错误分类的两个点,因此分类算法似乎很合适。
-
我可能在这里误解了一些基本的东西,但我所期望的是一条直线,负斜率并在 x=30 附近穿过 x 轴,在 y=30 附近穿过 y 轴。这样的线完美地将数据分成两个标记组,这就是为什么我认为问题是 trivial
标签: python scikit-learn