Saltar navegación

Reto 8 : Clasificando

Tarefa 1: Cambiando o clasificador por pesos

Duración:
20 min
Agrupamento:
2

Recupera este programa da actividade de aprendizaxe 1 , realiza estos cambios e responde ás preguntas

Código Python: Clasificando e incorporando datos

# Importar as bibliotecas necesarias
from sklearn.tree import DecisionTreeClassifier
import matplotlib.pyplot as plt

# Datos iniciais: pesos e etiquetas
pesos = [[150], [170], [140], [130]]  # Pesos iniciais en gramos
etiquetas = [0, 0, 1, 1]  # 0 = mazá, 1 = laranxa

# Crear o modelo de árbore de decisión
modelo = DecisionTreeClassifier()
# Adestrar o modelo cos datos iniciais
modelo.fit(pesos, etiquetas)

# Función para actualizar o gráfico
def actualizar_grafico(pesos, etiquetas, peso_a_predecir):
    # Limpar o gráfico anterior
    plt.clf()

    # Debuxar puntos segundo a súa categoría (mazá: vermello, laranxa: laranxa)
    for i in range(len(pesos)):
        if etiquetas[i] == 0:
            plt.scatter(pesos[i], [0], color='red', label='Mazá' if i == 0 else "")
        else:
            plt.scatter(pesos[i], [0], color='orange', label='Laranxa' if i == 2 else "")

    # Debuxar o punto correspondente ao peso a predicir
    plt.scatter(peso_a_predecir, [0], color='blue', label='Peso a clasificar', edgecolors='black', s=100)

    # Etiquetas e lendas
    plt.title('Clasificación de froitas segundo o peso', fontsize=14)
    plt.xlabel('Peso (gramos)', fontsize=12)
    plt.yticks([])  # Eliminamos a escala vertical para centrarnos no peso
    plt.legend()
    plt.grid(True)

    # Mostrar o gráfico actualizado
    plt.draw()
    plt.pause(0.1)

# Activar o modo interactivo en matplotlib
plt.ion()

# Bucle para interacción co usuario
while True:
    try:
        # Solicitar ao usuario que introduza un peso a clasificar
        peso_a_predecir = float(input("Introduce un peso en gramos (ou escribe 'saír' para rematar): "))
        peso_a_predecir = [[peso_a_predecir]]

        # Realizar a predición
        resultado = modelo.predict(peso_a_predecir)

        # Mostrar o resultado
        if resultado == 0:
            print(f"O modelo predice que o peso {peso_a_predecir[0][0]} g clasifícase como: Mazá (0)")
        else:
            print(f"O modelo predice que o peso {peso_a_predecir[0][0]} g clasifícase como: Laranxa (1)")

        # Preguntar se o resultado foi correcto
        correcto = input("¿Acertou o modelo? (si/non): ").strip().lower()

        if correcto == "si":
            # Engadir o novo dato aos datos de adestramento
            pesos.append(peso_a_predecir[0])
            etiquetas.append(resultado[0])
        else:
            # Solicitar ao usuario a etiqueta correcta
            etiqueta_correcta = int(input("Por favor, introduce a etiqueta correcta (0 = mazá, 1 = laranxa): "))
            pesos.append(peso_a_predecir[0])
            etiquetas.append(etiqueta_correcta)

        # Reentrenar o modelo cos novos datos
        modelo.fit(pesos, etiquetas)

        # Actualizar o gráfico co novo peso
        actualizar_grafico(pesos, etiquetas, peso_a_predecir)

    except ValueError:
        print("Programa rematado. Ata logo!")
        break
    
    

Rúbrica de avaliación

