【问题标题】:Logistic Regression in scikitlearnscikit learn中的逻辑回归
【发布时间】:2017-03-31 13:36:07
【问题描述】:

你如何处理这样的图表:

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

【问题讨论】:

  • LR 只能处理原始形式的线性可分离类。
  • 我不认为这里提供的数据是线性可分的
  • 您不能为此使用逻辑,但是您可以使用带有径向(圆形)内核的 SVM。 scikit-learn.org/stable/modules/svm.html
  • Ridge 也可能有用。 scikit-learn.org/stable/auto_examples/linear_model/… 但我不确定
  • 如果“标准 X,y 输入”不排除它,您可以简单地向 X 添加高阶特征。假设您有 x,y 坐标,添加 x^2,y^2,x ^3, y^3, ... 将允许更复杂的轮廓(添加的更高阶项越复杂)

标签: python scikit-learn logistic-regression


【解决方案1】:

如果您真的想针对此特定设置使用 Logistic 回归,一个很有前途的方法是将您的坐标从笛卡尔坐标系转换为极坐标系。从可视化来看,在那个系统中,您的数据似乎(几乎)是线性可分的。

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

【讨论】:

  • 这是个好主意,我从来没想过这样做
【解决方案2】:

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

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

【讨论】:

    【解决方案3】:

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

    首先,我将了解一些多方面的学习,以将您的数据转换到另一个空间

    # 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.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()
    

    输出

    1.0
    

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

    其他人提到的可供您使用的另一个选项是使用不同的模型。虽然有很多选项可供您使用,但我将使用RandomForestClassifier 展示一个示例。我只会对一半的数据进行训练,这样我们就可以评估无偏集的准确性。我以前只用过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)
    

    输出

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

    解决同一问题的两种方法。我把最好的锻炼留给读者……

    【讨论】:

    • 很好的例子!两个答案都提到了预处理:“变换坐标”和“变换数据以使其线性可分”是预处理。
    • 谢谢!是的,我在一个答案中混杂了很多术语。我应该更加一致,但不太确定哪个是最好的术语。
    猜你喜欢
    • 2016-02-21
    • 2016-07-31
    • 2018-03-01
    • 2012-06-27
    • 2016-06-17
    • 2020-07-27
    • 2016-12-27
    • 2018-09-23
    • 2015-04-27
    相关资源
    最近更新 更多