scikitlearn中的Logistic回归

时间:2016-11-17 05:55:57

标签: python scikit-learn logistic-regression

如何处理这样的图表:enter image description here

使用scikitlearn的LogisticRegression模型。有没有办法使用scikitlearn和标准的X,y输入轻松处理这些问题,这些输入映射到这样的图形?

3 个答案:

答案 0 :(得分:2)

如果您真的想要对此特定设置使用Logistic回归,那么有希望的方法是将坐标从笛卡尔系统转换为Polar系统。从可视化看来,在该系统中,您的数据似乎(几乎)可以线性分离。

这可以按照此处所述完成:Python conversion between coordinates

答案 1 :(得分:1)

正如其他人所说,Logistic回归无法很好地处理这类数据,因为它是一个线性分类器。您可以转换数据以使其可线性分离,或选择另一种更适合此类数据的分类器。

在scikit-learn文档中,各种分类器如何处理此问题有一个很好的可视化:请参阅http://scikit-learn.org/stable/auto_examples/classification/plot_classifier_comparison.html。第二行是您的任务:

enter image description here

答案 2 :(得分:1)

已经有几个答案,但他们都没有提到任何数据预处理。因此,我将展示两种方式来查看您的问题。

首先,我将介绍一些将数据转换为另一个空间的多种学习方法

# Do some imports that I'll be using
from sklearn import datasets, manifold, linear_model
from sklearn import model_selection, ensemble, metrics
from matplotlib import pyplot as plt

%matplotlib inline

# Make some data that looks like yours
X, y = datasets.make_circles(n_samples=200, factor=.5,
                             noise=.05)

首先让我们来看看你当前的问题

plt.scatter(X[:, 0], X[:, 1], c=y)
clf = linear_model.LogisticRegression()
scores = model_selection.cross_val_score(clf, X, y)
print scores.mean()

<强>输出

Scatter plot of your data

0.440433749257

所以你可以看到这些数据看起来像你的,我们通过逻辑回归得到了一个糟糕的交叉验证精度。因此,如果您真的附加了逻辑回归,那么我们可以做的是使用某种流量学习将数据投影到不同的空间,例如:

Xd = manifold.LocallyLinearEmbedding().fit_transform(X)
plt.scatter(Xd[:, 0], Xd[:, 1], c=y)
clf = linear_model.LogisticRegression()
scores = model_selection.cross_val_score(clf, Xd, y)
print scores.mean()

<强>输出

enter image description here

1.0

因此,您可以看到,现在您的数据与LocallyLinearEmbedding完全线性可分离,我们可以获得更好的分类精度!

您可以使用的另一个选项,即其他人提到的另一个选项是使用不同的模型。虽然有很多选项可供选择,但我只是想用RandomForestClassifier来展示一个例子。我只会训练一半的数据,所以我们可以评估unbias集的准确性。我之前只使用过CV,因为它快速而简单!

clf = ensemble.RandomForestClassifier().fit(X[:100], y[:100])
print metrics.accuracy_score(y[100:], clf.predict(X[100:]))

<强>输出

0.97

所以我们得到了很好的准确性!如果您有兴趣了解发生了什么,我们可以从one of the awesome scikit-learn教程中提取一些代码。

plot_step = 0.02
x_min, x_max = X[:, 0].min() - .1, X[:, 0].max() + .1
y_min, y_max = X[:, 1].min() - .1, X[:, 1].max() + .1
xx, yy = np.meshgrid(np.arange(x_min, x_max, plot_step),
                     np.arange(y_min, y_max, plot_step))

Z = clf.predict(np.c_[xx.ravel(), yy.ravel()])
Z = Z.reshape(xx.shape)
cs = plt.contourf(xx, yy, Z, alpha=0.5)
plt.scatter(X[:, 0], X[:, 1], c=y)

<强>输出

Decision boundry of RF classifier

因此,这显示了使用随机森林模型将空间区域分类到每个类中。

解决同一问题的两种方法。我为读者留下了最好的锻炼方法......