Rúbrica Reto 8-Tarefa 1: Cambiando o clasificador por pesos
Criterio Excelente (9-10) Bo (7-8) Aceptable (5-6) Mellorable (3-4) Moi mellorable (0-2)
Engadir máis datos de adestramento Engade correctamente datos adicionais e comprende o efecto no modelo. Engade datos extra pero con análise limitada sobre o impacto. Modifica os datos pero sen mellorar significativamente o modelo. Engade datos incorrectamente ou sen propósito claro. Non engade máis datos ao adestramento.
Modificación da escala do gráfico Axusta correctamente os eixos para representar mellor os datos. Modificación realizada pero con pequenos problemas de interpretación. Cambia a escala pero con valores pouco adecuados. Erro na representación do gráfico. Non realiza a modificación.
Cambio de algoritmo a RandomForestClassifier Implementa correctamente Random Forest e comprende as diferenzas con DecisionTreeClassifier. Substitúe o algoritmo pero con análise limitada. Implementación realizada pero con erro na configuración. Erro ao modificar o algoritmo. Non realiza o cambio de modelo.
Engadir validación cruzada Implementa correctamente validación cruzada para avaliar o rendemento. Validación cruzada ben feita pero con análise limitada dos resultados. Validación realizada pero con problemas nos subconxuntos. Erro na validación dos datos. Non realiza validación cruzada.
Interpretación das preguntas Responde correctamente e de maneira fundamentada ás preguntas. Respostas claras pero con pouca profundidade na análise. Respostas dadas pero con dificultades na comprensión. Erro na interpretación das preguntas. Non responde ás preguntas.
Actitude ante os problemas Busca solucións e optimiza o modelo con criterio. Resolve os problemas con esforzo e consulta documentación. Resolve con dificultades pero sen explorar melloras. Resígnase ante os erros sen buscar alternativas. Non intenta resolver os problemas ou abandona o traballo.
Traballo colaborativo Comunicación eficaz e traballo equilibrado en parella. Traballo en equipo con pequenas dificultades. Interacción mínima, traballo case independente. Pouca colaboración, realízase gran parte do traballo de forma individual. Non colabora coa parella nin contribúe ao traballo conxunto.

Tarefa 2:Clasificando pelotas

Duración:
30 min
Agrupamento:
2
Pelota de tenis
Copilot. Pelota de tenis (CC BY-SA)
Balón de fútbol
Copilot. Balón de fútbol (CC BY-SA)

Agora vas a modificar o código para clasificar  balóns de fútbol e pelotas de tenis, según o seu diámetro. 

Estos poderían ser un exemplo dos datos iniciais:


# Datos iniciais: diámetros e etiquetas

diametros = [[22], [23], [24], [6.5], [6.8], [7]] # Diámetros en centímetros

etiquetas = [0, 0, 0, 1, 1, 1]                               # 0 = Balón de fútbol, 1 = Pelota de tenis

Fai que as cores dos puntos da gráfica sexan:Balón de fútbol ⇒verde , Pelota de tenis⇒azul e  o punto a predicir vermello

Rúbrica de avaliación

Rúbrica Reto 8-Tarefa 2: Clasificando pelotas
Criterio Excelente (9-10) Bo (7-8) Aceptable (5-6) Mellorable (3-4) Moi mellorable (0-2)
Definición correcta dos datos iniciais Os datos de diámetros e etiquetas están correctamente definidos. Os datos iniciais son axeitados pero con pequenas inconsistencias. Datos definidos pero con valores pouco representativos. Erro na selección dos datos. Non define os datos iniciais correctamente.
Configuración do modelo de árbore de decisión Crea e adestra correctamente o modelo para a clasificación. Modelo creado e adestrado pero con pequenos erros na configuración. Modelo implementado pero con dificultades na clasificación. Erro na creación ou adestramento do modelo. Non realiza esta configuración.
Representación gráfica dos datos Os datos están correctamente representados con cores adecuadas. Gráfico ben feito pero con pequenas melloras posibles na presentación. Gráfico funcional pero con pouca diferenciación visual entre categorías. Erro na representación visual dos datos. Non realiza a representación gráfica.
Predición dos diámetros O modelo clasifica correctamente os diámetros novos. Predición correcta pero con pequenas dificultades na interpretación. Predición realizada pero con erros ocasionais. Erro na clasificación dos datos. Non realiza a predición dos diámetros.
Actualización dinámica dos datos Engade correctamente novos diámetros ao modelo para mellorar a clasificación. Actualización realizada pero con pequenas melloras posibles. Actualización dos datos feita pero sen optimización da precisión. Erro ao engadir novos datos ao modelo. Non realiza a actualización dinámica dos datos.
Iteración e interacción co usuario Interacción fluída con opcións para repetir predicións. Iteración ben implementada pero con pequenas melloras posibles. Interacción funcional pero con dificultades na repetición. Erro na interacción do usuario co código. Non implementa interacción co usuario.
Actitude ante os problemas Busca solucións e optimiza os procesos de clasificación. Resolve os problemas con esforzo e consulta documentación. Resolve con dificultades pero sen explorar melloras. Resígnase ante os erros sen buscar alternativas. Non intenta resolver os problemas ou abandona o traballo.
Traballo colaborativo Comunicación eficaz e traballo equilibrado en parella. Traballo en equipo con pequenas dificultades. Interacción mínima, traballo case independente. Pouca colaboración, realízase gran parte do traballo de forma individual. Non colabora coa parella nin contribúe ao traballo conxunto.

