Python scikitlearn的Logistic回归分析

Python scikitlearn的Logistic回归分析,python,scikit-learn,logistic-regression,Python,Scikit Learn,Logistic Regression,如何处理这样的图形: 使用scikitlearn的逻辑回归模型。有没有一种方法可以使用scikitlearn和标准的X,y输入轻松地处理这类问题,并将其映射到这样的图形?如果您真的想在这种特定设置中使用逻辑回归,一种很有希望的方法是将坐标从笛卡尔坐标系转换为极坐标系。从可视化的角度来看,在这个系统中,数据(几乎)是线性可分离的 这可以像这里描述的那样完成:正如其他人所说,逻辑回归不能很好地处理此类数据,因为它是一个线性分类器。您可以转换数据以使其线性可分离,或者选择另一个更适合此类数据的分类器

如何处理这样的图形:


使用scikitlearn的逻辑回归模型。有没有一种方法可以使用scikitlearn和标准的X,y输入轻松地处理这类问题,并将其映射到这样的图形?

如果您真的想在这种特定设置中使用逻辑回归,一种很有希望的方法是将坐标从笛卡尔坐标系转换为极坐标系。从可视化的角度来看,在这个系统中,数据(几乎)是线性可分离的


这可以像这里描述的那样完成:

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

在scikit学习文档中,各种分类器如何处理这个问题有一个很好的可视化:请参阅。第二行用于您的任务:


已经有了一些答案,但都没有提到数据的任何预处理。因此,我将展示两种看待问题的方法

首先,我将学习如何将数据转换到另一个空间

# 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()
输出

0.97

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

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()
输出

0.97

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

其他人提到的另一个选项是使用不同的模型。虽然有很多选项可供选择,但我只想展示一个使用
randomfrestClassifier
的示例。我只打算对一半的数据进行训练,这样我们就可以在无偏集上评估准确度。我以前只使用了CV,因为它快速简单

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

0.97
所以我们得到了很好的准确度!如果您有兴趣了解正在发生的事情,我们可以从
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)
输出

0.97

因此,这显示了使用随机森林模型划分为每个类的空间区域


解决同一问题的两种方法。我把确定哪一个是最好的留给读者作为练习…

LR只能处理原始形式的线性可分离类。我不认为这里提供的数据是线性可分离的。你不能使用逻辑来实现这一点,但你可以使用带有径向(圆形)核的支持向量机。里奇也可能有用。但我不确定“标准X,y输入”是否排除了这一点,您可以简单地向X添加高阶特征。假设您有X,y坐标,添加X^2,y^2,X^3,y^3。。。将允许一个更复杂的轮廓(更复杂的更高阶的条款,你添加)这是一个了不起的想法,我从来没有想过这样做很好的例子!两个答案都提到了预处理:“变换坐标”和“变换数据使其线性可分离”是预处理。谢谢!是的,我把很多术语混在一个答案里了。我应该更加一致,但不太确定哪一个术语是最好的。