질문을 올바르게 이해했다면 데이터를 분리 된 클러스터 로 나누는 알고리즘을 훈련했습니다 . 이제 예측 을 클러스터의 일부 하위 집합에 할당 하고 을 나머지 클러스터 에 할당하려고 합니다. 그리고 그 하위 집합을 깨달으십시오. 당신은 파레토 최적의 것을 찾고 싶습니다. 맞습니까?엔10
이것은 배낭 문제 와 매우 흡사합니다 ! 군집 크기는 "무게"이고 군집의 양수 샘플 수는 "값"이며 가능한 고정 된 배낭을 최대한 많은 값으로 채우려 고합니다.
배낭 문제에는 정확한 솔루션을 찾기위한 여러 알고리즘이 있습니다 (예 : 동적 프로그래밍). 그러나 유용한 탐욕스러운 해결책 은 클러스터를 (즉, 양수 샘플의 몫) 로 내림차순으로 정렬 하고 첫 번째 취하는 것 입니다. 를 에서 가져 가면 ROC 곡선을 매우 저렴하게 스케치 할 수 있습니다.V a l u ew e i g시간 t케이케이0엔
그리고 첫 번째 군집과 번째 군집 에있는 표본 의 임의 분율 에 을 할당 하면 배낭 문제에 대한 상한 을 얻습니다 . 이를 통해 ROC 곡선의 상한을 그릴 수 있습니다.1k - 1p ∈ [ 0 , 1 ]케이
다음은 파이썬 예제입니다.
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();
이 코드는 멋진 그림을 그릴 것입니다.
파란색 점은 모든 부분 집합에 대한 (FPR, TPR) 튜플 이며, 파레토 최적 부분 집합에 대한 빨간색 선 연결 (FPR, TPR)입니다.210
그리고 이제 약간의 소금 : 당신은 전혀 하위 집합에 대해 신경 쓰지 않아도됩니다 ! 내가 한 것은 각각 양수 샘플의 비율에 따라 나무 잎을 정렬하는 것입니다. 그러나 내가 얻은 것은 정확히 나무의 확률 론적 예측을위한 ROC 곡선입니다. 즉, 훈련 세트의 목표 주파수를 기준으로 잎을 직접 선택하여 나무를 능가 할 수는 없습니다.
평범한 확률 론적 예측을 사용하여 긴장을 풀고 유지할 수 있습니다 :)