1
resposta

Classificação de dados usando o SEED = 30

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%
1 resposta

Boas Alberto! Tudo bem? Espero que sim!

Perdoe a demora em responder.

O seu cóigo está excelente e os comentários bastante flúidos. Fica bem claro o que você está fazendo e como.

Só ressalto, pelo seu título, que usamos o np.seed() parar ter resultados replicáveis.

Novamente, parabéns pelo código!

Caso este post tenha lhe ajudado, por favor, marcar como solucionado ✓.Bons Estudos!