Primeiro importo as bibliotecas que usei para a resolução desse exercício:
from sklearn.datasets import make_classification
import matplotlib.pyplot as plt
import numpy as np
Em seguida crio um modelo de classificação e ploto eles com em um gráfico de dispersão, de forma que possamos ver com nitidez cada ponto.
np.random.seed(30)
X, Y = make_classification(n_features= 2,
n_redundant= 0,
n_informative= 1,
n_clusters_per_class= 1,)
plt.scatter(X[:, 0], X[:, 1],
marker='o',
c=Y,
edgecolor='k')
p = X[10]
print(Y[10])
plt.plot(p[0], p[1], marker='^', markersize= 20)
Ao vizualizar como as classes estão distribuidas agora podemos plotar uma reta no espaço que divida bem as duas classes. Pra isso acontecer, criamos uma função (plotmodel()) e pegamos um ponto aleatório no gráfico para sabermos qual classe é negativa (se encontra abaixo da reta) e qual é a classe positiva (que se encontra acima da reta).
def plotmodel(w1, w2, b):
plt.scatter(X[:, 0], X[:, 1],
marker='o',
c=Y,
edgecolor='k')
xmin, xmax = plt.gca().get_xlim()
ymin, ymax = plt.gca().get_xlim()
x = np.linspace(-2, 4, 50)
y = (-w1*x -b)/w2
plt.axvline(0, -1, 1, color='k', linewidth=1)
plt.axhline(0, -2, 4, color='k', linewidth=1)
plt.plot(x, y)
plt.grid(True)
plt.xlim(xmin, xmax)
plt.ylim(ymin, ymax)
w1 = 1 #a
w2 = 15 #b
b = 1 #c
plotmodel(w1, w2, b)
p = (-1, -1)
print(w1 * p[0] + w2 * p[1] * b)
# Classe azul é NEGATIVO em relação a reta
# Classe amarela é POSITIVA em relação a reta
Agora faremos isso para todos os pontos do nosso modelo criando uma outra função chamada "classify()". Mais uma vez pegaremos um ponto aleatório para saber se está classificando bem.
def classify(ponto, w1, w2, b):
ret = w1 * ponto[0] + w2 * ponto[1] + b
if ret >= 0:
return 1, 'yellow'
else:
return 0, 'blue'
p = (2, 1)
classe, cor = classify(p, w1, w2, b)
print(classe, cor)
plotmodel(w1, w2, b)
plt.plot(p[0], p[1], marker='^', color= cor, markersize= 20)
E por fim usamos um laço para mostrar a acurácia que o nosso modelo de classifição obteve:
acertos = 0
for k in range(len(X)):
categ, _ = classify(X[k], w1, w2, b)
if categ == Y[k]:
acertos += 1
print(f"Acurácia: {acertos/len(X) * 100}%")
# Acurácia: 91.0%