pythonを使ったpsi計算の実装について説明します。この記事はPSIシリーズの最後の記事で、モデルスコアのPSI計算、連続特徴量と離散特徴量のPSI計算、hiveでのPSI実装に焦点を当て、kaggleでの簡単な例で終わります。それでは始めましょう
PSI計算のPython実装は以下の通りです:
def psi_calc(actual,predict,bins=10):
'''
: PSI値を計算し、実際のパーセンテージと予想パーセンテージの分布曲線を出力する。
:
actual: 訓練セットのモデルスコアを表す1次元配列または系列。
predict: テストセットのモデルスコアを表す1次元の配列または系列。
bins: デフォルトレートセグメンテーションの数
:
辞書は、キーと値の関係は次のとおりである。{'psi': PSI ,'psi_fig': 実際の分布曲線と予想分布曲線}
'''
psi_dict = {}
actual = np.sort(actual)
predict = np.sort(predict)
actual_len = len(actual)
predict_len = len(predict)
psi_cut = []
actual_bins = []
predict_bins = []
actual_min = actual.min()
actual_max = actual.max()
cuts = []
binlen = (actual_max-actual_min) / bins
for i in range(1, bins):
cuts.append(actual_min+i*binlen)
for i in range(1, (bins+1)):
if i == 1:
lowercut = float('-Inf')
uppercut = cuts[i-1]
elif i == bins:
lowercut = cuts[i-2]
uppercut = float('Inf')
else:
lowercut = cuts[i-2]
uppercut = cuts[i-1]
actualt = ((actual >= lowercut) & (actual < uppercut)).sum()+1
predictt = ((predict >= lowercut) & (predict < uppercut)).sum()+1
actual_pct = (actualt+0.0) / actual_len
predict_pct = (predictt+0.0) / predict_len
psi_cut.append((actual_pct-predict_pct) * math.log(actual_pct/predict_pct))
actual_bins.append(actual_pct)
predict_bins.append(predict_pct)
psi = sum(psi_cut)
nbins = len(actual_bins)
xlab = np.arange(1, nbins+1)
fig = plt.figure()
plt.plot(xlab, np.array(actual_bins),'r',label='actual')
plt.plot(xlab, np.array(predict_bins),'b',label='predict')
plt.legend(loc='best')
plt.title('Psi Curve')
plt.close()
psi_dict['psi'] = psi
psi_dict['psi_fig'] = fig
return psi_dict
様々なビニング法が後で紹介されますが、そのどれもがこのコードのビニングコードを置き換えるために使うことができ、その結果、異なるビンの下でのPSIを得ることができます。
機能PSI計算pythonの実装
上記のコードは、一般的にモデルポイントのPSIを計算するために使用され、変数が連続的であることを前提に、PSIは、離散値の特性を計算するために使用され、離散値の独自の数は、ポイントビンの数よりも少ない場合は、そのような状況を解決するために、上記のコードを書き換える機能のさまざまな種類のPSIを計算するために、コードは次のとおりです:
def fea_psi_calc(actual,predict,bins=10):
'''
: 連続変数と離散変数のPSI値を計算する。
:
actual: 学習セットの変数を表す1次元の配列または系列。
predict: テストセットの変数を表す1次元の配列または系列。
bins: デフォルト率セグメンテーションの数
:
辞書は、キーと値の関係は次のとおりである。{'psi': PSI ,'psi_fig': 実際の分布曲線と予想分布曲線}
'''
psi_dict = {}
actual = np.sort(actual)
actual_distinct = np.sort(list(set(actual)))
predict = np.sort(predict)
predict_distinct = np.sort(list(set(predict)))
actual_len = len(actual)
actual_distinct_len = len(actual_distinct)
predict_len = len(predict)
predict_distinct_len = len(predict_distinct)
psi_cut = []
actual_bins = []
predict_bins = []
actual_min = actual.min()
actual_max = actual.max()
cuts = []
binlen = (actual_max-actual_min) / bins
if (actual_distinct_len<bins):
for i in actual_distinct:
cuts.append(i)
for i in range(2, (actual_distinct_len+1)):
if i == bins:
lowercut = cuts[i-2]
uppercut = float('Inf')
else:
lowercut = cuts[i-2]
uppercut = cuts[i-1]
actualt = ((actual >= lowercut) & (actual < uppercut)).sum()+1
predictt = ((predict >= lowercut) & (predict < uppercut)).sum()+1
actual_pct = (actualt+0.0) / actual_len
predict_pct = (predictt+0.0) / predict_len
psi_cut.append((actual_pct-predict_pct) * math.log(actual_pct/predict_pct))
actual_bins.append(actual_pct)
predict_bins.append(predict_pct)
else:
for i in range(1, bins):
cuts.append(actual_min+i*binlen)
for i in range(1, (bins+1)):
if i == 1:
lowercut = float('-Inf')
uppercut = cuts[i-1]
elif i == bins:
lowercut = cuts[i-2]
uppercut = float('Inf')
else:
lowercut = cuts[i-2]
uppercut = cuts[i-1]
actualt = ((actual >= lowercut) & (actual < uppercut)).sum()+1
predictt = ((predict >= lowercut) & (predict < uppercut)).sum()+1
actual_pct = (actualt+0.0) / actual_len
predict_pct = (predictt+0.0) / predict_len
psi_cut.append((actual_pct-predict_pct) * math.log(actual_pct/predict_pct))
actual_bins.append(actual_pct)
predict_bins.append(predict_pct)
psi = sum(psi_cut)
nbins = len(actual_bins)
xlab = np.arange(1, nbins+1)
psi_dict['psi'] = psi
return psi_dict
しかし、計算されたPSI値は、10進数で計算される通常のデフォルトのpsi値とは若干異なり、閾値を決定する際に経験に応じて適切に調整されます。
PSI計算ハイブの実装
上記のPSI計算方法の特徴のPythonの実装を紹介し、実際には、オンライン環境では、効果を確認するために迅速なオンライン反復を達成するために、より便利な武器は間違いなくSQLであり、ここではSQLを使用してPSI計算の実装を紹介します。
select
feature,
dt,
sum(psi_bins) as psi
from
(
select
feature,
bins,
(last_rate - rate) * ln(last_rate / rate) as psi_bins,
dt
from
(
select
feature,
bins,
rate,
lead(rate, 1 , 0.000001) over(
partition by feature,
bins
order by
dt desc
) as last_rate,
dt
from
table name
) a
) b
ここで前提は、特徴の計算が離散化されている、離散化の一般的な特徴は、ケースで解決することができますとき;同時に、事前に計算され、異なるサブボックスの値の各特徴は、この部分の割合が比較的単純であるため、導入されませんが、質問がある私信で交換することができます。以下は、ウィンドウ関数のリードの使用への主な導入です。
hive lead関数
ハイブは、関数の誕生の分析のために特別に、また、ウィンドウ関数として知られている関数のクラスがあり、ウィンドウの操作が大幅にテーブルの自己結合操作を簡素化し、より高い効率を持って、その遅れとリードは、代表の1つです。
kaggle
kaggleは非常に良いプラットフォームです、多くのコンテスト、プロジェクトがあり、また、データセットは、実験のために供給することができます。同時に、kaggleはまた、みんなのための無料のクラウドコンピューティングを提供し、つまり、オンラインカーネルは、本当に手にkaggleは、私が感じている世界です!
Hive 分析関数のリード、ラグ アプリケーション例
https://www.kaggle.com/wendykan/lending-club-loan-data
https://www.kaggle.com/janiobachmann/lending-club-risk-analysis-and-metrics
https://www.kaggle.com/monkebai/lending-club-baseline/edit




