যদি আমি প্রশ্নটি সঠিকভাবে বুঝতে পারি তবে আপনি একটি অ্যালগরিদমকে প্রশিক্ষণ দিয়েছিলেন যা আপনার উপাত্তগুলিকে ডিসজেয়েন্ট ক্লাস্টারে বিভক্ত করে। এখন আপনি ক্লাস্টারগুলির কয়েকটি উপসেটে পূর্বাভাস এবং তাদের বাকী নির্ধারণ করতে চান । এবং এই সাবসেটগুলির মধ্যে আপনি প্যারিটো-অনুকূলতমগুলি অনুসন্ধান করতে চান, অর্থাত্ যারা নির্দিষ্ট ধনাত্মক পূর্বাভাসের সংখ্যার ভিত্তিতে সত্য পজিটিভ হারকে সর্বাধিক করে তোলে (এটি পিপিভি ঠিক করার সমতুল্য)। এটা কি ঠিক?1 0N10
এটিকে ন্যাপস্যাক সমস্যার মতো মনে হচ্ছে ! ক্লাস্টারের আকারগুলি "ওজন" এবং একটি ক্লাস্টারে ধনাত্মক নমুনার সংখ্যা হ'ল "মান", এবং আপনি যতটা সম্ভব মান সহ আপনার স্থির সক্ষমতার ন্যাপস্যাকটি পূরণ করতে চান।
সঠিক সমাধান (যেমন ডায়নামিক প্রোগ্রামিং দ্বারা) সন্ধানের জন্য ন্যাপস্যাক সমস্যার বেশ কয়েকটি অ্যালগরিহম রয়েছে। তবে একটি কার্যকর লোভী সমাধান হ'ল আপনার ক্লাস্টারগুলিকে of (যা ইতিবাচক নমুনাগুলির ভাগ) এর ক্রম হ্রাস করে বাছাই করা এবং প্রথম নেওয়া । আপনি যদি থেকে পর্যন্ত নেন , আপনি খুব সস্তায় আপনার আরওসি বক্ররেখা স্কেচ করতে পারেন। কেকেvalueweightkkএন0N
আর তুমি ধার্য যদি প্রথম ক্লাস্টার এবং র্যান্ডম ভগ্নাংশ থেকে মধ্যে নমুনা ম ক্লাস্টার, আপনি পেতে উপরের আবদ্ধ ঝোলা সমস্যা। এটির সাহায্যে আপনি আপনার আরওসি বক্ররেখার জন্য উপরের সীমাটি আঁকতে পারেন।কে - 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
এবং এখন বিট লবণ: আপনার সাবটাইটগুলি নিয়ে মোটেই বিরক্ত করার দরকার নেই ! আমি যা করেছি তা হ'ল প্রতিটি পাতাতে ইতিবাচক নমুনার ভগ্নাংশ দ্বারা গাছের পাতা সাজানো। তবে যা পেয়েছি তা হ'ল গাছের সম্ভাব্য ভবিষ্যদ্বাণীটির জন্য আরওসি বক্ররেখা। এর অর্থ, আপনি প্রশিক্ষণ সেটে টার্গেটের ফ্রিকোয়েন্সিগুলির উপর ভিত্তি করে গাছটিকে পাতাগুলি হাতে তুলে পরাভূত করতে পারবেন না।
আপনি শিথিল করতে পারেন এবং সাধারণ সম্ভাব্য ভবিষ্যদ্বাণীটি ব্যবহার চালিয়ে যেতে পারেন :)