credit_score_prediction / utils /calculate_probability_prediction.py
Alexis Galvis
fix cred score
1494eb8
import numpy as np
def probability_to_score_v3(prob, base_score=300, max_score=850, threshold=0.326,
expansion_factor_low=3, expansion_factor_high=0.7):
"""
Convierte probabilidades en puntajes de cr茅dito con expansi贸n no lineal
para distribuir mejor en los extremos.
Args:
prob (float): Probabilidad de default.
base_score (int): Puntaje base.
max_score (int): Puntaje m谩ximo.
threshold (float): Valor de corte 贸ptimo.
expansion_factor_low (float): Factor para expandir la parte baja del rango.
expansion_factor_high (float): Factor para expandir la parte alta del rango.
Returns:
score (float): Puntaje de cr茅dito ajustado.
"""
# Invertir la probabilidad para que mayor valor sea mejor score
inverted_prob = 1 - prob
# Punto de corte invertido
inverted_threshold = 1 - threshold
# Determinar si es un score alto o bajo
if inverted_prob >= inverted_threshold: # Buenos clientes
# Normalizar la probabilidad en el rango de buenos
normalized = (inverted_prob - inverted_threshold) / (1 - inverted_threshold)
# Aplicar expansi贸n no lineal
transformed = normalized ** expansion_factor_high
# Mapear al rango superior
mid_score = 600 # Punto medio del rango
score = mid_score + (max_score - mid_score) * transformed
else: # Malos clientes
# Normalizar la probabilidad en el rango de malos
normalized = inverted_prob / inverted_threshold
# Aplicar expansi贸n no lineal para los scores bajos
transformed = normalized ** expansion_factor_low
# Mapear al rango inferior
mid_score = 500 # Punto medio del rango
score = base_score + (mid_score - base_score) * transformed
# Asegurar que el score est茅 dentro del rango permitido
score = np.clip(score, base_score, max_score)
return float(score)