已经有几个答案,但他们都没有提到任何数据预处理。因此,我将展示两种看待问题的方式。
首先,我将了解一些多方面的学习,以将您的数据转换到另一个空间
# 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)
输出:
因此,这显示了使用随机森林模型分类到每个类别的空间区域。
解决同一问题的两种方法。我把最好的锻炼留给读者……