Non é maxia nin habilidade sobrenatural, senón unha árbore de decisión implementado correctamente:
Imaxina unha árbore cuxas ramas representan decisións e cuxas follas indican resultados.
Cada nodo da árbore é unha pregunta que o algoritmo formula sobre os datos.
Dependendo da resposta, o algoritmo segue unha rama específica da árbore ou outra.
Este algoritmo opera como un xogo de preguntas e respostas, onde cada nodo é unha pregunta que acouta as opcións, e cada rama representa un traxecto segundo a resposta.
O proceso continúa ata chegar a unha folla, que é a decisión final.
Aprende
Ademais, sistemas como Akinator aprenden de cada interacción, axustando a súa árbore de decisión para realizar predicións cada vez máis precisas.
Imos comprender como funciona unha árbore de decisión e algúns conceptos clave na IA cun exemplo simple e práctico.Se trata de implementar un sistema para clasificar animais. Empezamos só con tres Xirafa, Foca e Ovella.
Clases: As clases representan as categorías ou tipos de obxectos (ou animais neste caso) que queremos identificar ou clasificar utilizando a intelixencia artificial.
Para este exemplo, usaremos tres clases:
Xirafa: Un animal grande, con pescozo longo, sen pelo denso. Foca: Vive no mar e non é doméstico. Oveja: É doméstica, ten un abrigo de la (pelo).
Que son as características dunha clase?
Características: Son as propiedades ou calidades que describen aos obxectos e que utilizamos para diferenciarlos.
No noso caso, utilizaremos as seguintes características:
Ten pelo (1 = Si, 0 = Non): Determina se o animal ten pelo ou non. É doméstico (1 = Si, 0 = Non): Indica se o animal pode vivir como animal doméstico. Vive na auga (1 = Si, 0 = Non): Indica se o animal vive na auga ou en terra.
Agora, asignamos as características ás clases:
Características dos Animais
Clase
Ten pelo
É doméstico
Vive na auga
Xirafa
0
0
0
Foca
0
0
1
Oveja
1
1
0
Etiquetar e garda os datos
Imos crear un programa en Python que permita ao usuario introducir as características dun animal e gardalas. Ao final, o programa xerará unha gráfica con estes datos.
Lembra que o animal 1 será a xirafa, o 2 será a foca e o 3 será a ovella.
Primeiro número: Ten pelo Segundo número: É doméstico Terceiro número: Vive na auga
Datos etiquetados e non etiquetados
Os datos etiquetados son aqueles nos que coñecemos a clase ou categoría á que pertence un obxecto (como no exemplo anterior).
Por exemplo:
[0, 0, 0] → Xirafa
[0, 0, 1] → Foca
[1, 1, 0] → Ovella
Aprendizaxe supervisada:Consiste en anticipar un valor ou unha categoría a partir de datos etiquetados.
Esta é unha das utilidades máis habituais da aprendizaxe automática ML. Estes datos pódense usar nun modelo de IA para aprender a clasificar novos animais.
Por exemplo, se introducimos un vector [0, 1, 0], o modelo pode predecir que se trata dunha foca, xa que comparte características similares.
Os datos non etiquetados son aqueles nos que podemos ter o vector de características, pero non sabemos a clase.
Por exemplo:
[1, 0, 0] → ?
[0, 1, 1] → ?
A IA utiliza os datos etiquetados para aprender e despois clasificar os datos non etiquetados.
Modelo predictivo cunha árbore de decisión
Este programa utiliza os datos ou dataframe anteriores, e un algoritmo dunha árbore de decisión para clasificar os animais nunha das tres clases iniciais (xirafa, ovella e foca). Se o modelo non acerta, pedirá á usuaria que introduza o novo animal, actualizará os DataFrame engadindo a nova clase e as súas características e volverá adestrar o modelo .
Como podedes comprobar, este modelo e xeito de predecir é moi limitado... Imos milloralo. Por exemplo , sería importante, que nos preguntase cal é a diferencia entre o que el predixo(Foca) , e o animal novo que introducimos(Cocodrilo) , noutras palabras... Debe preguntarnos ... por que non acertei?...Cal é a nova característica que me pode axudar a distinguir entre Cocodrilo e Foca? Ou entre Cocodrilo e Peixe?
O algoritmo precisa máis datos para mellorar a súa predicción, para APRENDER .
Imos implementalo con esta mellora do programa anterior e comprobar se afina agora a predicción. Imos modificar o programa para que, cando o vector de características sexa igual ao de unha clase predita, pero o modelo non acerte o animal, poidase crear unha nova característica que diferencie ao novo animal. Ademais, o programaactualizará as características de cada clase existente preguntando á usuaria sobre esa nova característica. No exemplo introduzo unha clase Peixe que Ten escamas de característica diferencial .
E...aprendeu, pero todo isto segue a ser transparente a nós, imos intentar con un pequeno cambio no programa, visualizar a árbore de decisións, como vai comparando os vectores de características e tomando decisións.
Creación propia. Árbore de decisión coas 3 clases iniciais(CC BY-SA)
O que aparece no gráfico: O gráfico mostra como o modelo analiza as características dos animais para decidir de cal clase son. Que significa cada parte?
Primeiro nodo: "Ten pelo ≤ 0.5".Este nodo está preguntando: "O animal ten pelo?" Resposta Si: Se ten pelo, seguimos unha rama á dereita.(False= ten pelo, True= non ten pelo) Resposta Non: Se non ten pelo, seguimos unha rama á esquerda.
O concepto de gini: O valor gini indica como de "misturadas" están as clases no nodo. Un gini = 0.0 significa que só hai unha clase nese nodo (está perfectamente clasificado). Un valor maior (como gini = 0.667) indica que hai varias clases no nodo e que están parcialmente mesturadas.
"Vive na auga ≤ 0.5" (Segundo nodo):Este nodo pregunta: "O animal vive na auga?" Resposta Si: Se vive na auga, é clasificado como Foca (ver abaixo). Resposta Non: Seguimos cara outra bifurcación que fai máis preguntas.
As follas finais: Cada folla final é un resultado. Aquí é onde o modelo clasifica o animal definitivamente:
"Clase = Foca": Clasificouse como Foca. "Clase = Ovella": Clasificouse como Ovella. "Clase = Xirafa": Clasificouse como Xirafa.
Exemplo paso a paso para entender a decisión: Imos analizar un animal: Peixe. ⇒Supoñamos que non ten pelo (Ten pelo = 0).⇒ Seguimos cara á esquerda na árbore.⇒ Preguntamos: "Vive na auga?"⇒ Se Si (Vive na auga = 1), chegamos á folla que di que é unha Foca. Por iso predixo foca . Outro exemplo:Unha Ovella⇒ Supoñamos que ten pelo (Ten pelo = 1).⇒Seguimos cara á dereita na árbore. ⇒Preguntamos: "É doméstico?" ⇒ Se Si (É doméstico = 1), chegamos á folla que di que é unha Ovella.
Resumindo: A árbore vai dividindo os animais en camiños segundo as súas características, ata que chega a un resultado final. Cada pregunta vai eliminando posibilidades ata que sabemos exactamente de que clase é o animal.
Xa comprendeches o que é unha árbore de decisión?
O algoritmo da árbore de decisións en intelixencia artificial é unha ferramenta que se utiliza para tomar decisións ou clasificar datos baseándose nunha serie de preguntas xerárquicas. É especialmente útil en áreas como a aprendizaxe automática ML, onde o obxectivo é aprender patróns a partir de datos e usalos para tomar decisións ou facer predicións.
Como funciona a árbore de decisións en IA?
Nodo raíz: É o punto inicial da árbore, onde comeza o proceso de toma de decisións. Representa a primeira pregunta ou condición.
Nodos internos: Son puntos intermedios da árbore que representan preguntas adicionais ou condicións baseadas nas respostas anteriores.
Ramas: Conectan os nodos e representan as posibles respostas ou camiños que se poden tomar.
Follas: Son os nodos finais que conteñen a decisión ou clasificación final.
O proceso é iterativo e baséase en dividir os datos segundo as respostas ás preguntas, o que se coñece como un enfoque "divide e vencerás".
IMAXINA A CANTIDADE DE PASOS E CLASES QUE TEN Akinator!!!
Este é un programa en Python que podes executar en Google Colaboratory para cargar datos de animais que constan do tipo de animal e as súas características
O programa inclue explicacións detalladas nos comentarios para que comprendas cada paso.
Executandoo en Colab, podes probar a crear 3 clases de animais e as características que os definen como tales.
Non te preocupes por comprender o programa totalmente, só de entender o que fai.
Código Python: Programa para crear 3 clases con 3 características que as distinguen
# Instalamos librarías necesarias para visualizar gráficos
!pip install matplotlib pandas
# Importamos as librarías necesarias
import pandas as pd
import matplotlib.pyplot as plt
# Creamos unha lista para gardar os datos
animais = []
# Explicación inicial ao usuario
print("Imos clasificar animais con base nas súas características.")
print("As características son:")
print("1. Ten pelo (1 = Si, 0 = Non)")
print("2. É doméstico (1 = Si, 0 = Non)")
print("3. Vive na auga (1 = Si, 0 = Non)")
# Preguntamos por varios animais e gardamos os datos
for i in range(3): # Permitimos ao usuario introducir datos de 3 animais
print(f"\nIntroduce as características do animal {i + 1}:")
ten_pelo = int(input("¿Ten pelo? (1: Si, 0: Non): "))
e_domestico = int(input("¿É doméstico? (1: Si, 0: Non): "))
vive_na_auga = int(input("¿Vive na auga? (1: Si, 0: Non): "))
clase = input("¿Que animal é? (Xirafa, Foca, Ovella): ")
# Gardamos os datos como diccionario
animal = {
"Ten pelo": ten_pelo,
"É doméstico": e_domestico,
"Vive na auga": vive_na_auga,
"Clase": clase
}
animais.append(animal)
# Creamos un DataFrame a partir dos datos recollidos
df = pd.DataFrame(animais)
# Visualizamos os datos como gráfica
print("\nXerando gráfica das características...")
df.groupby("Clase")[["Ten pelo", "É doméstico", "Vive na auga"]].mean().plot(kind="bar")
plt.title("Características promedio por clase")
plt.ylabel("Valor (0: Non, 1: Si)")
plt.xticks(rotation=0)
plt.show()
# Mostramos os datos recollidos
print("\nDatos recollidos:")
print(df)
Este é un programa en Python que podes executar en Google Colaboratory para para clasificar os animais nunha das tres clases iniciais (xirafa, ovella e foca).
Se o modelo non acerta, pedirá á usuaria que introduza un novo animal, actualizará o DataFrame engadindo a nova clase e volverá adestrar o modelo.
Todo se realiza de forma iterativa ata que a usuaria decida rematar.
O programa inclue explicacións detalladas nos comentarios para que comprendas cada paso.
Executandoo en Colab, podes probar a clasificar animais, crear novas clases e volver clasificar
Código Python: Clasificar os animais nunha das tres clases iniciais (xirafa, ovella e foca).Incluir novas clases(novos animais).
# Instalamos as librarías necesarias (só se estás en Google Colaboratory)
!pip install pandas scikit-learn
# Importamos as librarías necesarias
import pandas as pd
from sklearn.tree import DecisionTreeClassifier
# Creación do conxunto de datos inicial con 3 clases (Xirafa, Foca, Ovella)
# Este é o DataFrame inicial coas características e clases dos animais
datos = {
"Ten pelo": [0, 0, 1], # 1: Si, 0: Non
"É doméstico": [0, 0, 1], # 1: Si, 0: Non
"Vive na auga": [0, 1, 0], # 1: Si, 0: Non
"Clase": ["Xirafa", "Foca", "Ovella"] # Clases dos animais
}
# Creamos un DataFrame para organizar os datos
df = pd.DataFrame(datos)
# Mensaxe inicial para a usuaria
print("\n\nBenvida ao clasificador de animais baseado nunha árbore de decisión.")
print("Iniciaremos coas seguintes clases: Xirafa, Foca e Ovella.")
print("Cada clase está definida polas seguintes características:")
print("- Ten pelo: 1 = Si, 0 = Non")
print("- É doméstico: 1 = Si, 0 = Non")
print("- Vive na auga: 1 = Si, 0 = Non\n")
# Creamos unha árbore de decisión inicial usando scikit-learn
X = df[["Ten pelo", "É doméstico", "Vive na auga"]] # Características
y = df["Clase"] # Etiquetas (clases)
modelo = DecisionTreeClassifier() # Inicializamos a árbore de decisión
modelo.fit(X, y) # Adestramos o modelo co DataFrame inicial
# Bucle principal para a clasificación
while True:
# Paso 1: Preguntamos as características dun novo animal
print("\nIntroduce as características do animal a clasificar:")
ten_pelo = int(input("Ten pelo? (1 = Si, 0 = Non): "))
e_domestico = int(input("É doméstico? (1 = Si, 0 = Non): "))
vive_na_auga = int(input("Vive na auga? (1 = Si, 0 = Non): "))
# Creamos un DataFrame coas características do novo animal
novo_animal = pd.DataFrame(
[[ten_pelo, e_domestico, vive_na_auga]],
columns=["Ten pelo", "É doméstico", "Vive na auga"] # Nomes das características
)
# Paso 2: Tentamos clasificar o animal utilizando a árbore de decisión
predicion = modelo.predict([[ten_pelo, e_domestico, vive_na_auga]])[0]
print(f"\nO modelo predi que o animal é: {predicion}")
# Paso 3: Preguntar se a predición foi correcta
correcto = input("O modelo acertou? (Si/Non): ").strip().lower()
if correcto == "si":
print("Perfecto! O modelo clasificou correctamente o animal.")
else:
# Paso 4: Engadir unha nova clase se o modelo errou
nova_clase = input("Que animal é? (nome da nova clase): ")
# Engadimos o novo animal ao DataFrame utilizando pd.concat
novo_dato = pd.DataFrame({
"Ten pelo": [ten_pelo],
"É doméstico": [e_domestico],
"Vive na auga": [vive_na_auga],
"Clase": [nova_clase]
})
df = pd.concat([df, novo_dato], ignore_index=True)
print(f"\nEngadimos a nova clase '{nova_clase}' ao conxunto de datos.")
# Re-adestrar o modelo coa nova información
X = df[["Ten pelo", "É doméstico", "Vive na auga"]]
y = df["Clase"]
modelo.fit(X, y) # Re-adestramos o modelo
print("O modelo foi actualizado e adestrado cos novos datos.")
# Paso 5: Preguntar se a usuaria desexa continuar
continuar = input("\n¿Queres clasificar outro animal? (Si/Non): ").strip().lower()
if continuar != "si":
print("Grazas por usar o clasificador de animais. Ata a próxima!")
break
Este é un programa en Python que podes executar en Google Colaboratory para para clasificar os animais nunha das tres clases iniciais (xirafa, ovella e foca), crear novas clases para clasificar animais e cando dous vectores de características coinciden e non son o mesmo animal, pode incluir unha nova característica que os distinga.
Se o modelo non acerta, pedirá á usuaria que introduza un novo animal ou unha característica e actualizará o DataFrame engadindo a nova clase e/ou característica e volverá adestrar o modelo.
Todo se realiza de forma iterativa ata que a usuaria decida rematar.
O programa inclue explicacións detalladas nos comentarios para que comprendas cada paso.
Executandoo en Colab, podes probar a clasificar animais, crear novas clases e características, e volver clasificar
Non te preocupes por comprender o programa totalmente, só de entender o que fai.
Código Python: Clasificar os animais nunha das tres clases iniciais (xirafa, ovella e foca).Incluir novas clases(animais) e novas características.
# Instalamos as librarías necesarias (só se estás en Google Colaboratory)
!pip install pandas scikit-learn
# Importamos as librarías necesarias
import pandas as pd
from sklearn.tree import DecisionTreeClassifier
# Creación do conxunto de datos inicial con 3 clases (Xirafa, Foca, Ovella)
datos = {
"Ten pelo": [0, 0, 1], # 1: Si, 0: Non
"É doméstico": [0, 0, 1], # 1: Si, 0: Non
"Vive na auga": [0, 1, 0], # 1: Si, 0: Non
"Clase": ["Xirafa", "Foca", "Ovella"] # Clases dos animais
}
# Creamos un DataFrame para organizar os datos
df = pd.DataFrame(datos)
# Mensaxe inicial para a usuaria
print("\n\nBenvida ao clasificador de animais baseado nunha árbore de decisión.")
print("\nIniciaremos coas seguintes clases: Xirafa, Foca e Ovella.")
print("\nCada clase está definida polas seguintes características:")
print("- Ten pelo: 1 = Si, 0 = Non")
print("- É doméstico: 1 = Si, 0 = Non")
print("- Vive na auga: 1 = Si, 0 = Non\n")
# Creamos unha árbore de decisión inicial usando scikit-learn
X = df.drop(columns=["Clase"]) # Seleccionamos todas as características excepto a "Clase"
y = df["Clase"] # Definimos as etiquetas (clases)
modelo = DecisionTreeClassifier() # Inicializamos a árbore de decisión
modelo.fit(X, y) # Adestramos o modelo co conxunto de datos inicial
# Bucle principal para a clasificación
while True:
# Paso 1: Preguntamos as características dun novo animal, incluíndo calquera nova característica
print("\nIntroduce as características do animal a clasificar:")
caracteristicas = {}
# Preguntar polas características iniciais predefinidas
caracteristicas["Ten pelo"] = int(input("Ten pelo? (1 = Si, 0 = Non): "))
caracteristicas["É doméstico"] = int(input("É doméstico? (1 = Si, 0 = Non): "))
caracteristicas["Vive na auga"] = int(input("Vive na auga? (1 = Si, 0 = Non): "))
# Preguntar polas novas características engadidas ao conxunto de datos
for columna in df.columns:
if columna not in ["Ten pelo", "É doméstico", "Vive na auga", "Clase"]:
pregunta = f"¿{columna}? (1 = Si, 0 = Non): "
caracteristicas[columna] = int(input(pregunta))
# Creamos un vector de entrada segundo a orde das columnas do DataFrame
entrada = [caracteristicas[columna] for columna in df.columns if columna != "Clase"]
# Paso 2: Clasificamos o animal empregando a árbore de decisión
entrada_df = pd.DataFrame([entrada], columns=df.drop(columns=["Clase"]).columns) # Formato válido para o modelo
prediccion = modelo.predict(entrada_df)[0]
print(f"\nO modelo predí que o animal é: {prediccion}")
# Comprobamos se o vector de características coincide co vector predito
vector_predito = df[df["Clase"] == prediccion].drop(columns=["Clase"]).values[0]
if list(vector_predito) == entrada:
# Paso 3: Preguntamos se a predición foi correcta
correcto = input(f"O animal pertence realmente á clase '{prediccion}'? (Si/Non): ").strip().lower()
if correcto == "non":
# Engadimos unha nova característica para diferenciar este animal
print("\nO vector de características coincide, pero non é o mesmo animal.")
nova_caracteristica = input("Que característica diferencia este animal da clase predita? (nome): ")
# Actualizamos o DataFrame engadindo a nova característica
df[nova_caracteristica] = 0 # Inicializamos a nova columna con valor 0
print(f"\nPrecisamos saber se cada clase existente ten a característica '{nova_caracteristica}':")
for clase in df["Clase"].unique():
valor = int(input(f"A clase '{clase}' ten '{nova_caracteristica}'? (1 = Si, 0 = Non): "))
df.loc[df["Clase"] == clase, nova_caracteristica] = valor
# Engadimos o novo animal ao conxunto de datos
nova_clase = input("¿Que animal é? (nome da nova clase): ")
novo_dato = {**caracteristicas, nova_caracteristica: 1, "Clase": nova_clase}
df = pd.concat([df, pd.DataFrame([novo_dato])], ignore_index=True)
print(f"\nEngadimos a nova clase '{nova_clase}' e a característica '{nova_caracteristica}' ao conxunto de datos.")
else:
print("Perfecto! O animal pertence á clase predita.")
# Re-adestramos o modelo co conxunto de datos actualizado
X = df.drop(columns=["Clase"]) # Actualizamos as características
y = df["Clase"] # Actualizamos as etiquetas
modelo.fit(X, y) # Re-adestramos o modelo
print("O modelo foi actualizado coa nova clase e a nova característica.")
else:
print("O modelo errou completamente na predición.")
# Paso 4: Preguntamos se a usuaria quere continuar
continuar = input("\nQueres clasificar outro animal? (Si/Non): ").strip().lower()
if continuar != "si":
print("Grazas por usar o clasificador de animais. ¡Ata a próxima!")
break
Este é un programa en Python que podes executar en Google Colaboratory para obter as árbores de decisión de cada clasificación do programa
O programa inclue explicacións detalladas nos comentarios para que comprendas cada paso.
Executandoo en Colab, podes probar a crear máis clases de animais e as características que os definen como tales, e comprobar como crece a árbore de decisións.
Non te preocupes por comprender o programa totalmente, só de entender o que fai.
Código Python: Visualizando as árbores de decisión en cada clasificación
# Instalamos as librarías necesarias (só se estás en Google Colaboratory)
!pip install pandas scikit-learn graphviz
# Importamos as librarías necesarias
import pandas as pd
from sklearn.tree import DecisionTreeClassifier, export_graphviz
import graphviz
from IPython.display import display, Image
# Creación do conxunto de datos inicial con 3 clases (Xirafa, Foca, Ovella)
datos = {
"Ten pelo": [0, 0, 1], # 1: Si, 0: Non
"É doméstico": [0, 0, 1], # 1: Si, 0: Non
"Vive na auga": [0, 1, 0], # 1: Si, 0: Non
"Clase": ["Xirafa", "Foca", "Ovella"] # Clases dos animais
}
# Creamos un DataFrame para organizar os datos
df = pd.DataFrame(datos)
# Mensaxe inicial para a usuaria
print("\n\nBenvida ao clasificador de animais baseado nunha árbore de decisión.")
print("\nIniciaremos coas seguintes clases: Xirafa, Foca e Ovella.")
print("\nCada clase está definida polas seguintes características:")
print("- Ten pelo: 1 = Si, 0 = Non")
print("- É doméstico: 1 = Si, 0 = Non")
print("- Vive na auga: 1 = Si, 0 = Non\n")
# Creamos unha árbore de decisión inicial usando scikit-learn
X = df.drop(columns=["Clase"]) # Seleccionamos todas as características excepto a "Clase"
y = df["Clase"] # Definimos as etiquetas (clases)
modelo = DecisionTreeClassifier() # Inicializamos a árbore de decisión
modelo.fit(X, y) # Adestramos o modelo co conxunto de datos inicial
# Función para mostrar o gráfico da árbore de decisión
def mostrar_arvore_decision(modelo, X, y):
dot_data = export_graphviz(
modelo,
out_file=None,
feature_names=X.columns,
class_names=modelo.classes_,
filled=True,
rounded=True,
special_characters=True
)
graph = graphviz.Source(dot_data)
graph.render("arvore_decision", format="png", cleanup=True) # Xera un ficheiro PNG
display(Image("arvore_decision.png")) # Mostra o ficheiro PNG
# Mostramos a árbore de decisión inicial
print("\nAquí tes a árbore de decisión inicial:")
mostrar_arvore_decision(modelo, X, y)
# Bucle principal para a clasificación
while True:
# Paso 1: Preguntamos as características dun novo animal, incluíndo calquera nova característica
print("\nIntroduce as características do animal a clasificar:")
caracteristicas = {}
# Preguntar polas características iniciais predefinidas
caracteristicas["Ten pelo"] = int(input("Ten pelo? (1 = Si, 0 = Non): "))
caracteristicas["É doméstico"] = int(input("É doméstico? (1 = Si, 0 = Non): "))
caracteristicas["Vive na auga"] = int(input("Vive na auga? (1 = Si, 0 = Non): "))
# Preguntar polas novas características engadidas ao conxunto de datos
for columna in df.columns:
if columna not in ["Ten pelo", "É doméstico", "Vive na auga", "Clase"]:
pregunta = f"¿{columna}? (1 = Si, 0 = Non): "
caracteristicas[columna] = int(input(pregunta))
# Creamos un vector de entrada segundo a orde das columnas do DataFrame
entrada = [caracteristicas[columna] for columna in df.columns if columna != "Clase"]
# Paso 2: Clasificamos o animal empregando a árbore de decisión
entrada_df = pd.DataFrame([entrada], columns=df.drop(columns=["Clase"]).columns) # Formato válido para o modelo
prediccion = modelo.predict(entrada_df)[0]
print(f"\nO modelo predí que o animal é: {prediccion}")
# Comprobamos se o vector de características coincide co vector predito
vector_predito = df[df["Clase"] == prediccion].drop(columns=["Clase"]).values[0]
if list(vector_predito) == entrada:
# Paso 3: Preguntamos se a predición foi correcta
correcto = input(f"O animal pertence realmente á clase '{prediccion}'? (Si/Non): ").strip().lower()
if correcto == "non":
# Engadimos unha nova característica para diferenciar este animal
print("\nO vector de características coincide, pero non é o mesmo animal.")
nova_caracteristica = input("Que característica diferencia este animal da clase predita? (nome): ")
# Actualizamos o DataFrame engadindo a nova característica
df[nova_caracteristica] = 0 # Inicializamos a nova columna con valor 0
print(f"\nPrecisamos saber se cada clase existente ten a característica '{nova_caracteristica}':")
for clase in df["Clase"].unique():
valor = int(input(f"A clase '{clase}' ten '{nova_caracteristica}'? (1 = Si, 0 = Non): "))
df.loc[df["Clase"] == clase, nova_caracteristica] = valor
# Engadimos o novo animal ao conxunto de datos
nova_clase = input("Que animal é? (nome da nova clase): ")
novo_dato = {**caracteristicas, nova_caracteristica: 1, "Clase": nova_clase}
df = pd.concat([df, pd.DataFrame([novo_dato])], ignore_index=True)
print(f"\nEngadimos a nova clase '{nova_clase}' e a característica '{nova_caracteristica}' ao conxunto de datos.")
else:
print("Perfecto! O animal pertence á clase predita.")
# Re-adestramos o modelo co conxunto de datos actualizado
X = df.drop(columns=["Clase"]) # Actualizamos as características
y = df["Clase"] # Actualizamos as etiquetas
modelo.fit(X, y) # Re-adestramos o modelo
print("O modelo foi actualizado coa nova clase e a nova característica.")
else:
print("O modelo errou completamente na predición.")
# Mostramos a árbore de decisión actualizada
print("\nAquí tes a árbore de decisión actualizada:")
mostrar_arvore_decision(modelo, X, y)
# Paso 4: Preguntamos se a usuaria quere continuar
continuar = input("\nQueres clasificar outro animal? (Si/Non): ").strip().lower()
if continuar != "si":
print("Grazas por usar o clasificador de animais. ¡Ata a próxima!")
break
Inicio e presentación: O programa comeza cunha mensaxe de benvida dirixida á usuaria.
Infórmaa sobre o obxectivo do programa: clasificar animais baseándose nas súas características.
Presenta as clases iniciais dispoñibles (Xirafa, Foca, Ovella) e explica as características principais que definen os animais:
Se teñen pelo: 1 (Si) ou 0 (Non).
Se son domésticos: 1 (Si) ou 0 (Non).
Se viven na auga: 1 (Si) ou 0 (Non).
Configuración inicial: Utiliza un conxunto de datos predefinido (DataFrame) que contén as características iniciais dos animais mencionados.
Crea un modelo de árbore de decisión (DecisionTreeClassifier) usando as librarías de scikit-learn.
Este modelo é adestrado empregando os datos iniciais.
Bucle principal do programa: O programa entra nun bucle que se repite ata que a usuaria decida rematar.
En cada iteración, realízanse os seguintes pasos:
Preguntar polas características dun novo animal: Solicítase á usuaria que introduza os valores das características do animal a clasificar.Estas características inclúen as iniciais (pelo, doméstico, vive na auga) e calquera outra característica engadida en interaccións previas.As respostas son almacenadas nun dicionario chamado caracteristicas.
Xerar o vector de entrada: Constrúese un vector (entrada) coas características introducidas pola usuaria, mantendo o mesmo formato e orde que o modelo espera.
Clasificación: Empregando o modelo de árbore de decisión, realízase a predición da clase do animal (por exemplo, Xirafa ou Foca). Isto baséase nas características proporcionadas. O programa mostra a predición á usuaria.
Comprobación da predición: Compara as características introducidas coa clase predicida polo modelo. Pregunta á usuaria se a predición é correcta:
Se é correcta: Confírmase a predición, e o modelo segue sendo o mesmo.
Se non é correcta:
Solicítase á usuaria unha nova característica que diferencie o animal da clase predicida.
Engadir unha nova característica e clase: A nova característica proposta pola usuaria é engadida ao conxunto de datos.
Pregúntase se as clases existentes teñen ou non esa nova característica.
A nova clase do animal introducido pola usuaria é engadida xunto coas súas características.
Re-adestramento do modelo: O modelo de árbore de decisión é re-adestrado empregando o conxunto de datos actualizado, que inclúe as novas características e clases introducidas.
Continuar ou rematar: Pregúntase á usuaria se desexa clasificar outro animal. Se responde "Si": O bucle continúa, e realízase outra clasificación. Se responde "Non": O programa remata cunha mensaxe de despedida.
Esta secuencia garante que o programa aprenda de maneira iterativa, adaptándose ás novas informacións proporcionadas pola usuaria. Deste xeito, mellora a súa capacidade de clasificación co tempo.
Datos iniciais: Creamos un DataFrame inicial con tres animais (xirafa, foca e ovella) definidos polas súas características: Ten pelo, É doméstico, Vive na auga.
Exemplo:
Xirafa: [0, 0, 0]
Foca: [0, 0, 1]
Ovella: [1, 1, 0]
Adestramento inicial do modelo: Utilizamos DecisionTreeClassifier de scikit-learn(librería) para crear e adestrar unha árbore de decisión usando o DataFrame inicial.
Clasificación: Preguntamos as características dun novo animal á usuaria. Usamos o modelo para predicir a clase deste animal baseado nas súas características.
Verificación: Se a predición é correcta, mostramos unha mensaxe de confirmación. Se a predición é incorrecta, pedimos á usuaria que introduza o nome do novo animal e engadímolo como unha nova clase ao DataFrame.
Actualización: Engadimos o novo animal ao DataFrame e re-adestramos o modelo para que inclúa a nova clase.
Iteración: O proceso repítese ata que a usuaria decida rematar.
Interpretación Esta táboa é útil para entender como se diferencian os animais utilizando características clave.
Por exemplo: Podemos observar que só a Ovella é doméstica e que só a Foca vive na auga.
Este tipo de representación permite identificar patróns nos datos, facilitando o uso para modelos de intelixencia artificial.
Tarefa
Duración:
20 min
Agrupamento:
2
Analiza esta árbore de decisión obtida co exemplo de clasificación de animais cunha clase máis. Explica a secuencia de decisión que fan clasificar unha entrada como peixe e como xirafa.
Rexistra no teu portafolio as respostas e conclusións
Creación propia. Árbore de decisión 4 clases (CC BY-SA)
Pode resultar algo confuso pero False = Sí e True = Non
Secuencia de decisións para peixe
A árbore de decisión determina que un animal é un peixe a partir das seguintes preguntas:
Vive na auga?
Resposta: Si (Vive na auga é False, o que indica que vive na auga).
Continuamos pola rama dereita
Ten escamas?
Resposta: Si (Ten escamas é False, indicando que ten escamas).
Chegamos á folla final, onde se clasifica o animal como Peixe.
Secuencia de decisións para xirafa
A árbore de decisión clasifica un animal como xirafa seguindo estas preguntas:
Vive na auga?
Resposta: Non (Vive na auga é True, indicando que non vive na auga).
Continuamos pola rama esquerda
É doméstico?
Resposta: Non (É doméstico é True, indicando que non é doméstico).
Chegamos á folla final, onde se clasifica o animal como Xirafa.
Que significa "samples"?
O valor samples indica o número de exemplos (ou casos) que se están considerando nun nodo específico da árbore de decisión. Representa cantos elementos do conxunto de datos inicial están presentes nese nodo.
Por exemplo:
Se nun nodo aparece samples = 3, significa que ese nodo está tomando decisións baseándose en tres animais do conxunto de datos.
A medida que avanzamos na árbore, o número de samples pode diminuír porque o nodo está filtrando os datos segundo as respostas ás preguntas realizadas.
Isto axuda a entender que partes do conxunto de datos están influíndo nas decisións en cada etapa da árbore.