<jupyter_start><jupyter_text>Support Vector Machines com PythonBem vindo ao notebook sobre Support Vector Machines com Python! Lembre-se de se consultar o vídeo para obter informações completas sobre o código aqui! Importando bibliotecas<jupyter_code>import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
import seaborn as sns
%matplotlib inline<jupyter_output><empty_output><jupyter_text>Obter dadosUsaremos o conjunto de dados de câncer de mama incorporado da Scikit Learn. Podemos obter com a função load:<jupyter_code>from sklearn.datasets import load_breast_cancer
cancer = load_breast_cancer()<jupyter_output><empty_output><jupyter_text>O conjunto de dados é apresentado em uma forma de dicionário:<jupyter_code>cancer.keys()<jupyter_output><empty_output><jupyter_text>Podemos pegar informações e arrays deste dicionário para configurar nosso dataframe e entender os recursos:<jupyter_code>print(cancer['DESCR'])
cancer['feature_names']<jupyter_output><empty_output><jupyter_text>Configurando o DataFrame<jupyter_code>df_feat = pd.DataFrame(cancer['data'],columns=cancer['feature_names'])
df_feat.info()
cancer['target']
df_target = pd.DataFrame(cancer['target'],columns=['Cancer'])<jupyter_output><empty_output><jupyter_text>Agora vamos verificar o dataframe:<jupyter_code>df.head()<jupyter_output><empty_output><jupyter_text>Análise de dados exploratórios Nós ignoraremos a parte Data Viz para esta leitura, pois existem tantos parâmetros que são difíceis de interpretar se você não tem conhecimento e domínio de câncer ou células tumorais. No seu projeto você terá mais oportunidades para visualizar os dados.  Divisão treino-teste<jupyter_code>from sklearn.model_selection import train_test_split
X_train, X_test, y_train, y_test = train_test_split(df_feat, np.ravel(df_target), test_size=0.30, random_state=101)<jupyter_output><empty_output><jupyter_text>Treinando o Support Vector Classifier<jupyter_code>from sklearn.svm import SVC
model = SVC()
model.fit(X_train,y_train)<jupyter_output><empty_output><jupyter_text>Previsões e avaliaçõesAgora vamos prever o uso do modelo treinado.<jupyter_code>predictions = model.predict(X_test)
from sklearn.metrics import classification_report,confusion_matrix
print(confusion_matrix(y_test,predictions))
print(classification_report(y_test,predictions))<jupyter_output>precision    recall  f1-score   support

          0       0.00      0.00      0.00        66
          1       0.61      1.00      0.76       105

