Wichtige Modellmetriken für maschinelles Lernen verstehen – Gini/KS in Python | von Conniezhou | Juni 2023

0
25


Modelle für maschinelles Lernen sind leistungsstarke Werkzeuge, um Vorhersagen zu treffen und Erkenntnisse aus Daten zu gewinnen. Die Bewertung der Leistung dieser Modelle ist jedoch von entscheidender Bedeutung, um ihre Wirksamkeit sicherzustellen.

In diesem Blogbeitrag werden wir mehrere wichtige Modellmetriken für maschinelles Lernen untersuchen und diskutieren, warum sie für die Bewertung der Modellleistung unerlässlich sind. Wir werden auch eine Code-Implementierung in Python bereitstellen, um diese Metriken zu berechnen.

Foto von eskay lim An Unsplash
  1. KS (Kolmogorov-Smirnov):

KS ist eine beliebte Metrik zur Messung der Trennung zwischen positiven und negativen Stichproben in einem binären Klassifizierungsproblem. Dabei wird bewertet, wie intestine ein Modell zwischen den beiden Klassen unterscheidet. KS reicht von 0 bis 1, wobei höhere Werte eine bessere Trennung bedeuten. Ein KS-Wert von 1 bedeutet perfekte Unterscheidung.

import os
import random
import numpy as np
import pandas as pd
from modelEvaluation import *
from ExcelHelper import *
import modelEvaluation

def random_seed(seed):
os.environ['PYTHONHASHSEED'] = str(seed) # Python basic
np.random.seed(seed)
random.seed(seed) # Python random

def KS(actual_val, pred_val, wt=1):
'''
Calculates KS (Kolmogorov-Smirnov) statistic.

Args:
actual_val: Precise values.
pred_val: Predicted values.
wt: Weight (elective, default is 1).

Returns:
KS statistic.
'''
temp_dat = pd.DataFrame({'Actual_Val': np.array(actual_val), 'Pred_Val': np.array(pred_val)})

if isinstance(wt, int):
temp_dat['wt'] = wt
else:
temp_dat['wt'] = wt.values

temp_dat = temp_dat.pattern(frac=1)
temp_dat.sort_values(by=['Pred_Val'], inplace=True, ascending=True)

temp_dat['1sWt'] = temp_dat['Actual_Val'] * temp_dat['wt']
cnt_1 = temp_dat.groupby(['Pred_Val'])['1sWt'].sum()

temp_dat['0sWt'] = (1 - temp_dat['Actual_Val']) * temp_dat['wt']
cnt_0 = temp_dat.groupby(['Pred_Val'])['0sWt'].sum()

sum_1 = np.cumsum(cnt_1 / sum(cnt_1))
sum_0 = np.cumsum(cnt_0 / sum(cnt_0))

ks = max(abs(sum_1 - sum_0))

return ks

2. KS Dezil,

ks_decile ist eine various Model der KS-Metrik, die die Daten basierend auf vorhergesagten Wahrscheinlichkeiten in 10 gleich große Gruppen (Dezile) aufteilt. Es misst den maximalen KS-Wert zwischen diesen Dezilen und liefert Einblicke in die Leistung des Modells in verschiedenen Datensegmenten.

def KS_decile(actual_val, pred_val, wt=1):
'''
Calculates KS (Kolmogorov-Smirnov) statistic based mostly on 10 deciles.

Args:
actual_val: Precise values.
pred_val: Predicted values.
wt: Weight (elective, default is 1).

Returns:
KS statistic.
'''
temp_dat_s = modelEvaluation.RankOrderBinary_V2(d_samp=actual_val, dpred=pred_val, nquantiles=10)
ks = np.max(temp_dat_s['KS'])
return ks

3. qKS (Quantil KS):

qKS ist eine Variante der KS-Metrik, die das Quantil mit dem maximalen KS-Wert identifiziert. Es berechnet KS für verschiedene Quantile der vorhergesagten Wahrscheinlichkeiten und hilft dabei, das spezifische Quantil zu identifizieren, bei dem die Leistung des Modells am stärksten ist.

import pandas as pd
import numpy as np

def qKS(actual_val, pred_val, wt=1, q=10):
'''
Calculates the quantile wherein KS is max.

Args:
actual_val: Precise values.
pred_val: Predicted values.
wt: Weight (elective, default is 1).
q: Variety of quantiles (elective, default is 10).

Returns:
DataFrame with KS values for every quantile and the utmost KS worth.
'''
temp_dat = pd.DataFrame({'Actual_Val': np.array(actual_val), 'Pred_Val': np.array(pred_val)})
dfKS = pd.DataFrame()

