Spaces:
Sleeping
Sleeping
File size: 1,965 Bytes
d790594 1e07e50 d790594 1494eb8 d790594 1494eb8 d790594 1e07e50 |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 |
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) |