avg / total       0.38      0.61      0.47       171<jupyter_text>Note que estamos classificando tudo em uma única classe! Isso significa que nosso modelo precisa ter parâmetros ajustados (também pode ajudar a normalizar os dados).Podemos procurar por parâmetros usando um GridSearch!  GridsearchEncontrar os parâmetros certos (como o que o C ou os valores de gama para usar) é uma tarefa complicada! Mas, felizmente, podemos ser um pouco preguiçosos e apenas tentar um monte de combinações e ver o que funciona melhor! Essa idéia de criar uma "grade" de parâmetros e apenas experimentar todas as combinações possíveis é chamada Gridsearch, esse método é comum o suficiente para que o Scikit-learn tenha essa funcionalidade incorporada no GridSearchCV!O GridSearchCV usa um dicionário que descreve os parâmetros que devem ser testados e um modelo para treinar. A grade de parâmetros é definida como um dicionário, onde as chaves são os parâmetros e os valores são as configurações a serem testadas.<jupyter_code>param_grid = {'C': [0.1,1, 10, 100, 1000], 'gamma': [1,0.1,0.01,0.001,0.0001], 'kernel': ['rbf']} 
from sklearn.model_selection import GridSearchCV<jupyter_output><empty_output><jupyter_text>Uma das grandes coisas do GridSearchCV é que é um meta-estimador. Ele pega um estimador como SVC e cria um novo estimador, que se comporta exatamente da mesma forma - neste caso, como um classificador. Você deve adicionar refit=True e escolher detalhadamente para  número desejado, maior o número, mais detalhado. Você deve adicionar refit=True e escolher  um número para o parâmetro verbose. Quanto maior o número, mais detalhamento teremos.<jupyter_code>grid = GridSearchCV(SVC(),param_grid,refit=True,verbose=3)<jupyter_output><empty_output><jupyter_text>O que o fit faz é um pouco mais complicado do que o habital. Primeiro, ele executa o mesmo loop com validação cruzada, para encontrar a melhor combinação de parâmetros. Uma vez que tenha a melhor combinação, ele corre novamente em todos os dados para fitá-los (sem validação cruzada), para construir um único modelo novo usando a melhor configuração de parâmetro.<jupyter_code># Talvez demore um pouco
grid.fit(X_train,y_train)<jupyter_output>Fitting 3 folds for each of 25 candidates, totalling 75 fits
[CV] gamma=1, C=0.1, kernel=rbf ......................................
[CV] ............. gamma=1, C=0.1, kernel=rbf, score=0.631579 -   0.0s
[CV] gamma=1, C=0.1, kernel=rbf ......................................
[CV] ............. gamma=1, C=0.1, kernel=rbf, score=0.631579 -   0.0s
[CV] gamma=1, C=0.1, kernel=rbf ......................................
[CV] ............. gamma=1, C=0.1, kernel=rbf, score=0.636364 -   0.0s
[CV] gamma=0.1, C=0.1, kernel=rbf ....................................
[CV] ........... gamma=0.1, C=0.1, kernel=rbf, score=0.631579 -   0.0s
[CV] gamma=0.1, C=0.1, kernel=rbf ....................................
[CV] ........... gamma=0.1, C=0.1, kernel=rbf, score=0.631579 -   0.0s
[CV] gamma=0.1, C=0.1, kernel=rbf ....................................
[CV] ........... gamma=0.1, C=0.1, kernel=rbf, score=0.636364 -   0.0s
[CV] gamma=0.01, C=0.1, kernel=rbf ...................................
[CV] .......... [...]<jupyter_text>Você pode inspecionar os melhores parâmetros encontrados pelo GridSearchCV no atributo best_params_ e o melhor estimador no melhor atributo \ _estimator_:<jupyter_code>grid.best_params_
grid.best_estimator_<jupyter_output><empty_output><jupyter_text>Então você pode re-executar previsões neste objeto da grade exatamente como você faria com um modelo normal.<jupyter_code>grid_predictions = grid.predict(X_test)
print(confusion_matrix(y_test,grid_predictions))
print(classification_report(y_test,grid_predictions))<jupyter_output>precision    recall  f1-score   support

          0       0.95      0.91      0.93        66
          1       0.94      0.97      0.96       105

avg / total       0.95      0.95      0.95       171
{'fraction_non_alphanumeric': 0.13078595837216528, 'fraction_numerical': 0.033550792171481825, 'mean_word_length': 3.8632930513595167, 'pattern_counts': {'":': 0, '<': 54, '<?xml version=': 0, '>': 54, 'https://': 0, 'lorem ipsum': 0, 'www.': 0, 'xml': 0}, 'pii_count': 0, 'substrings_counts': 0, 'word_list_counts': {'cursed_substrings.json': 4, 'profanity_word_list.json': 0, 'sexual_word_list.json': 0, 'zh_pornsignals.json': 0}}
{'chain_length': '14', 'dir': 'jupyter-structured-clean-dedup', 'id': '364314', 'license': 'BSD-2-Clause', 'n_tokens_mistral': 2316, 'n_tokens_neox': 2197, 'n_words': 634, 'path': 'coursera/Python-Data-Science-and-Machine-Learning-Bootcamp/5. Machine Learning/Support-Vector-Machines/Support Vector Machines com Python.ipynb', 'repo_name': 'kenjiyamamoto/data-scientist', 'size': '6438'}