-
Notifications
You must be signed in to change notification settings - Fork 3
Expand file tree
/
Copy pathactive_learning_example.py
More file actions
69 lines (51 loc) · 2.57 KB
/
Copy pathactive_learning_example.py
File metadata and controls
69 lines (51 loc) · 2.57 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
import numpy
from pytolemaic import Metrics
from pytolemaic import PyTrust
from pytolemaic.utils.general import GeneralUtils
from resources.datasets.uci_adult import UCIAdult
from sklearn.ensemble import RandomForestClassifier
def run(use_active_learning=True, max_samples = 2500, batch_size = 100, train_base_ratio=0.001, fast=False):
if fast:
max_samples = 500
dataset = UCIAdult()
train, test = dataset.as_dmd()
metric = Metrics.recall.name
unlabeled, train_base = train.split(ratio=train_base_ratio)
print("# samples: Test: {}, train_base: {}, unlabeled:{}"
.format(test.n_samples, train_base.n_samples, unlabeled.n_samples))
x_samples=[]
y_score =[]
while train_base.n_samples < train.n_samples and unlabeled.n_samples > 100 and train_base.n_samples<max_samples:
model = GeneralUtils.simple_imputation_pipeline(estimator=RandomForestClassifier(random_state=0))
# model = GeneralUtils.simple_imputation_pipeline(estimator=KNeighborsClassifier(n_neighbors=5))
# model = GeneralUtils.simple_imputation_pipeline(estimator=LogisticRegression())
model.fit(train_base.values, train_base.target.ravel())
pytrust = PyTrust(
model=model,
xtrain=train_base,
xtest=test,
metric=metric)
score = pytrust.scoring_report.metric_scores['recall'].to_dict()['value']
print("With {} samples, score is {:.3g}".format(train_base.n_samples,
score))
x_samples.append(train_base.n_samples)
y_score.append(score)
uncertainty = pytrust.create_uncertainty_model('probability', do_analysis=False)
y = uncertainty.uncertainty(unlabeled)
if use_active_learning:
inds = numpy.arange(len(y))
sorted_y, sorted_inds = list(zip(*sorted(list(zip(y, inds)), key=lambda p: p[0], reverse=True)))
else: # random sampling
sorted_inds = numpy.random.permutation(len(y))
batch_size = min(batch_size, len(sorted_inds)-100)
train_base.append(unlabeled.split_by_indices(sorted_inds[:batch_size]))
unlabeled = unlabeled.split_by_indices(sorted_inds[batch_size:])
return x_samples, y_score
if __name__ == '__main__':
from matplotlib import pyplot as plt
x_samples, y_score = run(use_active_learning=True)
plt.plot(x_samples, y_score, '.-b', label='active learning')
x_samples, y_score = run(use_active_learning=False)
plt.plot(x_samples, y_score, '.-r', label='random sampling')
plt.legend()
plt.show()