Fundamentos do Machine Learning com Python
Revisão de Fundamentos de Python para ML (Variáveis, Estruturas, Funções)
Aprenda sobre revisão de fundamentos de python para ml (variáveis, estruturas, funções)
Revisão de Fundamentos de Python para ML (Variáveis, Estruturas, Funções)
Olá, futuro especialista em Machine Learning! 👋 Nesta aula, faremos uma revisão essencial dos fundamentos de Python que são a espinha dorsal de qualquer projeto de ML. Mesmo que você já tenha alguma experiência com Python, é crucial solidificar esses conceitos, pois eles são a base para manipulação de dados, construção de modelos e implementação de algoritmos complexos.
Vamos mergulhar nos blocos de construção que nos permitirão trabalhar de forma eficiente com bibliotecas como NumPy, Pandas e Scikit-learn.
1. Variáveis e Tipos de Dados Essenciais 🔢🔤
Em Python, variáveis são nomes que usamos para armazenar valores. O Python é uma linguagem de tipagem dinâmica, o que significa que você não precisa declarar explicitamente o tipo de uma variável; ele é inferido automaticamente.
1.1. Atribuição e Tipos Básicos
Os tipos de dados mais comuns que você encontrará no ML incluem:
- Inteiros (
int): Números inteiros, positivos ou negativos. - Ponto Flutuante (
float): Números com casas decimais. - Strings (
str): Sequências de caracteres, usadas para texto. - Booleanos (
bool): Representam valores de verdade (TrueouFalse).
Exemplo:
# Variáveis e Tipos de Dados
idade = 30 # int
altura = 1.75 # float
nome = "Alice" # str
eh_estudante = True # bool
print(f"Nome: {nome}, Idade: {idade}, Altura: {altura}, Estudante: {eh_estudante}")
print(f"Tipo de idade: {type(idade)}")
print(f"Tipo de altura: {type(altura)}")1.2. Conversão de Tipos (Type Casting)
Muitas vezes, você precisará converter dados de um tipo para outro, especialmente ao ler dados de arquivos ou interfaces.
Exemplo:
# Conversão de Tipos
numero_str = "123"
numero_int = int(numero_str)
print(f"String para Int: {numero_int} (Tipo: {type(numero_int)})")
preco_str = "99.99"
preco_float = float(preco_str)
print(f"String para Float: {preco_float} (Tipo: {type(preco_float)})")
valor_booleano = bool(0) # 0 é False, qualquer outro número é True
print(f"Int para Bool: {valor_booleano} (Tipo: {type(valor_booleano)})")2. Estruturas de Dados Fundamentais 📦
Python oferece estruturas de dados poderosas que são cruciais para organizar e manipular conjuntos de dados em ML.
2.1. Listas (list)
Listas são coleções ordenadas e mutáveis de itens. Podem conter itens de diferentes tipos de dados. São frequentemente usadas para representar sequências de dados, como vetores ou séries temporais.
Exemplo:
# Criação de Lista
dados_sensores = [23.5, 24.1, 23.9, 25.0, 24.8]
nomes_usuarios = ["Maria", "João", "Ana"]
# Acesso a elementos (indexação começa em 0)
print(f"Primeiro dado do sensor: {dados_sensores[0]}")
print(f"Último nome de usuário: {nomes_usuarios[-1]}")
# Fatiamento (Slicing)
print(f"Dados do sensor do segundo ao quarto: {dados_sensores[1:4]}")
# Modificação (mutabilidade)
dados_sensores.append(25.5) # Adiciona no final
dados_sensores[0] = 23.0 # Altera um elemento
print(f"Lista de sensores modificada: {dados_sensores}")
# Comprimento da lista
print(f"Número de leituras: {len(dados_sensores)}")2.2. Tuplas (tuple)
Tuplas são coleções ordenadas e imutáveis de itens. Uma vez criadas, seus elementos não podem ser alterados. São úteis para dados que não devem mudar, como coordenadas ou retornos múltiplos de funções.
Exemplo:
# Criação de Tupla
coordenadas = (10.5, 20.3)
cores_rgb = ("vermelho", "verde", "azul")
# Acesso a elementos
print(f"Coordenada X: {coordenadas[0]}")
# Tentativa de modificação (resulta em erro)
# coordenadas[0] = 11.0 # Isso geraria um TypeError
# Desempacotamento de tuplas
lat, lon = coordenadas
print(f"Latitude: {lat}, Longitude: {lon}")2.3. Dicionários (dict)
Dicionários são coleções de pares chave-valor, não ordenadas (a partir do Python 3.7, a ordem de inserção é mantida, mas não é garantida para todas as operações). São ideais para representar dados estruturados, como características de um objeto ou parâmetros de um modelo.
Exemplo:
# Criação de Dicionário
usuario_perfil = {
"nome": "Carlos",
"idade": 28,
"cidade": "São Paulo",
"interesses": ["ML", "Data Science", "Python"]
}
# Acesso a valores pela chave
print(f"Nome do usuário: {usuario_perfil['nome']}")
print(f"Interesses: {usuario_perfil.get('interesses')}") # Método .get() evita KeyError se a chave não existir
# Adicionar ou modificar pares chave-valor
usuario_perfil["profissao"] = "Engenheiro de Dados"
usuario_perfil["idade"] = 29
print(f"Perfil atualizado: {usuario_perfil}")
# Iterar sobre chaves, valores ou itens
print("\nChaves:")
for chave in usuario_perfil.keys():
print(chave)
print("\nValores:")
for valor in usuario_perfil.values():
print(valor)2.4. Conjuntos (set)
Conjuntos são coleções não ordenadas de itens únicos. São úteis para remover duplicatas de uma lista ou para realizar operações de conjunto como união, interseção e diferença.
Exemplo:
# Criação de Conjunto
numeros_duplicados = [1, 2, 2, 3, 4, 4, 5]
numeros_unicos = set(numeros_duplicados)
print(f"Números únicos: {numeros_unicos}")
# Adicionar elemento
numeros_unicos.add(6)
print(f"Conjunto com novo elemento: {numeros_unicos}")
# Operações de conjunto
set_a = {1, 2, 3, 4}
set_b = {3, 4, 5, 6}
print(f"União: {set_a.union(set_b)}") # {1, 2, 3, 4, 5, 6}
print(f"Interseção: {set_a.intersection(set_b)}") # {3, 4}
print(f"Diferença (A - B): {set_a.difference(set_b)}") # {1, 2}3. Estruturas de Controle de Fluxo 🚦
Estruturas de controle permitem que seu código tome decisões e execute ações repetidamente, o que é fundamental para lógica de pré-processamento de dados e treinamento de modelos.
3.1. Condicionais (if, elif, else)
Usadas para executar blocos de código diferentes com base em condições.
Exemplo:
# Condicionais
temperatura = 28.5
if temperatura > 30:
print("Está muito quente! ☀️")
elif temperatura > 25:
print("Temperatura agradável. 😎")
else:
print("Está fresco. ❄️")
# Operadores lógicos: and, or, not
idade = 18
tem_carteira = True
if idade >= 18 and tem_carteira:
print("Pode dirigir. 🚗")
else:
print("Não pode dirigir. 🚶")3.2. Loops (for, while)
Usados para iterar sobre sequências (listas, tuplas, strings) ou para repetir um bloco de código enquanto uma condição for verdadeira.
Exemplo:
# Loop 'for'
lista_notas = [8.5, 7.0, 9.2, 6.8]
soma_notas = 0
print("Iterando sobre as notas:")
for nota in lista_notas:
print(f"Nota: {nota}")
soma_notas += nota
print(f"Soma total das notas: {soma_notas}")
# Loop 'for' com range (útil para iterar um número fixo de vezes)
print("\nContagem regressiva:")
for i in range(5, 0, -1): # Começa em 5, vai até 1 (exclusivo), decrementa de 1
print(i)
# Loop 'while'
contador = 0
print("\nContando até 3:")
while contador < 3:
print(f"Contador: {contador}")
contador += 1 # Importante para evitar loop infinito!4. Funções 🛠️
Funções são blocos de código reutilizáveis que executam uma tarefa específica. Elas promovem modularidade, legibilidade e evitam a repetição de código (DRY - Don't Repeat Yourself).
Exemplo:
# Definição de uma função simples
def saudar(nome):
"""Esta função saúda uma pessoa."""
return f"Olá, {nome}! Bem-vindo(a) ao ML."
# Chamada da função
mensagem = saudar("Alice")
print(mensagem)
# Função com múltiplos parâmetros e valor padrão
def calcular_media(valores, casas_decimais=2):
"""Calcula a média de uma lista de valores."""
if not valores: # Verifica se a lista não está vazia
return 0.0
soma = sum(valores)
media = soma / len(valores)
return round(media, casas_decimais)
notas = [7.5, 8.0, 9.0, 6.5]
media_alunos = calcular_media(notas)
print(f"Média das notas: {media_alunos}")
media_arredondada = calcular_media(notas, casas_decimais=1)
print(f"Média arredondada para 1 casa decimal: {media_arredondada}")
# Funções Lambda (funções anônimas de uma linha)
# Úteis para operações rápidas e passadas como argumentos para outras funções
multiplicar = lambda x, y: x * y
print(f"5 * 3 = {multiplicar(5, 3)}")
# Exemplo de uso com map()
numeros = [1, 2, 3, 4]
quadrados = list(map(lambda x: x**2, numeros))
print(f"Quadrados dos números: {quadrados}")5. Integração dos Fundamentos para ML 🧩
Em Machine Learning, você constantemente combinará variáveis, estruturas de dados, controle de fluxo e funções para processar e analisar dados. Não há uma "integração de tecnologias" no sentido de Express + Better-Auth aqui, pois estamos focando nos fundamentos de Python. No entanto, podemos ver como esses conceitos se unem em um cenário prático de pré-processamento de dados.
Vamos criar uma função que simula a limpeza e sumarização de dados de sensores, combinando tudo o que vimos.
Exemplo: Processamento Básico de Dados de Sensores
Imagine que você tem uma lista de leituras de sensores, algumas corretas, outras com erros (strings onde deveriam ser números) ou valores ausentes.
def processar_leituras_sensores(leituras_brutas):
"""
Processa uma lista de leituras de sensores, filtrando valores inválidos,
convertendo tipos e calculando estatísticas básicas.
Args:
leituras_brutas (list): Uma lista de leituras, podendo conter ints, floats ou strs.
Returns:
dict: Um dicionário contendo leituras válidas e estatísticas.
"""
leituras_validas = []
valores_invalidos = 0
# 1. Iterar sobre as leituras (Loop 'for')
for leitura in leituras_brutas:
# 2. Verificar o tipo e converter (Condicionais 'if/elif/else', Conversão de Tipo)
if isinstance(leitura, (int, float)):
leituras_validas.append(leitura)
elif isinstance(leitura, str):
try:
# Tentar converter string para float
valor_convertido = float(leitura)
leituras_validas.append(valor_convertido)
except ValueError:
# Se a conversão falhar, é um valor inválido
valores_invalidos += 1
else:
valores_invalidos += 1
# 3. Calcular estatísticas (Variáveis, Funções Built-in)
if leituras_validas:
media = sum(leituras_validas) / len(leituras_validas)
max_valor = max(leituras_validas)
min_valor = min(leituras_validas)
else:
media = 0.0
max_valor = None
min_valor = None
# 4. Retornar resultados em um Dicionário
resultado = {
"leituras_processadas": leituras_validas,
"media": round(media, 2),
"maximo": max_valor,
"minimo": min_valor,
"total_invalidos": valores_invalidos
}
return resultado
# Dados de exemplo
dados_sensores_brutos = [22.5, "23.1", 24.0, "erro", 21.9, None, 25.5, "22.8"]
# Processar os dados usando a função
relatorio = processar_leituras_sensores(dados_sensores_brutos)
# Imprimir o relatório (Dicionário)
print("--- Relatório de Leituras de Sensores ---")
for chave, valor in relatorio.items():
print(f"{chave.replace('_', ' ').title()}: {valor}")
print(f"\nLeituras processadas para análise: {relatorio['leituras_processadas']}")Neste exemplo, você pode ver como:
- Variáveis armazenam os dados (
leituras_brutas,leituras_validas,media, etc.). - Listas (
leituras_brutas,leituras_validas) são usadas para armazenar coleções de dados. - Dicionários (
resultado) são usados para retornar dados estruturados (estatísticas). - Loops
foriteram sobre cada leitura. - Condicionais
if/elif/elseetry-exceptlidam com diferentes tipos de dados e erros. - Funções (
processar_leituras_sensores) encapsulam a lógica de pré-processamento para reutilização.
6. Desafios de Revisão 🧠
Para solidificar seu aprendizado, tente resolver estes pequenos desafios:
-
Filtrar e Somar Pares:
- Crie uma lista de números inteiros.
- Escreva um
loop forque itere sobre essa lista. - Dentro do loop, use uma condicional
ifpara verificar se o número é par. - Se for par, adicione-o a uma nova lista de "números pares".
- Ao final, imprima a soma de todos os números pares.
-
Contar Caracteres Únicos:
- Escreva uma função que receba uma string como entrada.
- A função deve retornar o número de caracteres únicos (ignorando maiúsculas/minúsculas e espaços) nessa string.
- Dica: Use
set()para ajudar!
-
Dicionário de Frequência:
- Dada a lista
frutas = ["maça", "banana", "maça", "laranja", "banana", "maça"]. - Crie um dicionário onde as chaves são os nomes das frutas e os valores são a frequência de cada fruta na lista.
- Imprima o dicionário resultante.
- Dada a lista
7. Resumo e Próximos Passos 🚀
Nesta aula, revisamos os pilares do Python:
- Variáveis e Tipos de Dados: Como armazenar e manipular diferentes tipos de informação.
- Estruturas de Dados: Listas, Tuplas, Dicionários e Conjuntos para organizar seus dados.
- Controle de Fluxo:
if/elif/elsepara decisões efor/whilepara repetições. - Funções: Para modularizar e reutilizar seu código.
- Integração: Vimos como esses conceitos se combinam em um exemplo prático de pré-processamento de dados, fundamental para ML.
Dominar esses fundamentos é crucial. Eles são os blocos de construção para tudo o que faremos a seguir, desde a manipulação de arrays com NumPy até a construção de modelos complexos.
Próximos Passos:
Na próxima aula, mergulharemos em bibliotecas essenciais para Machine Learning em Python, começando pelo NumPy, a base para computação numérica de alto desempenho. Prepare-se para trabalhar com arrays e operações vetoriais!