SVM riesgo de crédito#

import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
import seaborn as sns
from sklearn.model_selection import train_test_split
from sklearn.preprocessing import StandardScaler
from sklearn.svm import SVC
from sklearn.metrics import classification_report, confusion_matrix, accuracy_score
# Cargar el archivo CSV (ya lo hemos cargado y limpiado previamente)
credit_risk_data = pd.read_csv("../credit_risk_data.csv")
credit_risk_data = credit_risk_data.drop(columns=["ID"])

# Dividir los datos en características (X) y etiqueta (y)
X = credit_risk_data.drop(columns=["Estado del Préstamo"])
y = credit_risk_data["Estado del Préstamo"]

# 1. Dividir el conjunto de datos en entrenamiento y prueba
X_train, X_test, y_train, y_test = train_test_split(
    X, y, test_size=0.2, random_state=34
)

# 2. Estandarizar los datos
scaler = StandardScaler()
X_train = scaler.fit_transform(X_train)
X_test = scaler.transform(X_test)
print(
    "Cantidad de precios positivos y negativos en el conjunto de entrenamiento:\n",
    y_train.value_counts(),
)
print(
    "Cantidad de precios positivos y negativos en el conjunto de test:\n",
    y_test.value_counts(),
)
Cantidad de precios positivos y negativos en el conjunto de entrenamiento:
 1    633
0    167
Name: Estado del Préstamo, dtype: int64
Cantidad de precios positivos y negativos en el conjunto de test:
 1    145
0     55
Name: Estado del Préstamo, dtype: int64

Para obtener las probabilidades se debe indicar antes del ajuste del modelo.

probability=True

# 3. Crear un modelo de SVM
svm = SVC(kernel="rbf", probability=True, random_state=34)

# 4. Entrenar el modelo
svm.fit(X_train, y_train)

# 5. Hacer predicciones.
y_pred = svm.predict(X_test)

y_pred_prob = svm.predict_proba(X_test)[:, 1]
# Resultados de la clasificación
print("Valores reales en el conjunto de prueba:\n", y_test[:15].values)
print("Predicciones en el conjunto de prueba:\n", y_pred[:15])
print("Probabilidades de predicción en el conjunto de prueba:\n", y_pred_prob[:15])
Valores reales en el conjunto de prueba:
 [1 1 1 1 1 1 1 1 1 1 1 1 0 0 0]
Predicciones en el conjunto de prueba:
 [1 1 1 1 1 1 1 1 1 1 1 1 0 0 0]
Probabilidades de predicción en el conjunto de prueba:
 [9.99988856e-01 9.52632723e-01 9.99999781e-01 9.23438769e-01
 9.99999996e-01 9.89170651e-01 9.73024036e-01 7.63229498e-01
 8.78832466e-01 9.99992469e-01 9.35181847e-01 9.99999989e-01
 9.31468416e-02 4.74194478e-02 8.58150654e-04]
# 6. Calcular las métricas de evaluación
accuracy = accuracy_score(y_test, y_pred)
conf_matrix = confusion_matrix(y_test, y_pred)
class_report = classification_report(y_test, y_pred)

# Mostrar las métricas de evaluación
print("Accuracy:", accuracy)
print("Classification Report:\n", class_report)

# Crear un mapa de calor para la matriz de confusión con etiquetas
plt.figure(figsize=(8, 6))
sns.heatmap(
    conf_matrix,
    annot=True,
    fmt="d",
    cmap="Blues",
    xticklabels=["Predicho 0", "Predicho 1"],
    yticklabels=["Real 0", "Real 1"],
)
plt.xlabel("Etiqueta Predicha")
plt.ylabel("Etiqueta Real")
plt.title("Matriz de Confusión")
plt.show()
Accuracy: 0.94
Classification Report:
               precision    recall  f1-score   support

           0       0.96      0.82      0.88        55
           1       0.93      0.99      0.96       145

    accuracy                           0.94       200
   macro avg       0.95      0.90      0.92       200
weighted avg       0.94      0.94      0.94       200
../../../_images/output_7_1.png