Там было несколько ответов уже, но ни один из них упоминали любую предварительную обработку данных. Поэтому я покажу оба способа рассмотрения вашей проблемы.
Сначала я буду смотреть на некотором многообразии обучения, чтобы превратить вас данные в другое пространство
# 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
Таким образом, вы можете видеть, что теперь ваши данные perfectally линейно seperable из 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 awesomescikit-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)
Выходы:
Таким образом, это показывает области вашего пространства, которые классифицируются в каждый класс с использованием модели Random Forest.
Два способа решения одной и той же проблемы. Я оставляю работу, которая лучше всего подходит для чтения ...
LR может обрабатывать только линейные разделимые классы в своей необработанной форме. – Kh40tiK
Я не думаю, что данные, представленные здесь, являются линейно разделяемыми – Backtrack
Вы не можете использовать логистику для этого, НО вы можете использовать SVM с радиальным (круговым) ядром. http://scikit-learn.org/stable/modules/svm.html – Wboy