Boas-vindas a mais um curso da Alura. Meu nome é Allan Spadini e vou acompanhar você nesse curso de classificação e seleção de features.
Audiodescrição: Allan é um homem branco, tem cabelos e olhos castanho-escuros. Cabelos curtos. Está em um cenário que ao fundo tem algumas luzes de cor roxa e ciano, do lado esquerdo há um vaso com planta e do direito uma estante com livros e objetos diversos.
Dentro deste curso, trabalharemos com o problema de classificação. Mais especificamente, o problema de classificação de reservas de hotéis. Queremos saber se nossos clientes vão manter ou cancelar uma reserva de hotel.
No contexto deste problema, o que vamos tentar analisar são as colunas do nosso conjunto de dados, as features. Desta forma, vamos tentar identificar e estudar formas de análise e automação da seleção das melhores features, ou seja, das melhores colunas para o nosso conjunto de dados.
Vamos avaliar quais colunas são redundantes e quais realmente contribuem para a classificação e para o ajuste do nosso modelo de machine learning .
Para acompanhar este curso, você já deve conhecer bem os problemas de classificação em machine learning.
Espero você nas próximas aulas!
Vamos começar tentando entender o problema.
Imagine que uma empresa do setor hoteleiro coletou uma série de informações dos clientes. A ideia é manter o máximo de reservas possível. Sendo assim, vamos avaliar e tentar ajustar o modelo de Machine Learning para identificar quais clientes vão manter ou cancelar sua reserva. Dessa forma, podemos realizar, por exemplo, uma ação nos clientes que possivelmente vão cancelar a reserva.
Vamos iniciar abrindo o dataset. Já estou com o Google Colab aberto e vou abrir o dataset para tentarmos identificar as tarefas necessárias para aplicar o modelo de Machine Learning e ajustá-lo.
O dataset está no GitHub. Vamos pegar o dataset de hotéis, pegar o arquivo raw (arquivo bruto) de hotel.csv
e atribuí-lo à uma URL.
Vou colar a URL e atribuí-la à uma variável de nome URL
.
url = 'https://raw.githubusercontent.com/allanspadini/dados-com-muitas-dimensoes/main/dados/hotel.csv'
Com isso feito, vamos começar a utilizar a biblioteca pandas, como de costume. Vou importar o pandas com o comando import pandas as pd
e, em uma nova célula, vamos criar nosso dataframe df
. O dataframe será criado com o comando df = pd.read_csv(url)
.
import pandas as pd
df = pd.read_csv(url)
Ao executar o comando "Shift + Enter" teremos o nosso df
.
Agora, vou aproveitar uma nova funcionalidade do Google Colab para visualizar esse dataframe e algumas informações dele. Por isso, não farei o df.head
. Vou passar o df
completo e pressionar "Shift + Enter".
Dessa forma vamos dar uma olhada geral no dataset, apresentando as primeiras e as últimas linhas do dataset. Observamos que temos uma série de informações sobre a reserva vinculada aos clientes do hotel, como número de adultos, número de crianças, números de finais de semana, dias e noites de finais de semana que as pessoas vão passar.
No final do dataset temos nossa informação de interesse, a coluna booking_status
. Isso especifica o status da reserva, basicamente, que pode ser 0 ou 1. Indicando se a pessoa manteve ou não a reserva depois de um tempo.
A nova funcionalidade do Google Colab que quer utilizar agora é a geração automática de gráficos. Para isso, vamos clicar no ícone de gráfico localizado à direita. Isso permitirá obter uma ideia geral do dataset.
Com a geração automática de gráficos, podemos analisar algumas features e ter uma ideia de quais informações podem ser importantes para nossa análise.
Através dos gráficos sugeridos pelo Colab, temos uma ideia de que, o número de adultos em um quarto de hotel é em torno de 2 e o número de crianças, na maior parte dos casos, é próximo de 0. Dessa forma, conseguimos ter uma ideia de quais informações são mais relevantes.
Centrando nossa atenção em ajustar o modelo de Machine Learning, um dos passos principais é verificar se existem dados nulos no dataset.
Uma das formas de fazer isso é usando o método isnull()
. Ao fazer df.isnull().sum().sum()
, conseguimos verificar se existem valores nulos no dataset.
df.isnull().sum().sum()
0
Vamos verificar se a soma dá algum valor. Se der algum valor diferente de zero, significa que temos pelo menos um valor nulo. No nosso caso, não temos nenhum valor nulo.
Outra informação que podemos avaliar é o tipo de dados em cada coluna, utilizado o método info()
. Ao executar df.info()
, avaliamos cada uma das colunas e o tipo dos dados.
df.info()
<class 'pandas.core.frame.DataFrame'>
RangeIndex: 34146 entries, 0 to 34145
Data columns (total 31 columns):
# Column Non-Null Count Dtype
--- ------ -------------- -----
0 no_of_adults 34146 non-null int64
1 no_of_children 34146 non-null int64
2 no_of_weekend_nights 34146 non-null int64
3 no_of_week_nights 34146 non-null int64
4 required_car_parking_space 34146 non-null int64
5 lead_time 34146 non-null int64
6 arrival_year 34146 non-null int64
7 arrival_month 34146 non-null int64
8 arrival_date 34146 non-null int64
9 repeated_guest 34146 non-null int64
10 no_of_previous_cancellations 34146 non-null int64
11 no_of_previous_bookings_not_canceled 34146 non-null int64
12 avg_price_per_room 34146 non-null float64
13 no_of_special_requests 34146 non-null int64
14 type_of_meal_plan_Meal Plan 1 34146 non-null int64
15 type_of_meal_plan_Meal Plan 2 34146 non-null int64
16 type_of_meal_plan_Meal Plan 3 34146 non-null int64
17 type_of_meal_plan_Not Selected 34146 non-null int64
18 room_type_reserved_Room_Type 1 34146 non-null int64
19 room_type_reserved_Room_Type 2 34146 non-null int64
20 room_type_reserved_Room_Type 3 34146 non-null int64
21 room_type_reserved_Room_Type 4 34146 non-null int64
22 room_type_reserved_Room_Type 5 34146 non-null int64
23 room_type_reserved_Room_Type 6 34146 non-null int64
24 room_type_reserved_Room_Type 7 34146 non-null int64
25 market_segment_type_Aviation 34146 non-null int64
26 market_segment_type_Complementary 34146 non-null int64
27 market_segment_type_Corporate 34146 non-null int64
28 market_segment_type_Offline 34146 non-null int64
29 market_segment_type_Online 34146 non-null int64
30 booking_status 34146 non-null int64
dtypes: float64(1), int64(30)
memory usage: 8.1 MB
Na maioria dos casos, temos valores inteiros. Contudo, temos uma coluna específica que possui um valor contínuo relacionado ao preço dos quartos de hotel, que é do tipo float.
Um outro ponto que podemos notar é que temos várias colunas com nomes similares, como room_type4
, room_type5
e room_type6
. Essas são variáveis dummy, onde foram identificadas algumas features através do uso do get_dummies()
. Então, em vez de termos valores em texto, na coluna room_type4
temos valor 1 quando a reserva é do tipo 4 e 0 caso contrário. As outras colunas repetem o mesmo padrão, mas o valor 1 aparece quando a reserva é do tipo 5 na coluna room_type5
ou 6 na room_type6
. Esse é um detalhe que acho importante observar no nosso dataset.
Concluída a primeira análise geral do dataset, podemos partir para o Machine Learning para tentar ver como será a execução geral e como o Machine Learning está funcionando com esse dataset, sem nenhuma avaliação adicional.
Nos encontraremos no próximo vídeo, onde trabalharemos nessa próxima etapa.
No vídeo anterior, analisamos o dataset. Verificamos se ele continha valores nulos, se era apropriado para a aplicação do Machine Learning.
Neste vídeo, nossa missão vai ser justamente aplicar o Machine Learning, ajustar o modelo de classificação a esse dataset, sem utilizar nenhum parâmetro específico, apenas verificando a performance do modelo de Machine Learning no dataset, da forma que ele está.
Primeiramente, vou separar os nossos dados entre as features, ou seja, as colunas do nosso dataset que contêm as informações dos clientes, e a coluna alvo, que contém a informação se a pessoa cliente cancelou ou não a reserva no hotel.
Vou criar uma variável de nome X
, que será igual ao df.drop
. Nele, vou excluir booking_status
, ou seja, x
será igual ao df.drop(booking_status, 1)
. Neste caso, eliminei a coluna booking_status
, que é a nossa coluna alvo, e mantive apenas as colunas de informações dos clientes.
X = df.drop(['booking_status'],axis=1)
Agora, vou criar a variável y
, que é a nossa coluna alvo. Para isso, passarei ao df[booking_status]
.
y = df['booking_status']
Temos o nosso dataset separado em X
e y
, e podemos ajustar o modelo de Machine Learning. Para isso, ainda vou dividir o dataset em dados de treino e dados de teste.
Vou fazer a importação do train_test_split
para fazer essa divisão, então será from sklearn.model_selection import train_test_split
.
from sklearn.model_selection import train_test_split
Agora vou criar X_treino
, X_teste
, y_treino
e y_teste
. Podemos invocar o train_test_split
, que vai receber o X
, y
e random_state = 50
. Vou passar também o test_size = 0.3
e o stratify = y
.
X_treino,X_teste, y_treino, y_teste = train_test_split(X,y, random_state=50, test_size=0.3,stratify=y)
Utilizamos o random_state = 50
para que essa reprodução dessa divisão seja possível, e dividimos os dados sendo 30% para teste e os outros 70% para treino. Utilizamos o stratify
para manter a mesma proporção dos dados de uma classe, tanto nos dados de treino quanto nos dados de teste.
Feita a divisão, o próximo passo é ajustar o modelo de Machine Learning. Para isso, preciso importar o modelo de Machine Learning que vamos usar:
from sklearn.ensemble import RandomForestClassifier
Agora precisamos instanciar o modelo, então o modelo será igual ao RandomForestClassifier(random_state=2)
. O random_state = 2
é utilizado porque o Random Forest também tem uma questão de aleatoriedade nele.
modelo = RandomForestClassifier(random_state=2)
Depois disso, podemos fazer o ajuste do modelo de Machine Learning:
modelo.fit(X_treino,y_treino)
Com o ajuste do modelo de Machine Learning feito, podemos verificar a qualidade do nosso ajuste nos dados de teste. Para isso, faremos:
modelo.score(X_teste,y_teste)
0.920636470128856
Tivemos um valor alto, isso quer dizer que ele está acertando cerca de 92% das vezes na classificação se a pessoa cliente vai manter a reserva ou não.
No entanto, precisamos verificar se os nossos dados estão com uma divisão proporcional, se estão balanceados.
Para isso, faremos df[booking_status].value_counts()
.
df['booking_status'].value_counts()
0 17073 1 17073 Name: booking_status, dtype: float64
Como retorno do value_counts
, temos que para a classe 0
temos 17.073 linhas de exemplo, e para a classe 1
temos 17.073 linhas de exemplo.
Os nossos dados estão balanceados, se não estivessem, se tivéssemos, por exemplo, 90% dos dados para a classe 0
, este resultado não seria muito diferente de apenas chutar na classe mais presente do dataset. No nosso caso, temos uma divisão de 50% para uma classe e 50% para outra classe. Assim, este é, aparentemente, um bom resultado de classificação para esses dados, para essa divisão em treino e teste.
Mas, será que se utilizarmos menos colunas, ou se trabalharmos um pouco nas nossas colunas do dataset, conseguiremos fazer melhor?
Veremos isso na próxima aula, onde vamos começar a analisar com mais detalhe os nossos parâmetros, as features do nosso problema. Até a próxima aula!
O curso Classificação: selecionando features possui 97 minutos de vídeos, em um total de 36 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.