Olá, boas-vindas a este curso de classificação em Machine Learning da Alura. Sou Allan Spadini e serei o instrutor neste curso.
Audiodescrição: Allan se identifica como um homem branco. Tem cabelos e olhos castanhos. Usa uma camiseta preta. Ao fundo, estúdio da Alura com iluminação azul e estante com decorações à direita.
Neste curso, trabalharemos com um dataset de classificação da satisfação de passageiros.
Nosso objetivo será obter um bom score de resultado de classificação, mas não apenas um bom score, e sim o melhor resultado possível de classificação no modelo de Machine Learning.
Para isso, estudaremos a combinação de diferentes modelos de classificação e seus resultados.
Ao final deste curso, você será capaz de realizar essa combinação e obter o melhor resultado possível em aplicações de classificação de Machine Learning.
O pré-requisito para acompanhar este curso é que você consiga já aplicar modelos de classificação em Machine Learning.
Esperamos te encontrar nos próximos vídeos deste curso. Até lá!
Olá! Vamos começar a estudar esse problema. Imagina que você trabalha em uma empresa de linhas aéreas e a empresa coletou uma série de informações sobre os voos e a satisfação da clientela nesses voos.
Assim, a tarefa que nos foi dada é pegar esse dataset e construir um modelo de Machine Learning (Aprendizado de Máquina). No entanto, não conhecemos o dataset e nem sabemos qual modelo de Machine Learning seria ideal para aplicar nesse problema.
Neste vídeo, vamos iniciar carregando esse dataset e tentando entender o que precisamos fazer com ele e como ficam os primeiros resultados de Machine Learning em cima desse dataset.
Vamos disponibilizar os resultados e o dataset através de um repositório do GitHub.
Em um caderno do Google Colab, já temos o link do dataset em duas URLs diferentes. Fizemos a divisão em um dataset de treino e outro de teste.
url1 = 'https://raw.githubusercontent.com/alura-cursos/combina-classificadores/main/dados/train.csv'
url2 = 'https://raw.githubusercontent.com/alura-cursos/combina-classificadores/main/dados/test.csv'
Vamos apertar "Shift + Enter" para executar a célula com o endereço das URLs. Em seguida, vamos importar a biblioteca pandas
para poder ler os arquivos.
Vamos fazer o import pandas as pd
. Depois, vamos criar a variável treino
igual a pd.read_csv()
, passando a url1
que é o endereço onde colocamos nosso primeiro dataset.
Assim, teremos os dados de treino na variável treino
.
Para os dados de teste faremos o mesmo, criando a variável teste
igual a pd.read_csv(url2)
.
import pandas as pd
treino = pd.read_csv(url1)
teste = pd.read_csv(url2)
Vamos conferir os dados de treino para ter uma ideia geral desse dataset. Para isso, vamos fazer o treino.head()
.
treino.head()
# | Unnamed: 0 | id | Gender | Customer Type | Age | Type of Travel | Class | Flight Distance | Inflight wifi service | Departure/Arrival time convenient | … | Inflight entertainment | On-board service | Leg room service | Baggage handling | Checkin service | Inflight service | Cleanliness | Departure Delay in Minutes | Arrival Delay in Minutes | satisfaction |
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
0 | 0 | 70172 | Male | Loyal Customer | 13 | Personal Travel | Eco Plus | 460 | 3 | 4 | … | 5 | 4 | 3 | 4 | 4 | 5 | 5 | 25 | 18.0 | neutral or dissatisfied |
1 | 1 | 5047 | Male | disloyal Customer | 25 | Business travel | Business | 235 | 3 | 2 | … | 1 | 1 | 5 | 3 | 1 | 4 | 1 | 1 | 6.0 | neutral or dissatisfied |
2 | 2 | 110028 | Female | Loyal Customer | 26 | Business travel | Business | 1142 | 2 | 2 | … | 5 | 4 | 3 | 4 | 4 | 4 | 5 | 0 | 0.0 | satisfied |
3 | 3 | 24026 | Female | Loyal Customer | 25 | Business travel | Business | 562 | 2 | 5 | … | 2 | 2 | 5 | 3 | 1 | 4 | 2 | 11 | 9.0 | neutral or dissatisfied |
4 | 4 | 119299 | Male | Loyal Customer | 61 | Business travel | Business | 214 | 3 | 3 | … | 3 | 3 | 4 | 4 | 3 | 3 | 3 | 0 | 0.0 | satisfied |
Estamos exibindo as primeiras cinco linhas desse dataset e temos algumas colunas que talvez tenham que ser removidas, como a unnamed
e id
, que não são utilizadas no Machine Learning.
Também temos uma série de informações sobre as pessoas passageiras, algumas informações categóricas e outras informações numéricas contínuas.
Por exemplo, o gênero das pessoas, o tipo de consumidor e se a pessoa pegou o voo em uma classe específica.
A última coluna, chamada satisfaction
, é a satisfação das pessoas passageiras. Temos dois tipos de satisfação de passageiros, ou seja, estamos trabalhando com o problema de classificação binária: a pessoa gostou ou a pessoa não gostou do voo.
O que precisamos fazer de pré-processamento nesses dados para conseguir trabalhar com o Machine Learning?
Vamos tentar visualizar em maior detalhe as informações desse dataset. Para isso, vamos fazer o treino.info()
.
treino.info()
<class 'pandas.core.frame.DataFrame'>
RangeIndex: 103904 entries, 0 to 103903
Data columns (total 25 columns):
# | Column | Non-Null Count | Dtype |
---|---|---|---|
0 | Unnamed: 0 | 103904 non-null | int64 |
1 | id | 103904 non-null | int64 |
2 | Gender | 103904 non-null | object |
3 | Customer Type | 103904 non-null | object |
4 | Age | 103904 non-null | int64 |
5 | Type of Travel | 103904 non-null | object |
6 | Class | 103904 non-null | object |
7 | Flight Distance | 103904 non-null | int64 |
8 | Inflight wifi service | 103904 non-null | int64 |
9 | Departure/Arrival time convenient | 103904 non-null | int64 |
10 | Ease of Online booking | 103904 non-null | int64 |
11 | Gate location | 103904 non-null | int64 |
12 | Food and drink | 103904 non-null | int64 |
13 | Online boarding | 103904 non-null | int64 |
14 | Seat comfort | 103904 non-null | int64 |
15 | Inflight entertainment | 103904 non-null | int64 |
16 | On-board service | 103904 non-null | int64 |
17 | Leg room service | 103904 non-null | int64 |
18 | Baggage handling | 103904 non-null | int64 |
19 | Checkin service | 103904 non-null | int64 |
20 | Inflight service | 103904 non-null | int64 |
21 | Cleanliness | 103904 non-null | int64 |
22 | Departure Delay in Minutes | 103904 non-null | int64 |
23 | Arrival Delay in Minutes | 103594 non-null | float64 |
24 | satisfaction | 103904 non-null | object |
dtypes: float64(1), int64(19), object(5)
Agora conseguimos verificar em maior detalhe que temos informações do tipo inteiro, float e object. Conseguimos perceber que temos valores do tipo não nulo em cada uma dessas colunas, ou seja, não temos valores nulos especificamente. Mas e valores do tipo None?
Se tentamos aplicar o modelo de Machine Learning com valores do tipo None
no dataset, não conseguiremos realizar nenhum tipo de operação. Por isso, precisamos remover esses dados do tipo NA ou None.
Para verificar se existem esses dados do tipo NA, podemos fazer o seguinte comando:
treino.isna().sum()
- | - |
---|---|
Unnamed: 0 | 0 |
id | 0 |
Gender | 0 |
Customer Type | 0 |
Age | 0 |
Type of Travel | 0 |
Class | 0 |
Flight Distance | 0 |
Inflight wifi service | 0 |
Departure/Arrival time convenient | 0 |
Ease of Online booking | 0 |
Gate location | 0 |
Food and drink | 0 |
Online boarding | 0 |
Seat comfort | 0 |
Inflight entertainment | 0 |
On-board service | 0 |
Leg room service | 0 |
Baggage handling | 0 |
Checkin service | 0 |
Inflight service | 0 |
Cleanliness | 0 |
Departure Delay in Minutes | 0 |
Arrival Delay in Minutes | 310 |
satisfaction | 0 |
Conseguimos notar que em nenhuma das linhas existem valores do tipo NA, pois somamos os valores e recebemos o resultado zero - exceto na coluna Arrival Delay in Minutes
. Nela, temos 310 valores do tipo NA.
Nesse caso, a ideia para a aplicação será remover as linhas que têm os valores do tipo NA.
Como a remoção deve ser feita tanto nos dados de treino e nos dados de teste, vamos criar uma função para fazer esse processo.
Em uma nova célula, vamos criar a função de nome def prepara()
. Essa função vai receber o DataFrame de nome df
.
Após os dois-pontos, queremos escrever todo o processamento que devemos fazer no dataset.
Primeiro, é necessário remover algumas colunas que já descobrimos que não são interessantes. Por isso, vamos fazer o df.drop()
. Entre colchetes, passamos as colunas Unnamed: 0
e id
, ambas entre aspas.
Fora dos colchetes, ainda no drop()
, passamos o parâmetro axis=1
para fazer o processamento nas colunas. Por fim, escrevemos inplace=True
.
Com isso, já removemos aquelas duas colunas que não eram interessantes no dataset.
Agora, vamos fazer o processo de remoção do NA, digitando df.dropna()
, passando inplace=True
.
def prepara(df):
df.drop(['Unnamed: 0', 'id'],axis=1,inplace=True)
df.dropna(inplace=True)
Também temos colunas categóricas no dataset. Além de remover os dados do tipo NA, precisamos transformar essas colunas categóricas em colunas numéricas.
Para resolver isso, podemos fazer o df
igual a pd.get_dummies()
. Como parâmetro, vamos passar o df
e columns
igual à variável colunas_categoricas
.
Precisaremos escrever quais são as nossas colunas categóricas. Na linha anterior, vamos digitar que colunas_categoricas
vai ser igual a, entre colchetes e aspas, Gender
, Customer Type
, Type of Travel
e Class
.
Terminamos o processo de pré-processamento, mas vamos aproveitar para colocar essas informações na variável X
e na variável y
. A variável X
são as nossas variáveis dependentes, e a y
, a nossa variável independente, o nosso objetivo de classificação.
Na última linha, colocamos que X
é igual a df.drop()
, passando a coluna satisfaction
entre aspas. Não queremos essa coluna, pois é a variável independente. Como segundo parâmetro, passamos axis=1
.
Já o y
será igual a df['satisfaction']
.
Por fim, vamos retornar esses valores, usando um return X, y
.
def prepara(df):
df.drop(['Unnamed: 0', 'id'],axis=1,inplace=True)
df.dropna(inplace=True)
colunas_categoricas = ["Gender", "Customer Type", "Type of Travel", "Class"]
df = pd.get_dummies(df, columns=colunas_categoricas)
X = df.drop('satisfaction', axis=1)
y = df['satisfaction']
return X,y
Vamos dar "Shift + Enter" para verificar se essa função vai funcionar corretamente. Em seguida, vamos criar um X_treino, y_treino
que vai ser igual a função prepara()
, passando o DataFrame de treino
.
A função deve funcionar tanto para os dados de treino, quanto para os dados de teste. Por isso, vamos copiar a linha do treino, e substituir onde está escrito treino
por teste
.
X_treino, y_treino = prepara(treino)
X_teste, y_teste = prepara(teste)
E, assim, fazemos todo o processamento nos dados de treino e teste também.
Podemos visualizar os dados de treino executando X_treino
:
X_treino
# | Age | Flight Distance | Inflight wifi service | Departure/Arrival time convenient | Ease of Online booking | Gate location | Food and drink | Online boarding | Seat comfort | … | Arrival Delay in Minutes | Gender_Female | Gender_Male | Customer Type_Loyal Customer | Customer Type_disloyal Customer | Type of Travel_Business travel | Type of Travel_Personal Travel | Class_Business | Class_Eco | Class_Eco Plus |
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
0 | 13 | 460 | 3 | 4 | 3 | 1 | 5 | 3 | 5 | … | 18.0 | 0 | 1 | 1 | 0 | 0 | 1 | 0 | 0 | 1 |
1 | 25 | 235 | 3 | 2 | 3 | 3 | 1 | 3 | 1 | … | 6.0 | 0 | 1 | 0 | 1 | 1 | 0 | 1 | 0 | 0 |
2 | 26 | 1142 | 2 | 2 | 2 | 2 | 5 | 5 | 5 | … | 0.0 | 1 | 0 | 1 | 0 | 1 | 0 | 1 | 0 | 0 |
… | … | … | … | … | … | … | … | … | … | … | … | … | … | … | … | … | … | … | … | … |
Após dar "Shift + Enter", percebemos que algumas colunas foram removidas e as informações categóricas foram transformadas em números - de acordo com o que precisamos para trabalhar com esses dados e aplicar o Machine Learning.
No próximo vídeo, vamos efetivamente aplicar o modelo de Machine Learning e verificar quais serão os resultados do nosso primeiro teste.
Até o próximo vídeo!
No último vídeo, realizamos o pré-processamento dos dados e entendemos o dataset dos passageiros. Agora, queremos efetivamente classificar e obter um resultado de classificação para esse dataset.
Para isso, vamos começar aplicando um modelo de classificação baseado nas árvores de decisão.
Neste vídeo, vamos aplicar o modelo de árvores de decisão. Portanto, vamos importar essa função da sklearn
.
Em uma nova célula do Colab, vamos escrever:
from sklearn.tree import DecisionTreeClassifier
Após executar com "Shift+Enter", vamos instanciar esse modelo. Para isso, vamos chamá-lo de modelo1
, que será igual ao DecisionTreeClassifier()
.
Entre os parênteses, podemos definir um random_state
para que os resultados possam ser replicados. Vamos colocar random_state
igual a 42.
modelo1 = DecisionTreeClassifier(random_state=42)
Na sequência, queremos aplicar o modelo de classificação.
Já temos os dados separados em treino e teste, mas vamos usar apenas os dados de treino para fazer uma validação cruzada. Assim, dentro do cross_validate
, ele vai fazer uma divisão em treino e validação.
Para conseguir aplicar o cross_validate
, vamos importá-lo na célula de cima também. Vamos escrever o seguinte:
from sklearn.model_selection import cross_validate
Agora, precisamos chamá-lo. Para isso, vamos criar uma variável de nome validacao
que vai ser igual a cross_validate()
, que vai receber o modelo1
, o X_treino
, o y_treino
e cv
igual a 5
.
validacao = cross_validate(modelo1, X_treino, y_treino, cv=5)
Agora, vamos dar um "Shift + Enter" e esperar um tempo para fazer esse processo de validação.
Após o processo de validação, podemos verificar os resultados de teste feitos internamente. Para isso, usamos a coluna validacao['teste_score']
.
validacao['test_score']
array([0.94164776, 0.94603987, 0.9450263, 0.94381968, 0.94521672])
Obtemos o resultado da validação com a validação cruzada. Ele fez 5 testes diferentes com divisões de treino e validação diferentes internamente. Por isso, temos 5 resultados.
Com isso, podemos calcular a média, por exemplo. acrescentando um .mean()
.
validacao['test_score'].mean()
0.9443500672495754
Desse modo, temos que um resultado médio de validação de 0.94 de taxa de acerto.
Além disso, podemos testar o resultado em cima dos dados de teste, que é um dataset que ele não analisou durante esse ajuste do modelo de classificação de árvores de decisão.
Podemos fazer o modelo1.predict(X_teste)
. Agora, vamos criar uma previsão de resultado. Criamos a variável y_pred
que será igual ao modelo1.predict()
.
y_pred = modelo1.predict(X_teste)
NotFittedError: This DecisionTreeClassifier instance is not fitted y 'fit' with appropriate arguments before using this estimator.
Um erro ocorre porque ele não tem o modelo1
ajustado aos dados. Mas, para resolver isso, basta treinar o modelo1
com os dados de treino.
Na célula anterior, vamos fazer o modelo1.fit()
, passando X_treino
e y_treino
.
modelo1.fit(X_treino,y_treino)
Agora sim, temos o nosso modelo treinado. Tínhamos feito apenas sua validação, agora treinamos no dataset completo de treino e agora conseguimos testá-lo nos dados de teste.
A seguir, vamos comparar o y_pred
com o y_teste
. Para fazer essa comparação, vamos importar o sklearn.metrics import accuracy_score
.
from sklearn.metrics import accuracy_score
Por fim, chamamos essa função accuracy_score()
e passamos o y_teste
e o y_pred
.
accuracy_score(y_teste,y_pred)
0.94612443517553
Nessa comparação, também temos algo em torno de 0.94 de score como resultado final.
Isso é um resultado de classificação muito bom. Mas testamos um modelo de aprendizado de máquina de forma arbitrária, ou seja, não testamos diversos modelos de machine learning.
Será que tem algum que funciona de forma diferente, funciona pior ou melhor que esse modelo de machine learning?
No próximo vídeo, vamos testar outro modelo de machine learning para ter um critério de comparação dos nossos resultados. Até o próximo vídeo!
O curso Classificação: combinando classificadores para a melhoria de performance possui 127 minutos de vídeos, em um total de 52 atividades. Gostou? Conheça nossos outros cursos de Machine Learning em Data Science, ou leia nossos artigos de Data Science.
Matricule-se e comece a estudar com a gente hoje! Conheça outros tópicos abordados durante o curso:
Impulsione a sua carreira com os melhores cursos e faça parte da maior comunidade tech.
1 ano de Alura
Assine o PLUS e garanta:
Formações com mais de 1500 cursos atualizados e novos lançamentos semanais, em Programação, Inteligência Artificial, Front-end, UX & Design, Data Science, Mobile, DevOps e Inovação & Gestão.
A cada curso ou formação concluído, um novo certificado para turbinar seu currículo e LinkedIn.
No Discord, você tem acesso a eventos exclusivos, grupos de estudos e mentorias com especialistas de diferentes áreas.
Faça parte da maior comunidade Dev do país e crie conexões com mais de 120 mil pessoas no Discord.
Acesso ilimitado ao catálogo de Imersões da Alura para praticar conhecimentos em diferentes áreas.
Explore um universo de possibilidades na palma da sua mão. Baixe as aulas para assistir offline, onde e quando quiser.
Acelere o seu aprendizado com a IA da Alura e prepare-se para o mercado internacional.
1 ano de Alura
Todos os benefícios do PLUS e mais vantagens exclusivas:
Luri é nossa inteligência artificial que tira dúvidas, dá exemplos práticos, corrige exercícios e ajuda a mergulhar ainda mais durante as aulas. Você pode conversar com a Luri até 100 mensagens por semana.
Aprenda um novo idioma e expanda seus horizontes profissionais. Cursos de Inglês, Espanhol e Inglês para Devs, 100% focado em tecnologia.
Transforme a sua jornada com benefícios exclusivos e evolua ainda mais na sua carreira.
1 ano de Alura
Todos os benefícios do PRO e mais vantagens exclusivas:
Mensagens ilimitadas para estudar com a Luri, a IA da Alura, disponível 24hs para tirar suas dúvidas, dar exemplos práticos, corrigir exercícios e impulsionar seus estudos.
Envie imagens para a Luri e ela te ajuda a solucionar problemas, identificar erros, esclarecer gráficos, analisar design e muito mais.
Escolha os ebooks da Casa do Código, a editora da Alura, que apoiarão a sua jornada de aprendizado para sempre.