|
|
@ -34,7 +34,7 @@ class CandidateClassifierSpecs:
|
|
|
|
|
|
|
|
|
|
|
|
def __init__(
|
|
|
|
def __init__(
|
|
|
|
self,
|
|
|
|
self,
|
|
|
|
classifier: Callable[[], Classifier],
|
|
|
|
classifier: Classifier,
|
|
|
|
min_samples: int = 0,
|
|
|
|
min_samples: int = 0,
|
|
|
|
) -> None:
|
|
|
|
) -> None:
|
|
|
|
self.min_samples = min_samples
|
|
|
|
self.min_samples = min_samples
|
|
|
@ -64,13 +64,13 @@ class AdaptiveClassifier(Classifier):
|
|
|
|
if candidates is None:
|
|
|
|
if candidates is None:
|
|
|
|
candidates = {
|
|
|
|
candidates = {
|
|
|
|
"knn(100)": CandidateClassifierSpecs(
|
|
|
|
"knn(100)": CandidateClassifierSpecs(
|
|
|
|
classifier=lambda: ScikitLearnClassifier(
|
|
|
|
classifier=ScikitLearnClassifier(
|
|
|
|
KNeighborsClassifier(n_neighbors=100)
|
|
|
|
KNeighborsClassifier(n_neighbors=100)
|
|
|
|
),
|
|
|
|
),
|
|
|
|
min_samples=100,
|
|
|
|
min_samples=100,
|
|
|
|
),
|
|
|
|
),
|
|
|
|
"logistic": CandidateClassifierSpecs(
|
|
|
|
"logistic": CandidateClassifierSpecs(
|
|
|
|
classifier=lambda: ScikitLearnClassifier(
|
|
|
|
classifier=ScikitLearnClassifier(
|
|
|
|
make_pipeline(
|
|
|
|
make_pipeline(
|
|
|
|
StandardScaler(),
|
|
|
|
StandardScaler(),
|
|
|
|
LogisticRegression(),
|
|
|
|
LogisticRegression(),
|
|
|
@ -79,7 +79,7 @@ class AdaptiveClassifier(Classifier):
|
|
|
|
min_samples=30,
|
|
|
|
min_samples=30,
|
|
|
|
),
|
|
|
|
),
|
|
|
|
"counting": CandidateClassifierSpecs(
|
|
|
|
"counting": CandidateClassifierSpecs(
|
|
|
|
classifier=lambda: CountingClassifier(),
|
|
|
|
classifier=CountingClassifier(),
|
|
|
|
),
|
|
|
|
),
|
|
|
|
}
|
|
|
|
}
|
|
|
|
self.candidates = candidates
|
|
|
|
self.candidates = candidates
|
|
|
@ -101,7 +101,7 @@ class AdaptiveClassifier(Classifier):
|
|
|
|
for (name, specs) in self.candidates.items():
|
|
|
|
for (name, specs) in self.candidates.items():
|
|
|
|
if n_samples < specs.min_samples:
|
|
|
|
if n_samples < specs.min_samples:
|
|
|
|
continue
|
|
|
|
continue
|
|
|
|
clf = specs.classifier()
|
|
|
|
clf = specs.classifier.clone()
|
|
|
|
clf.fit(x_train, y_train)
|
|
|
|
clf.fit(x_train, y_train)
|
|
|
|
proba = clf.predict_proba(x_train)
|
|
|
|
proba = clf.predict_proba(x_train)
|
|
|
|
# FIXME: Switch to k-fold cross validation
|
|
|
|
# FIXME: Switch to k-fold cross validation
|
|
|
@ -115,3 +115,6 @@ class AdaptiveClassifier(Classifier):
|
|
|
|
super().predict_proba(x_test)
|
|
|
|
super().predict_proba(x_test)
|
|
|
|
assert self.classifier is not None
|
|
|
|
assert self.classifier is not None
|
|
|
|
return self.classifier.predict_proba(x_test)
|
|
|
|
return self.classifier.predict_proba(x_test)
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
def clone(self) -> "AdaptiveClassifier":
|
|
|
|
|
|
|
|
return AdaptiveClassifier(self.candidates)
|
|
|
|