2016-11-17 5 views
3

Как вы обрабатывать графики, как это: enter image description hereлогистическая регрессия в scikitlearn

используя модель логистической регрессии scikitlearn в. Есть ли способ легко справляться с этими проблемами, используя scikitlearn и стандартный вход X, y, который сопоставляется с таким графиком?

+2

LR может обрабатывать только линейные разделимые классы в своей необработанной форме. – Kh40tiK

+1

Я не думаю, что данные, представленные здесь, являются линейно разделяемыми – Backtrack

+2

Вы не можете использовать логистику для этого, НО вы можете использовать SVM с радиальным (круговым) ядром. http://scikit-learn.org/stable/modules/svm.html – Wboy

ответ

2

Многообещающий подход, если вы действительно хотите использовать Логистическую регрессию для данного конкретного параметра, - это преобразовать ваши координаты из декартовой системы в полярную систему. Из визуализации кажется, что в этих системах данные будут (почти) линейно разделяемыми.

Это может быть сделано, как описано здесь: Python conversion between coordinates

+0

это потрясающая идея , я никогда не думал об этом – Rob

1

Как другие говорили, логистическая регрессия не может обрабатывать данные такого рода хорошо, потому что это линейный классификатор. Вы можете преобразовать данные, чтобы сделать их линейно разделяемыми, или выбрать другой классификатор, который лучше подходит для такого рода данных.

Существует хорошая визуализация того, как различные классификаторы справляются с этой проблемой в документах scikit-learn: см. http://scikit-learn.org/stable/auto_examples/classification/plot_classifier_comparison.html. Вторая строка для вашей задачи:

enter image description here

+0

очень круто графическое спасибо – Rob

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 

Таким образом, вы можете видеть, что теперь ваши данные 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) 

Выходы:

Decision boundry of RF classifier

Таким образом, это показывает области вашего пространства, которые классифицируются в каждый класс с использованием модели Random Forest.

Два способа решения одной и той же проблемы. Я оставляю работу, которая лучше всего подходит для чтения ...

+0

Приятные примеры! В обоих ответах упоминается предварительная предварительная обработка: «преобразование координат» и «преобразование данных, чтобы сделать его линейно разделяемым» - это предварительная обработка. –

+0

Спасибо! Да, я как-то перепутал много терминов в один ответ. Я должен быть более последовательным, но не совсем уверенным, что является лучшей терминологией. – ncfirth

 Смежные вопросы

  • Нет связанных вопросов^_^