if isinstance(wt, int): # or len(wt)==1
temp_dat['Actual_Val'] = temp_dat['Actual_Val'] * wt
dfKS['cnt_1'] = temp_dat.groupby(['Pred_Val']).sum()['Actual_Val']
temp_dat['Actual_Val'] = wt - temp_dat['Actual_Val']
dfKS['cnt_2'] = temp_dat.groupby(['Pred_Val']).sum()['Actual_Val']
else:
temp_dat['wt'] = wt
temp_dat['Actual_Val'] = temp_dat['Actual_Val'] * temp_dat['wt']
dfKS['cnt_1'] = temp_dat.groupby(['Pred_Val']).sum()['Actual_Val']
temp_dat['Actual_Val'] = temp_dat['wt'] - temp_dat['Actual_Val']
dfKS['cnt_2'] = temp_dat.groupby(['Pred_Val']).sum()['Actual_Val']

dfKS['cumsum1'] = np.cumsum(dfKS['cnt_1'] / sum(dfKS['cnt_1']))
dfKS['cumsum2'] = np.cumsum(dfKS['cnt_2'] / sum(dfKS['cnt_2']))
dfKS['finalm'] = abs(dfKS['cumsum1'] - dfKS['cumsum2'])

dfKS.reset_index(inplace=True)
dfKS['label'] = pd.qcut(dfKS['Pred_Val'].rank(technique='first'), q=q, labels=False)
dfKSbin = dfKS.groupby('label').max()['finalm']

return dfKSbin, max(dfKSbin)

Die Berechnung der KS-Statistik innerhalb jedes Quantils hilft dabei, festzustellen, ob es signifikante Unterschiede zwischen den vorhergesagten und tatsächlichen Werten innerhalb jedes Segments gibt. Ein höherer KS-Wert innerhalb eines Quantils weist auf eine bessere Unterscheidung zwischen positiven und negativen Instanzen hin, was darauf hindeutet, dass das Modell innerhalb dieses spezifischen Bereichs vorhergesagter Wahrscheinlichkeiten eine gute Leistung erbringt.

4. Gini:

Gini ist eine weitere Metrik, die häufig bei binären Klassifizierungsaufgaben verwendet wird. Es misst die Ungleichheit der vorhergesagten Wahrscheinlichkeiten der positiven Klasse. Ein höherer Gini-Koeffizient weist auf ein Modell mit besserer Vorhersagekraft hin. Gini-Werte reichen von 0 bis 1, wobei 1 eine perfekte Vorhersage darstellt.

def gini(actual_val, pred_val, wt=1):
'''Calculate Gini coefficient.

Args:
actual_val (array-like): Array of precise values.
pred_val (array-like): Array of predicted values.
wt (int or array-like, elective): Weight for every remark. Default is 1.

Returns:
float: Gini coefficient.
'''
temp_dat = pd.DataFrame({'Actual_Val': np.array(actual_val), 'Pred_Val': np.array(pred_val)})

if isinstance(wt, int):
temp_dat['wt'] = wt
else:
temp_dat['wt'] = wt.values

temp_dat = temp_dat.pattern(frac=1)
temp_dat['Actual_Val'] = temp_dat['Actual_Val'] * temp_dat['wt']
cnt_1 = temp_dat.groupby(['Pred_Val'], kind=True).sum()

temp_dat['Actual_Val'] = wt - temp_dat['Actual_Val']
cnt_2 = temp_dat.groupby(['Pred_Val']).sum()

cnt_1_cum = np.cumsum(cnt_1.Actual_Val / sum(cnt_1.Actual_Val))
Gini_y = 2 * cnt_1_cum - cnt_1.Actual_Val / sum(cnt_1.Actual_Val)
Gini_x = cnt_2.Actual_Val / sum(cnt_2.Actual_Val)

return 1 - sum(Gini_y * Gini_x)

def gini_evaluation(df, linear=0):
'''Consider Gini coefficient.

Args:
df (DataFrame): Enter dataframe containing related columns.
linear (int, elective): Flag indicating linear calculation. Default is 0.

Returns:
float: Gini coefficient analysis.
'''
cumacct = record(df['Cum_Pct_Cust'])[:-1]
cumacct2 = [0] + cumacct[:-1]
ginniVec = [i + j for i, j in zip(cumacct, cumacct2)]

if linear == 1:
ginniDist = record(df['Pct_Actual'])
else:
ginniDist = record(df['Pct_1'])

ginniMetric = 1 - sum([i * j for i, j in zip(ginniVec, ginniDist)])
return ginniMetric

Die Bewertung der Leistung von Modellen für maschinelles Lernen ist entscheidend, um genaue Vorhersagen und zuverlässige Erkenntnisse zu gewährleisten. Durch das Verstehen und Berechnen wichtiger Metriken wie KS kann Gini wertvolle Erkenntnisse über die Wirksamkeit ihrer Modelle gewinnen. Diese Metriken ermöglichen eine quantitative Bewertung der Leistung des Modells und helfen dabei, Bereiche mit Verbesserungspotenzial zu identifizieren. Durch die Implementierung dieser Metriken in Python können Sie Ihre Modelle einfach bewerten und fundierte Entscheidungen auf der Grundlage ihrer Leistung treffen.



Source link

HINTERLASSEN SIE EINE ANTWORT

Please enter your comment!
Please enter your name here