Tarefa 3 : Clasificando cans e gatos

Duración:
50 min
Agrupamento:
2

Can
Can (CC0)
Gato
Gato (CC0)

O obxectivo deste reto é que adaptes o programa de clasificación de mazás e laranxas que xa coñeces,  para que funcione con imaxes de cans e gatos ou calquera outra clasificación binaria que queiras facer

Prepara o dataset

Traballarás con un dataset (zip - 151088148 B) que inclúe imaxes de cans e gatos organizadas en carpetas. Podes usar o arquivo comprimido proporcionado ou buscar outros datos para a túa clasificación na web(e de paso, aprender a baixar e xestionar dataset).

Uses o que uses, o arquivo .zip  de datos debe ter máis ou menos esta estrutura:

animal-dataset.zip
├── dog/
│   ├── dog1.jpg
│   ├── dog2.jpg
├── cat/
    ├── cat1.jpg
    ├── cat2.jpg 

Cambia o código, adestra e proba o modelo

  1. Adapta o programa para clasificar imaxes usando un clasificador RandomForestClassifier, pero agora traballando con imaxes de cans e gatos.
  2. Cambia os nomes das carpetas (dog e cat) e o dataset no código.
  3. Adestra o modelo co novo dataset, avalía a precisión e compara os resultados con outros clasificadores (opcional).
  4. Próbao subindo imaxes reais desde o teu ordenador das carpetas de proba de cans (zip - 1321959 B) e gatos (zip - 1130553 B) para verificar se o modelo clasifica correctamente.

Preguntas para reflexionar

  • Que cambios realizaches no código para adaptalo ao novo dataset?
  • Que efecto ten o tamaño das imaxes na precisión do modelo?
  • Que acontece se unha clase (por exemplo, cans) ten moitos máis exemplos que a outra?
  • Como poderías mellorar a precisión do modelo se non é suficientemente alta?

Lembra probar o modelo e responder ás preguntas propostas para afianzar os conceptos.

Código Python: Clasificando imaxes de laranxas e mazás/span>

# Importar as bibliotecas necesarias
import os
from PIL import Image
import numpy as np
import zipfile
from sklearn.ensemble import RandomForestClassifier
from sklearn.model_selection import train_test_split
from sklearn.metrics import accuracy_score
from google.colab import files



# Subir o arquivo comprimido (zip)
print("Por favor, carga o arquivo ZIP coas imaxes:")
uploaded = files.upload()  # Subir un arquivo ZIP

# Descomprimir o arquivo
for filename in uploaded.keys():
    with zipfile.ZipFile(filename, 'r') as zip_ref:
        zip_ref.extractall("dataset")  # Extraer todo nunha carpeta chamada 'dataset'
print("Carpeta descomprimida. Os datos están listos para procesar.")


# Función para cargar imaxes e extraer características
def cargar_e_extraer_caracteristicas(ruta_dataset):
    caracteristicas = []
    etiquetas = []
    for etiqueta, clase in enumerate(["apple", "orange"]):  # 0=apple, 1=orange
        ruta_clase = os.path.join(ruta_dataset, clase)
        print(f"Procesando a carpeta: {ruta_clase}")
        for nome_imaxe in os.listdir(ruta_clase):
            ruta_imaxe = os.path.join(ruta_clase, nome_imaxe)
            #print(f"Procesando a imaxe: {ruta_imaxe}")
            # Abrir a imaxe e redimensionala a 64x64 píxeles
            imaxe = Image.open(ruta_imaxe).resize((64, 64))
            imaxe_array = np.array(imaxe).flatten()  # Convertir a array plano (1D)
            caracteristicas.append(imaxe_array)
            etiquetas.append(etiqueta)  # Engadir etiqueta (0 ou 1)
    return np.array(caracteristicas), np.array(etiquetas)

