SingularCode

Algoritmo KNN

Algoritmo KNN

O algoritmo K-Nearest Neighbors (KNN) é um dos métodos mais simples e intuitivos dentro do campo da aprendizagem de máquina, utilizado tanto para classificação quanto para regressão. A base do KNN é a premissa de que itens semelhantes estão próximos uns dos outros. Vamos explorar em detalhes o funcionamento, características e aplicações do KNN.

 

Funcionamento do KNN

O algoritmo KNN opera sob o princípio de que instâncias de dados dentro de um conjunto são circundadas por instâncias semelhantes. Quando um novo ponto de dados é introduzido, o KNN busca no conjunto de dados os k vizinhos mais próximos (onde k é um número inteiro positivo) e faz uma previsão baseada nas propriedades desses vizinhos.

 

Classificação

No contexto de classificação, o KNN atribui ao novo ponto a classe mais comum entre seus k vizinhos mais próximos. Se k=1, por exemplo, o ponto é simplesmente atribuído à classe de seu vizinho mais próximo.

Regressão
Para regressão, o KNN calcula a média (ou outra medida de agregação, como a mediana) dos valores dos k vizinhos mais próximos e usa esse valor como a previsão para o novo ponto.

 

Escolha de k

A escolha do número de vizinhos, k, é crucial para o desempenho do KNN. Um k pequeno pode tornar o algoritmo sensível ao ruído dos dados, enquanto um k muito grande pode suavizar demais a fronteira de decisão, levando a uma má generalização. A seleção de um k ótimo geralmente é feita através de validação cruzada.

 

Aplicações do KNN

Reconhecimento de Padrões: Usado em sistemas de reconhecimento de imagem e vídeo para identificar objetos ou rostos.

Sistemas de Recomendação: Pode sugerir produtos ou mídias semelhantes aos interesses de um usuário.

Classificação de Texto: Classifica documentos ou e-mails em categorias baseadas em conteúdo.

Previsão Financeira: Estimar o risco de crédito ou categorizar clientes com base em comportamentos de compra.

 

Vantagens

Simplicidade: Fácil de entender e implementar.

Flexibilidade: Funciona bem para classificação e regressão.

Adaptabilidade: Pode ser usado com uma variedade de medidas de distância para se adaptar a diferentes tipos de dados.

 

Desvantagens

Escalabilidade: Torna-se computacionalmente caro à medida que o tamanho do conjunto de dados aumenta.

Desempenho: Pode ser afetado negativamente por características irrelevantes ou redundantes.

Necessidade de Normalização: Sensível a variáveis em diferentes escalas.

Dataset Iris:

from sklearn.datasets import load_iris
# Carregar o dataset Iris
iris = load_iris()
#print(iris.DESCR)
#print(iris.feature_names)
#print(iris.target_names)
#print(iris.target)
print(iris.data)

#Dividir dados de treinamento e dados de teste
from sklearn.model_selection import train_test_split

#X (X é a matriz de caracterisitcas e y é o rótulo)
X_treino, X_teste, y_treino, y_teste = train_test_split(iris.data, iris.target, test_size=0.3,  stratify=iris.target)

print(y_treino)
print(y_teste)
print(len(y_treino),len(y_teste))

#usar Knn
from sklearn.neighbors import KNeighborsClassifier
knn = KNeighborsClassifier(n_neighbors=9)

#usar o treinamento knn
knn.fit(X_treino,y_treino)

#fazer a predição
y_predito = knn.predict(X_teste)
print(y_predito)

from sklearn.metrics import accuracy_score, confusion_matrix
#Acurácia
accuracy = accuracy_score(y_teste, y_predito)
print(f"Acurácia: {accuracy}")

conf_matrix = confusion_matrix(y_teste, y_predito)
print("Matriz de Confusão:")
print(conf_matrix)

# Nova amostra (exemplo: 5.1, 3.5, 1.4, 0.2)
nova_amostra = [[5.1, 3.5, 1.4, 0.2]]

# Prever a classe da nova amostra
classe_predita = knn.predict(nova_amostra)
nome_classe = iris.target_names[classe_predita][0]

print(f"A classe predita para a nova amostra é: {nome_classe}")

Dataset Wine:

from sklearn import datasets
vinho = datasets.load_wine()
print(vinho.DESCR)
#print(vinho.feature_names)
#print(vinho.target_names)
#print(vinho.target)
#print(vinho.data)

#Dividir dados de treinamento e dados de teste
from sklearn.model_selection import train_test_split

#X (X é a matriz de caracterisitcas e y é o rótulo)
X_treino, X_teste, y_treino, y_teste = train_test_split(vinho.data, vinho.target, test_size=0.3,  stratify=vinho.target)

print(y_treino)
print(y_teste)
print(len(y_treino),len(y_teste))

#usar Knn
from sklearn.neighbors import KNeighborsClassifier
knn = KNeighborsClassifier(n_neighbors=3)
#usar o treinamento knn
knn.fit(X_treino,y_treino)

#fazer a predição
y_predito = knn.predict(X_teste)
print(y_predito)

from sklearn.metrics import accuracy_score, confusion_matrix
#Acurácia
accuracy = accuracy_score(y_teste, y_predito)
print(f"Acurácia: {accuracy}")

conf_matrix = confusion_matrix(y_teste, y_predito)
print("Matriz de Confusão:")
print(conf_matrix)

# Nova amostra (exemplo: teor alcoólico, ácido málico, cinzas, etc.)
nova_amostra = [[13.2, 1.78, 2.14, 11.2, 100, 2.65, 2.76, 0.26, 1.28, 4.38, 1.05, 3.40, 1050]]

# Prever a classe da nova amostra
classe_predita = knn.predict(nova_amostra)
nome_classe = vinho.target_names[classe_predita][0]

print(f"A classe predita para a nova amostra é: {nome_classe}")

Atualizado em: 07/04/2024 por Nelson H. Koshoji