2015-01-31 24 views
7

Tôi đang thực hiện hồi quy logistic. Tôi quản lý để có được xác suất ra khỏi nó, và tôi có thể dự đoán một nhiệm vụ phân loại 2 lớp.vẽ ranh giới quyết định của hồi quy logistic

Câu hỏi của tôi là:

Đối với mô hình cuối cùng, tôi có trọng số và dữ liệu đào tạo. Có 2 tính năng, vì vậy trọng lượng của tôi là một vectơ với 2 hàng.

Làm cách nào để vẽ đồ thị này? Tôi thấy this post, nhưng tôi không hiểu câu trả lời. Tôi có cần một đường viền không?

Trả lời

20

Lợi thế của trình phân loại hồi quy logistic là khi bạn vừa với nó, bạn có thể nhận được xác suất cho bất kỳ vectơ mẫu nào. Điều đó có thể thú vị hơn để vẽ. Dưới đây là một ví dụ sử dụng scikit-học:

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") 

Thứ nhất, tạo ra các dữ liệu và phù hợp với phân loại để tập huấn luyện:

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

Tiếp theo, tạo ra một mạng lưới liên tục các giá trị và đánh giá khả năng của mỗi (x, y) chỉ trong lưới:

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) 

Bây giờ, vẽ lưới khả năng như một bản đồ đường viền và bổ sung cho các mẫu thử nghiệm thiết lập trên đầu trang của nó:

01.235.
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

Các hồi quy logistic cho phép mẫu mới classify của bạn dựa trên bất kỳ ngưỡng mà bạn muốn, vì vậy nó không vốn đã có một "ranh giới quyết định." Nhưng, tất nhiên, một quy tắc quyết định chung để sử dụng là p = .5. Chúng tôi cũng có thể chỉ cần vẽ đường viền rằng mức độ sử dụng đoạn code trên:

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

Tôi có phải rằng bạn đã nhập 'seaborn' nhưng thực tế đã không sử dụng nó trong câu trả lời của bạn? Tôi không quen thuộc với thư viện đó, chỉ cần kiểm tra xem nó là cần thiết cho câu trả lời. – Rhubarb

+1

@Zhubarb: Seaborn ghi đè nhiều cấu hình mặc định của matplotlib ngay sau khi bạn nhập. Vì vậy, nếu bạn không cần bất kỳ chức năng mà seaborn cung cấp trực tiếp, nhưng chỉ muốn matplotlib nhìn MUCH tốt hơn nó theo mặc định, tất cả những gì bạn phải làm là inport seaborn và đi về doanh nghiệp của bạn với matplotlib – Gus

+0

@Gus Tôi gặp lỗi tại 'probs = clf.predict_probs (grid) [:, 1] .reshape (xx.shape)' nói rằng đối tượng 'AttributeError: 'LogisticRegression' không có thuộc tính 'predict_kết_probs'' tôi có thiếu gì đó không? –

Các vấn đề liên quan