Ошибка при построении границы решения с использованием Matplotlib - PullRequest
0 голосов
/ 19 ноября 2018

Я недавно написал модель логистической регрессии с использованием модуля Scikit.Тем не менее, у меня ДЕЙСТВИТЕЛЬНО ТРУДНОЕ время для построения границы решения.Я явно умножаю Коэффициенты и Перехваты и строю их на графике (что, в свою очередь, приводит к неправильному значению).

Может ли кто-нибудь указать мне правильное направление на то, как построить границу решения?

Есть ли более простой способ построения линии без умножения коэффициентов и перехватов вручную?

Спасибо за миллион!

import pandas as pd
import matplotlib.pyplot as plt
import numpy as np
from sklearn.linear_model import LogisticRegression
from sklearn.model_selection import train_test_split
from sklearn.metrics import accuracy_score

#Import Dataset
dataset = pd.read_csv("Students Exam Dataset.txt", names=["Exam 1", "Exam 2", "Admitted"])
print(dataset.head())

#Visualizing Dataset
positive = dataset[dataset["Admitted"] == 1]
negative = dataset[dataset["Admitted"] == 0]

plt.scatter(positive["Exam 1"], positive["Exam 2"], color="blue", marker="o", label="Admitted")
plt.scatter(negative["Exam 1"], negative["Exam 2"], color="red", marker="x", label="Not Admitted")
plt.title("Student Admission Plot")
plt.xlabel("Exam 1")
plt.ylabel("Exam 2")
plt.legend()
plt.plot()
plt.show()

#Preprocessing Data
col = len(dataset.columns)
x = dataset.iloc[:,0:col].values
y = dataset.iloc[:,col-1:col].values
print(f"X Shape: {x.shape}   Y Shape: {y.shape}")

x_train, x_test, y_train, y_test = train_test_split(x, y, test_size=0.2, random_state=1306)

#Initialize Model
reg = LogisticRegression()
reg.fit(x_train, y_train)

#Output
predictions = reg.predict(x_test)
accuracy = accuracy_score(y_test, predictions) * 100
coeff = reg.coef_
intercept = reg.intercept_
print(f"Accuracy Score : {accuracy} %")
print(f"Coefficients = {coeff}")
print(f"Intercept Coefficient = {intercept}")

#Visualizing Output
xx = np.linspace(30,100,100)
decision_boundary = (coeff[0,0] * xx + intercept.item()) / coeff[0,1]
plt.scatter(positive["Exam 1"], positive["Exam 2"], color="blue", marker="o", label="Admitted")
plt.scatter(negative["Exam 1"], negative["Exam 2"], color="red", marker="x", label="Not Admitted")
plt.plot(xx, decision_boundary, color="green", label="Decision Boundary")
plt.title("Student Admission Plot")
plt.xlabel("Exam 1")
plt.ylabel("Exam 2")
plt.legend()
plt.show()

Набор данных: Student Dataset.txt

1 Ответ

0 голосов
/ 20 ноября 2018

Существует ли более простой способ построения линии без умножения коэффициентов и перехватов вручную?

Да, если вам не нужно создавать это с нуля, есть отличная реализация построения границ решений из классификаторов scikit-learn в пакете mlxtend. Документация обширна в предоставленной ссылке, и ее легко установить с помощью pip install mlxtend.

Сначала пара моментов о блоке Preprocessing кода, который вы разместили:
1. x не должен включать метки классов.
2. y должен быть массивом 1d.

#Preprocessing Data
col = len(dataset.columns)
x = dataset.iloc[:,0:col-1].values # assumes your labels are always in the final column.
y = dataset.iloc[:,col-1:col].values
y = y.reshape(-1) # convert to 1d

Теперь прорисовка так же проста, как:

from mlxtend.plotting import plot_decision_regions
plot_decision_regions(x, y,
                      X_highlight=x_test,
                      clf=reg,
                      legend=2)

Этот конкретный график выделяет x_test точек данных, окружая их.

enter image description here

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...