blog

PSIの計算を実装するためにhiveとpythonの複数の方法を使用する

PSI計算pythonの実装\n\nPSI計算のpython実装は以下の通りです:\ndef psi_calc.\n '''\n 関数: PSI 値を計算し、実際と予想されるパーセンテージ分布を出力し...

Aug 7, 2020 · 4 min. read
シェア
PSI計算のパイソン実装

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は、私が感じている世界です!








イメージ







イメージ[2]

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



Read next

つのjavaコマンドと一見単純な質問

比較はメモリ上のアドレスです。 文字列定数プールで、文字列を生成するための新しい方法以外の場合。文字列定数プールはメソッド領域にあり、jdk1.7以下ではヒープから分離されています。文字列定数プールに文字列を生成する新しい方法でない場合は、文字列定数プールが文字列にすでに存在するかどうかをチェックします。

Aug 6, 2020 · 5 min read