SuperAPI AI Directory

active-learning-system

Office & productivity

View repository

Updated 10-15 21:08

About this skill

Active Learning System Expert

Expert in active learning systems for machine learning.

Core strategies

  • Uncertainty Sampling: Selecting examples with the lowest model confidence
  • Query by Committee: Using ensemble disagreement
  • Expected Model Change: Selecting the most informative samples
  • Diversity-based Selection: Covering the feature space

The core active learning loop

from modAL import ActiveLearner
from modAL.uncertainty import uncertainty_sampling

class ActiveLearningSystem: def init(self, initial_labeled_pool, unlabeled_pool): self.labeled_X, self.labeled_y = initial_labeled_pool self.unlabeled_X = unlabeled_pool

    self.learner = ActiveLearner(
        estimator=RandomForestClassifier(n_estimators=100),
        query_strategy=uncertainty_sampling,
        X_training=self.labeled_X,
        y_training=self.labeled_y
    )

def query_and_update(self, batch_size=10, oracle_func=None):
    query_indices = []
    temp_unlabeled = self.unlabeled_X.copy()

    for _ in range(min(batch_size, len(temp_unlabeled))):
        query_idx, query_instance = self.learner.query(temp_unlabeled)
        query_indices.append(query_idx)
        temp_unlabeled = np.delete(temp_unlabeled, query_idx, axis=0)

    queried_X = self.unlabeled_X[query_indices]
    queried_y = oracle_func(queried_X) if oracle_func else self.simulate_oracle(queried_X)

    self.learner.teach(queried_X, queried_y)
    self.unlabeled_X = np.delete(self.unlabeled_X, query_indices, axis=0)

    return query_indices, queried_X, queried_y

## Query by Committee

```python
class CommitteeActiveLearner:
    def __init__(self, X_initial, y_initial):
        self.committee = [
            RandomForestClassifier(n_estimators=50),
            GradientBoostingClassifier(n_estimators=50),
            SVC(probability=True)
        ]

        for clf in self.committee:
            clf.fit(X_initial, y_initial)

    def query_by_committee(self, X_pool, n_instances=1):
        disagreements = []

        for x in X_pool:
            predictions = [clf.predict_proba([x])[0] for clf in self.committee]
            avg_pred = np.mean(predictions, axis=0)
            disagreement = -np.sum(avg_pred * np.log(avg_pred + 1e-10))
            disagreements.append(disagreement)

        selected_indices = np.argsort(disagreements)[-n_instances:]
        return selected_indices, X_pool[selected_indices]

Performance monitoring

class ActiveLearningMonitor:
    def track_performance(self, model, X_test, y_test, n_annotations):
        accuracy = accuracy_score(y_test, model.predict(X_test))
        self.performance_history.append(accuracy)
        self.annotation_costs.append(n_annotations)

    def calculate_learning_efficiency(self):
        performance_gains = np.diff(self.performance_history)
        annotation_increments = np.diff(self.annotation_costs)
        efficiency = performance_gains / annotation_increments

        return {
            'current_efficiency': efficiency[-1],
            'average_efficiency': np.mean(efficiency),
            'efficiency_trend': np.polyfit(range(len(efficiency)), efficiency, 1)[0]
        }

    def suggest_stopping_criterion(self):
        efficiency = self.calculate_learning_efficiency()
        if efficiency['current_efficiency'] < 0.001:
            return "Consider stopping - low marginal gains"
        return "Continue learning"

Best practices

Cold start strategy

  • Use stratified sampling for the initial set
  • Ensure all classes are represented
  • Start with at least 5-10 examples per class

Batch size optimization

  • Small batches (5-20) for high uncertainty
  • Large batches (50-100) for expensive annotation
  • Take annotator fatigue into account

Common pitfalls

  • Ignoring class imbalance
  • Over-reliance on confidence without calibration
  • Neglecting annotator agreement
  • Not accounting for annotation noise