UNIVERSIDAD PRIVADA DOMINGO SAVIO
Practica #6
Materia: Inteligencia Artificial
Docente: Vladimir Rojas
Estudiantes:
● Gerardo Pablo Moya Grageda
Carrera: ingeniería en sistemas
Cochabamba
Título:
_____________________________________________________________
import pandas as pd
from sklearn.model_selection import train_test_split
from sklearn.linear_model import LogisticRegression
from sklearn.tree import DecisionTreeClassifier
from sklearn.ensemble import RandomForestClassifier
from sklearn.metrics import accuracy_score
# 1. Cargar el archivo titanic_limpio.csv.
try:
df_titanic_limpio = pd.read_csv('titanic_limpio.csv')
print("DataFrame 'titanic_limpio.csv' cargado exitosamente.")
except FileNotFoundError:
print("Error: 'titanic_limpio.csv' no encontrado. Asegúrate de que
el archivo esté en el mismo directorio o proporciona la ruta
completa.")
df_titanic_limpio = None
if df_titanic_limpio is not None:
# 2. Preparar los datos: Seleccionar características (X) y la
variable objetivo (y).
# Verificar primero qué columnas están disponibles
print(f"Columnas disponibles en el dataset:
{list(df_titanic_limpio.columns)}")
# Usar 'Sex_male' en lugar de 'male' basado en el contenido real
del CSV
features = ['Pclass', 'Age', 'SibSp', 'Parch', 'Fare', 'Sex_male']
target = 'Survived'
# Verificar que las columnas necesarias existan en el DataFrame
missing_features = [f for f in features if f not in
df_titanic_limpio.columns]
if missing_features:
print(f"Error: Faltan las siguientes columnas en
'titanic_limpio.csv': {missing_features}. Asegúrate de que el Ejercicio
1 se ejecutó correctamente.")
elif target not in df_titanic_limpio.columns:
print(f"Error: La columna objetivo '{target}' no se encuentra
en 'titanic_limpio.csv'.")
else:
X = df_titanic_limpio[features]
y = df_titanic_limpio[target]
# Verificar si hay valores faltantes y manejarlos
print(f"\nValores faltantes por columna:")
print(X.isnull().sum())
Página | 2
Asignatura:
Carrera: ingeniería en sistemas
Título:
_____________________________________________________________
# Eliminar filas con valores faltantes (especialmente en Age
que suele tener NaN)
initial_rows = len(X)
X_clean = X.dropna()
y_clean = y.loc[X_clean.index]
final_rows = len(X_clean)
if initial_rows != final_rows:
print(f"Se eliminaron {initial_rows - final_rows} filas con
valores faltantes.")
print(f"Filas restantes: {final_rows}")
# Dividir el dataset en conjuntos de entrenamiento y prueba
X_train, X_test, y_train, y_test = train_test_split(X_clean,
y_clean, test_size=0.2, random_state=42)
print("\nDatos divididos en conjuntos de entrenamiento y prueba
(80/20).")
print(f"Tamaño del conjunto de entrenamiento (X_train):
{X_train.shape}")
print(f"Tamaño del conjunto de prueba (X_test):
{X_test.shape}")
# Inicializar un diccionario para almacenar las precisiones
accuracies = {}
try:
# 3. Entrenar y evaluar un modelo de Regresión Logística.
log_reg_model = LogisticRegression(random_state=42,
solver='liblinear', max_iter=200) # Usar solver 'liblinear' para
datasets pequeños
log_reg_model.fit(X_train, y_train)
y_pred_log_reg = log_reg_model.predict(X_test)
accuracy_log_reg = accuracy_score(y_test, y_pred_log_reg)
accuracies['Regresión Logística'] = accuracy_log_reg
print(f"\nPrecisión del modelo de Regresión Logística:
{accuracy_log_reg:.4f}")
# 4. Entrenar y evaluar un modelo de Árbol de Decisión.
dt_model = DecisionTreeClassifier(random_state=42)
dt_model.fit(X_train, y_train)
y_pred_dt = dt_model.predict(X_test)
accuracy_dt = accuracy_score(y_test, y_pred_dt)
accuracies['Árbol de Decisión'] = accuracy_dt
print(f"Precisión del modelo de Árbol de Decisión:
{accuracy_dt:.4f}")
# 5. Entrenar y evaluar un modelo de Random Forest.
rf_model = RandomForestClassifier(random_state=42)
Página | 3
Asignatura:
Carrera: ingeniería en sistemas
Título:
_____________________________________________________________
rf_model.fit(X_train, y_train)
y_pred_rf = rf_model.predict(X_test)
accuracy_rf = accuracy_score(y_test, y_pred_rf)
accuracies['Random Forest'] = accuracy_rf
print(f"Precisión del modelo de Random Forest:
{accuracy_rf:.4f}")
# 6. Comparar las precisiones de los tres modelos.
print("\n--- Comparación de Precisiones ---")
for model_name, accuracy in accuracies.items():
print(f"{model_name}: {accuracy:.4f}")
# Opcional: Identificar el mejor modelo
best_model = max(accuracies, key=accuracies.get)
print(f"\nEl modelo con la mayor precisión es: {best_model}
con una precisión de {accuracies[best_model]:.4f}")
except Exception as e:
print(f"Error durante el entrenamiento de los modelos:
{e}")
print("Verifica que los datos estén correctamente
preparados.")
else:
print("\nNo se pudo proceder con el Ejercicio de Comparación de
Modelos - Titanic debido a un error en la carga del archivo.")
import pandas as pd
from sklearn.model_selection import train_test_split
from sklearn.feature_extraction.text import TfidfVectorizer
import re # Para limpieza de texto
# --- Carga del dataset (re-incluido para asegurar que este script sea
ejecutable por sí mismo) ---
Página | 4
Asignatura:
Carrera: ingeniería en sistemas
Título:
_____________________________________________________________
try:
df_opiniones = pd.read_csv('opiniones_productos.csv',sep=';',
encoding='utf-8')
print("Dataset 'opiniones_productos.csv' cargado exitosamente para
preprocesamiento de texto.")
except FileNotFoundError:
print("Error: El archivo 'opiniones_productos.csv' no se encuentra.
Asegúrate de que esté en el directorio correcto.")
exit()
# 1. Definir características (X) y la variable objetivo (y)
X = df_opiniones['reviews']
y = df_opiniones['labels']
print(f"\nCantidad total de reseñas: {len(X)}")
print(f"Cantidad total de etiquetas: {len(y)}")
# 2. Limpieza básica del texto
# Función para limpiar el texto: convertir a minúsculas y eliminar
caracteres no alfabéticos
def clean_text(text):
text = text.lower() # Convertir a minúsculas
text = re.sub(r'[^a-z\s]', '', text) # Eliminar todo lo que no sea
una letra o espacio
return text
print("\nAplicando limpieza básica a las reseñas...")
X_cleaned = X.apply(clean_text)
print("Limpieza de texto completada. Ejemplo de reseña limpia:")
print(X_cleaned.iloc[0]) # Mostrar la primera reseña limpia
# 3. Vectorización TF-IDF
# Inicializar TfidfVectorizer
# min_df: ignora términos que aparecen en menos de 5 documentos
# max_df: ignora términos que aparecen en más del 80% de los documentos
# stop_words: elimina palabras comunes que no aportan mucho significado
(ej. 'el', 'la', 'un')
tfidf_vectorizer = TfidfVectorizer(min_df=5, max_df=0.8,
stop_words='english')
# 'english' para español, necesitarías descargar 'stopwords' de NLTK o
tener una lista personalizada.
# Por simplicidad y dado que los textos suelen estar en inglés en este
tipo de datasets, usaremos 'english'.
# Si las reseñas son en español, sería necesario adaptar esto.
print("\nRealizando vectorización TF-IDF...")
# Ajustar (fit) y transformar (transform) las reseñas limpias
X_tfidf = tfidf_vectorizer.fit_transform(X_cleaned)
Página | 5
Asignatura:
Carrera: ingeniería en sistemas
Título:
_____________________________________________________________
print(f"Dimensiones de la matriz TF-IDF: {X_tfidf.shape}")
print(f"Número de características (palabras/términos) después de TF-
IDF: {X_tfidf.shape[1]}")
# 4. División en conjuntos de entrenamiento y prueba
# Usamos un 80% para entrenamiento y un 20% para prueba.
# 'random_state' asegura que la división sea reproducible.
X_train, X_test, y_train, y_test = train_test_split(X_tfidf, y,
test_size=0.2, random_state=42)
print(f"\nDimensiones de X_train (TF-IDF): {X_train.shape}")
print(f"Dimensiones de X_test (TF-IDF): {X_test.shape}")
print(f"Dimensiones de y_train: {y_train.shape}")
print(f"Dimensiones de y_test: {y_test.shape}")
print("\nPreprocesamiento de texto y vectorización TF-IDF completados.
Los datos están listos para el entrenamiento del modelo.")
import pandas as pd
import matplotlib.pyplot as plt
from sklearn.ensemble import IsolationForest
import numpy as np
# 1. Cargar el archivo empleados_salarios.csv.
try:
df_empleados = pd.read_csv('empleados_salarios.csv')
print("DataFrame 'empleados_salarios.csv' cargado exitosamente.")
except FileNotFoundError:
print("Error: 'empleados_salarios.csv' no encontrado. Asegúrate de
que el archivo esté en el mismo directorio o proporciona la ruta
completa.")
df_empleados = None
if df_empleados is not None:
Página | 6
Asignatura:
Carrera: ingeniería en sistemas
Título:
_____________________________________________________________
# 2. Preparar los datos seleccionando las características numéricas
relevantes.
features = ['edad', 'experiencia', 'salario']
# Verificar que las columnas necesarias existan
missing_features = [f for f in features if f not in
df_empleados.columns]
if missing_features:
print(f"Error: Faltan las siguientes columnas en
'empleados_salarios.csv': {missing_features}.")
else:
X = df_empleados[features]
print("\nCaracterísticas seleccionadas para la detección de
anomalías:")
print(X.head())
# 3. Inicializar y entrenar un modelo IsolationForest.
# contamination: la proporción esperada de anomalías en el
dataset
iso_forest = IsolationForest(random_state=42,
contamination=0.05) # Asumimos un 5% de anomalías
iso_forest.fit(X)
print("\nModelo IsolationForest entrenado.")
# 4. Realizar predicciones para identificar los puntos de datos
que el modelo considera anomalías.
# -1 para anomalías, 1 para puntos normales
df_empleados['anomalia'] = iso_forest.predict(X)
df_empleados['score_anomalia'] =
iso_forest.decision_function(X) # Puntuación de decisión, más baja =
más anómala
# Filtrar las anomalías
anomalias = df_empleados[df_empleados['anomalia'] == -1]
normales = df_empleados[df_empleados['anomalia'] == 1]
print(f"\nNúmero total de registros: {len(df_empleados)}")
print(f"Número de anomalías detectadas: {len(anomalias)}")
print("\nRegistros identificados como anomalías:")
print(anomalias)
# 5. Visualizar las anomalías identificadas.
# Gráfico de dispersión para visualizar anomalías (puedes
ajustar las columnas para visualizar)
plt.figure(figsize=(10, 7))
plt.scatter(normales['edad'], normales['salario'],
color='blue', label='Normal', s=20, alpha=0.8)
Página | 7
Asignatura:
Carrera: ingeniería en sistemas
Título:
_____________________________________________________________
plt.scatter(anomalias['edad'], anomalias['salario'],
color='red', label='Anomalía', s=60, edgecolors='k', marker='o')
plt.title('Detección de Anomalías en Salarios (Edad vs.
Salario)')
plt.xlabel('Edad')
plt.ylabel('Salario')
plt.legend()
plt.grid(True, linestyle='--', alpha=0.6)
plt.show()
# También se puede visualizar con experiencia
plt.figure(figsize=(10, 7))
plt.scatter(normales['experiencia'], normales['salario'],
color='blue', label='Normal', s=20, alpha=0.8)
plt.scatter(anomalias['experiencia'], anomalias['salario'],
color='red', label='Anomalía', s=60, edgecolors='k', marker='o')
plt.title('Detección de Anomalías en Salarios (Experiencia vs.
Salario)')
plt.xlabel('Experiencia')
plt.ylabel('Salario')
plt.legend()
plt.grid(True, linestyle='--', alpha=0.6)
plt.show()
else:
print("\nNo se pudo proceder con el Ejercicio 9 debido a un error
en la carga del archivo.")
Página | 8
Asignatura:
Carrera: ingeniería en sistemas
Título:
_____________________________________________________________
Página | 9
Asignatura:
Carrera: ingeniería en sistemas
Título:
_____________________________________________________________
Página | 10
Asignatura:
Carrera: ingeniería en sistemas