Jika saya memahami pertanyaan dengan benar, Anda telah melatih suatu algoritma yang membagi data Anda menjadi cluster terpisah. Sekarang Anda ingin menetapkan prediksi 1 untuk beberapa bagian dari kluster, dan 0 untuk sisanya. Dan di antara himpunan bagian itu, Anda ingin menemukan himpunan bagian yang optimal-pareto, yaitu mereka yang memaksimalkan tingkat positif sejati dengan jumlah prediksi positif yang tetap (ini setara dengan memperbaiki PPV). Apakah itu benar?N10
Ini kedengarannya seperti masalah ransel ! Ukuran cluster adalah "bobot" dan jumlah sampel positif dalam sebuah cluster adalah "nilai", dan Anda ingin mengisi ransel Anda dengan kapasitas tetap dengan nilai sebanyak mungkin.
v a l u ew e i gjam tkk0N
1k - 1p ∈ [ 0 , 1 ] k
Ini dia contoh python:
import numpy as np
from itertools import combinations, chain
import matplotlib.pyplot as plt
np.random.seed(1)
n_obs = 1000
n = 10
# generate clusters as indices of tree leaves
from sklearn.tree import DecisionTreeClassifier
from sklearn.datasets import make_classification
from sklearn.model_selection import cross_val_predict
X, target = make_classification(n_samples=n_obs)
raw_clusters = DecisionTreeClassifier(max_leaf_nodes=n).fit(X, target).apply(X)
recoding = {x:i for i, x in enumerate(np.unique(raw_clusters))}
clusters = np.array([recoding[x] for x in raw_clusters])
def powerset(xs):
""" Get set of all subsets """
return chain.from_iterable(combinations(xs,n) for n in range(len(xs)+1))
def subset_to_metrics(subset, clusters, target):
""" Calculate TPR and FPR for a subset of clusters """
prediction = np.zeros(n_obs)
prediction[np.isin(clusters, subset)] = 1
tpr = sum(target*prediction) / sum(target) if sum(target) > 0 else 1
fpr = sum((1-target)*prediction) / sum(1-target) if sum(1-target) > 0 else 1
return fpr, tpr
# evaluate all subsets
all_tpr = []
all_fpr = []
for subset in powerset(range(n)):
tpr, fpr = subset_to_metrics(subset, clusters, target)
all_tpr.append(tpr)
all_fpr.append(fpr)
# evaluate only the upper bound, using knapsack greedy solution
ratios = [target[clusters==i].mean() for i in range(n)]
order = np.argsort(ratios)[::-1]
new_tpr = []
new_fpr = []
for i in range(n):
subset = order[0:(i+1)]
tpr, fpr = subset_to_metrics(subset, clusters, target)
new_tpr.append(tpr)
new_fpr.append(fpr)
plt.figure(figsize=(5,5))
plt.scatter(all_tpr, all_fpr, s=3)
plt.plot(new_tpr, new_fpr, c='red', lw=1)
plt.xlabel('TPR')
plt.ylabel('FPR')
plt.title('All and Pareto-optimal subsets')
plt.show();
Kode ini akan menghasilkan gambar yang bagus untuk Anda:
Titik biru adalah (FPR, TPR) tuple untuk semua 210 himpunan bagian, dan garis merah menghubungkan (FPR, TPR) untuk himpunan optimal pareto.
Dan sekarang sedikit garam: Anda tidak perlu repot tentang himpunan bagian sama sekali ! Apa yang saya lakukan adalah menyortir daun pohon berdasarkan fraksi sampel positif di masing-masing. Tapi yang saya dapatkan adalah kurva ROC untuk prediksi probabilitas pohon. Ini berarti, Anda tidak dapat mengungguli pohon dengan memetik daunnya berdasarkan frekuensi target pada set pelatihan.
Anda dapat bersantai dan tetap menggunakan prediksi probabilistik biasa :)