यदि मैंने प्रश्न को सही ढंग से समझा है, तो आपने एक एल्गोरिथ्म को प्रशिक्षित किया है जो आपके डेटा को डिसऑर्डर क्लस्टर में विभाजित करता है । अब आप समूहों के कुछ सबसेट के लिए , और बाकी के को भविष्यवाणी असाइन करना चाहते हैं। और उन सबमेट्स के बीच में, आप पेरेटो-इष्टतम वाले को ढूंढना चाहते हैं, अर्थात जो लोग सकारात्मक सकारात्मक दर देते हैं जो निश्चित संख्या में सकारात्मक भविष्यवाणियां करते हैं (यह पीपीवी को ठीक करने के बराबर है)। क्या यह सही है?१ ०N10
यह बहुत समस्या की तरह लग रहा है ! क्लस्टर आकार "वेट" हैं और एक क्लस्टर में सकारात्मक नमूनों की संख्या "मान" हैं, और आप अपनी क्षमता के अनुसार निश्चित क्षमता के अपने बक्स को भरना चाहते हैं।
सटीक समाधान खोजने के लिए नैकपैक समस्या में कई अल्गोरिम्स हैं (जैसे गतिशील प्रोग्रामिंग द्वारा)। लेकिन एक उपयोगी लालची समाधान अपने समूहों को (यानी, सकारात्मक नमूनों का हिस्सा) के घटते क्रम में क्रमबद्ध करना है , और पहले । यदि आप से तक लेते हैं , तो आप अपने ROC वक्र को बहुत सस्ते में स्केच कर सकते हैं। kk0Nvalueweightkk0N
और अगर आप आवंटित करता है, तो पहले को समूहों और यादृच्छिक अंश के लिए में नमूने के वें क्लस्टर, आप करने के ऊपरी बाध्य नेप्सेक समस्या है। इसके साथ, आप अपने आरओसी वक्र के लिए ऊपरी सीमा खींच सकते हैं।के - 1 पी ∈ [ 0 , 1 ] के1k−1p∈[0,1]k
यहाँ एक अजगर उदाहरण दिया गया है:
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();
यह कोड आपके लिए एक अच्छी तस्वीर खींचेगा:
नीले डॉट्स सभी सबसेट के लिए (एफपीआर, टीपीआर) ट्यूपल्स हैं और पेरेटो-इष्टतम सबसेट के लिए रेड लाइन कनेक्ट (एफपीआर, टीपीआर) हैं।210
और अब नमक का थोड़ा सा: आपको सबसेट के बारे में परेशान करने की ज़रूरत नहीं है ! मैंने जो किया वह प्रत्येक में सकारात्मक नमूनों के अंश द्वारा पेड़ की पत्तियों को छांटा गया। लेकिन मुझे जो मिला वह पेड़ की संभाव्य भविष्यवाणी के लिए आरओसी वक्र है। इसका मतलब है, आप प्रशिक्षण सेट में लक्ष्य आवृत्तियों के आधार पर इसके पत्तों को हाथ से उठाकर पेड़ से बाहर नहीं निकल सकते।
आप आराम कर सकते हैं और साधारण संभाव्य भविष्यवाणी का उपयोग कर सकते हैं :)