2015-01-31 2 views
7

Я реализую логистическую регрессию. Мне удалось получить из этого вероятность, и я могу предсказать задачу классификации класса 2.график границы решения логистической регрессии

Мой вопрос:

Для моей последней модели, у меня есть и весов обучающих данных. Есть 2 функции, поэтому мой вес - это вектор с 2 строками.

Как это сделать? Я видел this post, но я не совсем понимаю ответ. Нужен ли мне контурный график?

ответ

20

Преимущество логистического регрессионного классификатора заключается в том, что как только вы его подгоняете, вы можете получить вероятности для любого образца вектора. Это может быть интереснее сюжет. Вот пример использования scikit-узнать:

import numpy as np 
from sklearn.linear_model import LogisticRegression 
from sklearn.datasets import make_classification 
import matplotlib.pyplot as plt 
import seaborn as sns 
sns.set(style="white") 

Во-первых, генерировать данные и установите классификатор в обучающем наборе:

X, y = make_classification(200, 2, 2, 0, weights=[.5, .5], random_state=15) 
clf = LogisticRegression().fit(X[:100], y[:100]) 

Затем сделать непрерывную сетку значений и оценить вероятность каждого (х, у) точки в сетке:

xx, yy = np.mgrid[-5:5:.01, -5:5:.01] 
grid = np.c_[xx.ravel(), yy.ravel()] 
probs = clf.predict_proba(grid)[:, 1].reshape(xx.shape) 

Теперь построить вероятностную сетку в качестве контурной карты и дополнительно показывают тест набор образцов на нем:

f, ax = plt.subplots(figsize=(8, 6)) 
contour = ax.contourf(xx, yy, probs, 25, cmap="RdBu", 
         vmin=0, vmax=1) 
ax_c = f.colorbar(contour) 
ax_c.set_label("$P(y = 1)$") 
ax_c.set_ticks([0, .25, .5, .75, 1]) 

ax.scatter(X[100:,0], X[100:, 1], c=y[100:], s=50, 
      cmap="RdBu", vmin=-.2, vmax=1.2, 
      edgecolor="white", linewidth=1) 

ax.set(aspect="equal", 
     xlim=(-5, 5), ylim=(-5, 5), 
     xlabel="$X_1$", ylabel="$X_2$") 

enter image description here

логистической регрессии позволяет ваши классификации новых образцов на основе какого-то порога вы хотите, чтобы он не по своей сути есть одно «решение границы.» Но, конечно, общее правило принятия решения - p = .5. Мы также можем просто сделать этот уровень контура, используя приведенный выше код:

f, ax = plt.subplots(figsize=(8, 6)) 
ax.contour(xx, yy, probs, levels=[.5], cmap="Greys", vmin=0, vmax=.6) 

ax.scatter(X[100:,0], X[100:, 1], c=y[100:], s=50, 
      cmap="RdBu", vmin=-.2, vmax=1.2, 
      edgecolor="white", linewidth=1) 

ax.set(aspect="equal", 
     xlim=(-5, 5), ylim=(-5, 5), 
     xlabel="$X_1$", ylabel="$X_2$") 

enter image description here

+0

Правильно ли я, что вы импортировали 'seaborn', но на самом деле не использовали его в своем ответе? Я не знаком с этой библиотекой, просто проверяя, нужно ли это для ответа. – Rhubarb

+1

@ Zhubarb: Seaborn переопределяет многие из конфигураций matplotlib по умолчанию, как только вы его импортируете. Поэтому, если вам не нужны какие-либо функциональные возможности, которые предоставляет seaborn напрямую, но просто хотите, чтобы matplotlib выглядел БОЛЬШЕ лучше, чем по умолчанию, все, что вам нужно сделать, это inport seaborn и заниматься своим бизнесом с помощью matplotlib. – Gus

+0

@Gus Я получаю сообщение об ошибке at 'probs = clf.predict_probs (grid) [:, 1] .reshape (xx.shape)', говорящий, что 'AttributeError: объект LogisticRegression 'не имеет атрибута' predict_probs'' Я что-то упускаю? –

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