# Ruta ao dataset descomprimido
ruta_dataset = "dataset/fruit-dataset"

# Cargar e procesar as imaxes
X, y = cargar_e_extraer_caracteristicas(ruta_dataset)

# Dividir os datos en conxuntos de adestramento e probas
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42)

# Crear e adestrar o modelo
modelo = RandomForestClassifier(random_state=42)
modelo.fit(X_train, y_train)

# Avaliar o modelo
predicións = modelo.predict(X_test)
precisión = accuracy_score(y_test, predicións)
print(f"Precisión do modelo: {precisión:.2f}")

# Bucle para subir e clasificar imaxes ata que o usuario decida rematar
def clasificar_imaxes_interactivas():
    while True:
        print("Por favor, carga unha imaxe desde o teu ordenador para clasificar:")
        arquivo_imaxe = files.upload()  # Subir imaxe
        for nome_imaxe in arquivo_imaxe.keys():
            imaxe = Image.open(nome_imaxe).resize((64, 64))
            imaxe_array = np.array(imaxe).flatten().reshape(1, -1)
            resultado = modelo.predict(imaxe_array)
            if resultado == 0:
                print("A imaxe cargada clasifícase como: Mazá (Apple)")
            else:
                print("A imaxe cargada clasifícase como: Laranxa (Orange)")
        # Preguntar ao usuario se quere continuar
        continuar = input("¿Queres clasificar outra imaxe? (si/non): ").strip().lower()
        if continuar != "si":
            print("Programa finalizado. Ata logo!")
            break

# Iniciar o proceso de clasificación interactiva
clasificar_imaxes_interactivas()
    
    

Rúbrica de avaliación

Rúbrica Reto 8-Tarefa 3:  Clasificando cans e gatos
Criterio Excelente (9-10) Bo (7-8) Aceptable (5-6) Mellorable (3-4) Moi mellorable (0-2)
Preparación e carga do dataset Carga correctamente o dataset comprimido e organiza as imaxes en carpetas. Carga adecuada pero con pequenos problemas na organización dos datos. Dataset cargado pero con dificultades na súa estrutura. Erro na carga ou problemas ao organizar as carpetas. Non realiza a carga do dataset.
Procesamento das imaxes Convértese correctamente cada imaxe a formato adecuado e redimensiona sen erros. Conversión realizada pero con pequenos problemas de tamaño ou formato. Procesamento das imaxes feito pero con inconsistencias no tamaño. Erro na conversión das imaxes ou na súa transformación. Non realiza o procesamento das imaxes.
Creación e adestramento do modelo Configura correctamente `RandomForestClassifier` e adestra o modelo con datos axeitados. Modelo configurado pero con pequenos erros na parametrización. Modelo adestrado pero con dificultades na clasificación. Erro na configuración do modelo. Non realiza o adestramento do modelo.
Avaliación do modelo Calculo correcto da precisión do modelo e interpretación dos resultados. Avaliación realizada pero con pouco detalle na análise. Avaliación feita pero con valores pouco claros. Erro ao calcular a precisión do modelo. Non realiza a avaliación do modelo.
Clasificación interactiva de imaxes Implementa correctamente o sistema de carga e clasificación dinámica de imaxes. Clasificación interactiva ben feita pero con pequenas dificultades. Clasificación realizada pero con problemas na detección das clases. Erro ao clasificar imaxes do usuario. Non implementa a clasificación interactiva.
Interpretación das preguntas Responde correctamente e de maneira fundamentada ás preguntas. Respostas claras pero con pouca profundidade na análise. Respostas dadas pero con dificultades na comprensión. Erro na interpretación das preguntas. Non responde ás preguntas.
Actitude ante os problemas Busca solucións e optimiza o modelo con criterio. Resolve os problemas con esforzo e consulta documentación. Resolve con dificultades pero sen explorar melloras. Resígnase ante os erros sen buscar alternativas. Non intenta resolver os problemas ou abandona o traballo.
Traballo colaborativo Comunicación eficaz e traballo equilibrado en parella. Traballo en equipo con pequenas dificultades. Interacción mínima, traballo case independente. Pouca colaboración, realízase gran parte do traballo de forma individual. Non colabora coa parella nin contribúe ao traballo conxunto.