<jupyter_start><jupyter_text>Exercício 5.2Utilizando o dataset Pulsar Star (disponível no repositório da disciplina) construa um classificador SVM que classifique as amostras em estrelas de nêutrons ou não.  Avalie a precisão, acurácia e varie o tipo de kernel e parâmetro C para este problema. (GridSearch é opcional mas recomendável).  Qual foi a melhor configuração que você encontrou?  Dica:   - Observe a matriz de confusão para verificar se o classificar está conseguindo classificar dados das duas classes;   - Normalize os dados;<jupyter_code>import pandas as pd
import seaborn as sb
import matplotlib.pyplot as plt

from sklearn.preprocessing import StandardScaler, MinMaxScaler
from sklearn.model_selection import train_test_split
from sklearn import metrics 
from sklearn.metrics import classification_report, plot_confusion_matrix, accuracy_score
from sklearn.metrics import confusion_matrix
from sklearn.svm import SVC
from sklearn.model_selection import GridSearchCV
from sklearn.decomposition import PCA
dataset = pd.read_csv('bases/pulsar_stars.csv')
dataset.head()
dataset.info()
dataset.hist(figsize = (20,20));
dataset.boxplot(figsize = (10,10))
dataset.shape
X = dataset.iloc[:,[0,1,2,3,4,5,6,7]].values
y = dataset.iloc[:,8].values
#Normalização do Conjunto utilizando StandardScaler
X = StandardScaler().fit_transform(X)

X_train, X_test, y_train, y_test = train_test_split(X, y, test_size = .3, random_state=25)
param_grid = {'C': [0.001, 0.01, 0.1, 1, 10, 100, 1000],  
              'gamma': [1000,100, 10, 1, 0.1, 0.01, 0.001, 0.0001], 
              'kernel': ['rbf', 'sigmoid', 'linear']}


grid_search = GridSearchCV(SVC(), param_grid,verbose = 3, cv=5, n_jobs=-1)
grid_result = grid_search.fit(X_train, y_train)  

#Imprime os Melhores parâmetros Encontrados
print(grid_search.best_params_)

#Imprime os Melhores parâmetros Encontrados
print(grid_search.best_score_)
bestSVM = grid_search.best_estimator_

y_pred = bestSVM.predict(X_test)

print(classification_report(y_test, y_pred))
print(accuracy_score(y_test, y_pred))

cm = confusion_matrix(y_test, y_pred)
print(cm)
plot_confusion_matrix(bestSVM, X_test, y_test, normalize = 'true');

# Visualização 'simplificada' utilizando PCA
pca = PCA(n_components=2).fit_transform(X_test)

f, (ax1, ax2) = plt.subplots(figsize = (22,10), ncols = 2)
ax1.scatter(pca[y_test == 0, 0], pca[y_test == 0, 1], s = 12, c = '#5595FA', label = 'Classe 0')
ax1.scatter(pca[y_test == 1, 0], pca[y_test == 1, 1], s = 12, c = '#FAB72F', label = 'Classe 1')
ax1.legend()
ax1.set_title('Dado original')

ax2.scatter(pca[y_pred == 0, 0], pca[y_pred == 0, 1], s = 12, c = '#5595FA', label = 'Classe 0')
ax2.scatter(pca[y_pred == 1, 0], pca[y_pred == 1, 1], s = 12, c = '#FAB72F', label = 'Classe 1')
ax2.legend()
ax2.set_title('Classificação')

plt.show();<jupyter_output><empty_output>
{'fraction_non_alphanumeric': 0.12557157931762222, 'fraction_numerical': 0.043615898698557864, 'mean_word_length': 5.629370629370629, 'pattern_counts': {'":': 0, '<': 5, '<?xml version=': 0, '>': 5, 'https://': 0, 'lorem ipsum': 0, 'www.': 0, 'xml': 0}, 'pii_count': 0, 'substrings_counts': 0, 'word_list_counts': {'cursed_substrings.json': 0, 'profanity_word_list.json': 0, 'sexual_word_list.json': 0, 'zh_pornsignals.json': 0}}
{'chain_length': '1', 'dir': 'jupyter-structured-clean-dedup', 'id': '550746', 'license': 'MIT', 'n_tokens_mistral': 1171, 'n_tokens_neox': 1068, 'n_words': 280, 'path': 'exercicio-5.2.ipynb', 'repo_name': 'DiegoMatsuki/FIAP-Modelos', 'size': '2843'}