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