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
Cambio 1: Engadir máis datos iniciais
Descrición: Engade un par de exemplos adicionais de pesos e etiquetas. Isto reforzache o concepto de adestrar un modelo con máis datos.
Modificación no código:
# Datos iniciais: pesos e etiquetas
pesos = [[150], [170], [140], [130], [180], [120]] # Engadir pesos adicionais
etiquetas = [0, 0, 1, 1, 0, 1] # Engadir etiquetas adicionais
Pregunta: Que efecto ten engadir máis datos de adestramento no modelo?
Cambio 2: Facer que o gráfico mostre a escala do peso
Descrición: Modifica o código para que a escala do eixo horizontal reflicta mellor os valores de peso. Isto axudarache a comprender a visualización dos datos.
Modificación no código:
# Modificar etiquetas e límites do gráfico
plt.xlim(100, 200) # Establecer límites da escala horizontal (peso en gramos)
plt.xlabel('Peso (gramos)', fontsize=12) # Etiqueta do eixo horizontal
Pregunta: Que pasaría se o rango de pesos no gráfico non inclúe os valores reais dos datos?
Cambio 3: Cambiar o clasificador a un algoritmo diferente
Descrición: Substituíe o clasificador por outro modelo de Scikit-learn, como RandomForestClassifier. Isto introducirache a outros algoritmos de clasificación.
Modificación no código:
# Substituír DecisionTreeClassifier por RandomForestClassifier
from sklearn.ensemble import RandomForestClassifier
# Crear o modelo de Random Forest
modelo = RandomForestClassifier(random_state=42)
Pregunta: En que se diferencia RandomForestClassifier de DecisionTreeClassifier?
Cambio 4: Engadir validación cruzada
Descrición: Usa validación cruzada para verificar o rendemento do modelo con diferentes conxuntos de datos.
Modificación no código:
from sklearn.model_selection import cross_val_score
# Realizar validación cruzada
scores = cross_val_score(modelo, pesos, etiquetas, cv=3) # 3 subconxuntos
print(f"Precisión media durante validación cruzada: {np.mean(scores):.2f}")
Pregunta: Por que é importante a validación cruzada cando adestramos un modelo?
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
- Solución: Engadir máis datos mellora o modelo ao permitirlle aprender de máis exemplos. Isto normalmente aumenta a precisión do modelo, especialmente se os datos son representativos.
- Solución: Se os valores están fóra do rango, os puntos non aparecerán correctamente no gráfico. É importante axustar o rango para representar os datos visualizados.
- Solución: Random Forest usa múltiples árbores de decisión e combina as súas predicións para obter mellores resultados e evitar o sobreaxuste.
- Solución: A validación cruzada axuda a garantir que o modelo funcione ben con datos novos, non só cos datos de adestramento.
O sobreaxuste ocorre cando un modelo de aprendizaxe automática aprende demasiado ben os datos de adestramento, incluíndo ruídos ou detalles innecesarios que non xeneralizan ben con novos datos.
Imaxina que o modelo se centra tanto en memorizar os exemplos cos que foi adestrado que non pode adaptarse a outros casos similares pero diferentes.
Por exemplo, supón que queres ensinar a un modelo a distinguir entre cans e gatos, pero no adestramento só lle mostras certos tipos de cans e gatos. Se o modelo sobreaxusta, pode aprender características demasiado específicas, como “os cans sempre teñen unha orella de cor negra”, e cando lle mostras outro can con orellas doutra cor, falla na clasificación.
O sobreaxuste significa que o modelo funciona moi ben nos datos de adestramento, pero mal nos datos novos. Para evitar isto, utilizamos técnicas como a validación cruzada ou a regularización.