<jupyter_start><jupyter_text>Importando libs<jupyter_code>from sklearn import datasets
import pandas as pd
import matplotlib.pyplot as plt<jupyter_output><empty_output><jupyter_text>Carregando base https://archive.ics.uci.edu/ml/datasets/wine já disponível no sklearn<jupyter_code>wine = datasets.load_wine()

# Criando o DataFrame
df = df_wine = pd.DataFrame(data=wine.data,columns=wine.feature_names)

# Criando a coluna com os valores da variável target.
df_wine['class'] = wine.target<jupyter_output><empty_output><jupyter_text>Trabalhando com o Pandas Profiling<jupyter_code>from pandas_profiling import ProfileReport

#Carregando o dataframe no profile report e configurando como html
profile = ProfileReport(df, title='Profile Covid-19', html={'style':{'full_width': True}})

profile.to_notebook_iframe()<jupyter_output><empty_output><jupyter_text>Separando os dados de treino e teste<jupyter_code>from sklearn.model_selection import train_test_split

X_train, X_test, y_train, y_test = train_test_split(df_wine.drop('class',axis=1), df_wine['class'], test_size=0.3)<jupyter_output><empty_output><jupyter_text>Alguns parâmetros interessantes:- n_neighbors: Número de vizinhos (default = 5), é o parâmetro K que vimos na parte de funcionamento do algoritmo. - Weights: Peso de amostras vizinhas (default = uniform). - metric: Métrica utilizada para o cálculo de distância (default = minkowski), temos outras métricas como a distância Hamming, Manhattan e a Markowski. - p: Parâmetro de poder para a métrica (default = 2), essa valor varia de acordo com a métrica de distância escolhida. - n_jobs: Número de jobs paralelos para executar no momento da busca de vizinhos (default = 1). Com esse parâmetro podemos definir quantas cpu queremos usar para fazer o processo de predição. Instanciando o Classificador<jupyter_code>from sklearn.neighbors import KNeighborsClassifier


# Definindo o número de vizinhos.
knn = KNeighborsClassifier(n_neighbors=3)

# Agora iremos aplicar nossos dados de treino ao algoritmo KNN.

knn.fit(X_train, y_train)

# Resultado
resultado = knn.predict(X_test)
resultado<jupyter_output><empty_output><jupyter_text>Analisando e validando os resultados obtidos<jupyter_code># Uma matriz de confusão é uma tabela que indica os erros e acertos do seu modelo, comparando com o resultado esperado (ou etiquetas/labels)
print (pd.crosstab(y_test,resultado, rownames=['Real'], colnames=['Predito'], margins=True))

# Verdadeiros Positivos: classificação correta da classe Positivo;
# Falsos Negativos (Erro Tipo II): erro em que o modelo previu a classe Negativo quando o valor real era classe Positivo;
# Falsos Positivos (Erro Tipo I): erro em que o modelo previu a classe Positivo quando o valor real era classe Negativo;
# Verdadeiros Negativos: classificação correta da classe Negativo.<jupyter_output>Predito   0   1   2  All
Real                    
0        14   2   2   18
1         3  14   8   25
2         1   5   5   11
All      18  21  15   54<jupyter_text>Métricas de classificação<jupyter_code>from sklearn import metrics


#Precision é a tolerância do erro de medição para determinado medidor. 
#Quanto mais precisa uma medição, menor será a variabilidade entre os valores obtidos, dessa série de medições realizadas, apresentando dessa maneira uma pequena dispersão.

#Recall/Revocação/Sensibilidade: dentre todas as situações de classe Positivo como valor esperado, quantas estão corretas;
#O F1-Score é simplesmente uma maneira de observar somente 1 métrica ao invés de duas (precisão e recall) em alguma situação. É uma média harmônica entre as duas, que está muito mais próxima dos menores valores do que uma média aritmética simples. Ou seja, quando tem-se um F1-Score baixo, é um indicativo de que ou a precisão ou o recall está baixo.
#O suporte é o número de amostras da resposta verdadeira que estão na classe correta.

print(metrics.classification_report(y_test,resultado,target_names=wine.target_names))<jupyter_output>precision    recall  f1-score   support

     class_0       0.78      0.78      0.78        18
     class_1       0.67      0.56      0.61        25
     class_2       0.33      0.45      0.38        11

    accuracy                           0.61        54
   macro avg       0.59      0.60      0.59        54
weighted avg       0.64      0.61      0.62        54
{'fraction_non_alphanumeric': 0.06480627306273062, 'fraction_numerical': 0.02467712177121771, 'mean_word_length': 4.11438679245283, 'pattern_counts': {'":': 0, '<': 27, '<?xml version=': 0, '>': 27, 'https://': 1, 'lorem ipsum': 0, 'www.': 0, 'xml': 0}, 'pii_count': 0, 'substrings_counts': 0, 'word_list_counts': {'cursed_substrings.json': 2, 'profanity_word_list.json': 0, 'sexual_word_list.json': 0, 'zh_pornsignals.json': 0}}
{'chain_length': '7', 'dir': 'jupyter-structured-clean-dedup', 'id': '330544', 'license': 'MIT', 'n_tokens_mistral': 1548, 'n_tokens_neox': 1475, 'n_words': 483, 'path': 'aulas/knn.ipynb', 'repo_name': 'danilovbarbosa/machine_learning', 'size': '4336'}