import numpy as np
def focalloss(p, y, gamma=5):
# https://blog.csdn.net/JNingWei/article/details/80038594
# https://www.cnblogs.com/king-lps/p/9497836.html
r = -(1 - p) ** gamma * np.log(np.maximum(1e-8, p)) * y
r+= - p ** gamma * np.log( np.maximum(1e-8, 1 - p)) * (1 - y )
return r
def logloss(p, y):
r = -np.log(np.maximum(1e-8, p)) * y
r+= -np.log( np.maximum(1e-8, 1 - p)) * (1 - y )
return r
#%%
p = np.arange(101) / 100
y1 = np.ones_like(p)
y2 = np.zeros_like(p)
#%%
from pylab import plt
plt.figure(figsize=(14, 10), dpi=300)
plt.plot(p, focalloss(p, y1, 0.5), 'y-',
p, focalloss(p, y1, 1), 'b-',
p, focalloss(p, y1, 3), 'r--',
p, focalloss(p, y1, 5), 'g-.',
p, focalloss(p, y1, 0), 'g-*',
p, logloss(p, y1), 'y--',
p, logloss(p, y2), 'y-',
p, focalloss(p, y2, 5), 'g-.',
)
plt.ylim((-0.1, 5))
plt.xlim((-0.01, 1))
plt.legend(['gamma = 0.5', 'gamma = 1','gamma = 3', 'gamma = 5','gamma = 0',
'logloss', 'logloss y2', 'y2 = 5'])
![](https://img2020.cnblogs.com/blog/698752/202008/698752-20200828161355143-1587686666.png)