In [ ]:
Copied!
from sawmil.data import generate_dummy_bags
import numpy as np
rng = np.random.default_rng(0)
ds = generate_dummy_bags(
n_pos=100, n_neg=100, inst_per_bag=(5, 15), d=2,
pos_centers=((+2,+1), (+4,+3)),
neg_centers=((-1.5,-1.0), (-3.0,+0.5)),
pos_scales=((2.0, 0.6), (1.2, 0.8)),
neg_scales=((1.5, 0.5), (2.5, 0.9)),
pos_intra_rate=(0.25, 0.85),
ensure_pos_in_every_pos_bag=True,
neg_pos_noise_rate=(0.00, 0.05),
pos_neg_noise_rate=(0.00, 0.20),
outlier_rate=0.1,
outlier_scale=8.0,
random_state=42,
)
# Quick sanity:
X_pos, pos_idx = ds.positive_instances()
X_neg, neg_idx = ds.negative_instances()
print("Number of bags:", len(ds.bags))
from sawmil.data import generate_dummy_bags
import numpy as np
rng = np.random.default_rng(0)
ds = generate_dummy_bags(
n_pos=100, n_neg=100, inst_per_bag=(5, 15), d=2,
pos_centers=((+2,+1), (+4,+3)),
neg_centers=((-1.5,-1.0), (-3.0,+0.5)),
pos_scales=((2.0, 0.6), (1.2, 0.8)),
neg_scales=((1.5, 0.5), (2.5, 0.9)),
pos_intra_rate=(0.25, 0.85),
ensure_pos_in_every_pos_bag=True,
neg_pos_noise_rate=(0.00, 0.05),
pos_neg_noise_rate=(0.00, 0.20),
outlier_rate=0.1,
outlier_scale=8.0,
random_state=42,
)
# Quick sanity:
X_pos, pos_idx = ds.positive_instances()
X_neg, neg_idx = ds.negative_instances()
print("Number of bags:", len(ds.bags))
Number of bags: 200
1.2. Fit the model¶
In [ ]:
Copied!
from sawmil.kernels import get_kernel, Linear
k = get_kernel("linear") # base (single-instance kernel)
k1 = Linear() # equivalent k == k1
# if you want to use kernels for bags outside of the models
from sawmil.bag_kernels import make_bag_kernel
bag_k = make_bag_kernel(k, normalizer="none", p=1.0, use_intra_labels=False, fast_linear=True) # bag kernel
# Otherwise, it is handled inside each model
from sawmil.kernels import get_kernel, Linear
k = get_kernel("linear") # base (single-instance kernel)
k1 = Linear() # equivalent k == k1
# if you want to use kernels for bags outside of the models
from sawmil.bag_kernels import make_bag_kernel
bag_k = make_bag_kernel(k, normalizer="none", p=1.0, use_intra_labels=False, fast_linear=True) # bag kernel
# Otherwise, it is handled inside each model
1.2.1 Fit NSK with the Linear Kernel¶
In [ ]:
Copied!
from sawmil import NSK
k = get_kernel("linear", normalizer="average")
clf = NSK(C=1, kernel=k,
# bag kernel settings
normalizer='average',
p=1.0,
fast_linear=True,
# solver settings
scale_C=True,
tol=1e-8,
verbose=False,
solver='osqp').fit(ds, None)
print("Train acc:", clf.score(ds, ds.y))
# clf.predict(ds), clf.decision_function(ds)
from sawmil import NSK
k = get_kernel("linear", normalizer="average")
clf = NSK(C=1, kernel=k,
# bag kernel settings
normalizer='average',
p=1.0,
fast_linear=True,
# solver settings
scale_C=True,
tol=1e-8,
verbose=False,
solver='osqp').fit(ds, None)
print("Train acc:", clf.score(ds, ds.y))
# clf.predict(ds), clf.decision_function(ds)
Linear kernel has no parameters to fit.
Train acc: 0.895
1.2.2 Fit NSK with the RBF Kernel¶
In [ ]:
Copied!
k = get_kernel("rbf", gamma=0.8)
clf = NSK(C=10, kernel=k, scale_C=True, tol=1e-8, verbose=False, solver='osqp').fit(ds, None)
print("Train acc:", clf.score(ds, ds.y))
k = get_kernel("rbf", gamma=0.8)
clf = NSK(C=10, kernel=k, scale_C=True, tol=1e-8, verbose=False, solver='osqp').fit(ds, None)
print("Train acc:", clf.score(ds, ds.y))
Train acc: 0.955
1.2.3 Fit NSK with Combined Kernels¶
In [ ]:
Copied!
from sawmil.kernels import Product, Polynomial, Linear, RBF, Sum, Scale
k = Sum(Linear(),
Scale(0.5,
Product(Polynomial(degree=2), RBF(gamma=1.0))))
clf = NSK(C=100, kernel=k,
# params to create a bag kernel
normalizer="none",
# svm params
scale_C=True,
tol=1e-8, verbose=False, solver='gurobi').fit(ds, None)
print("Train acc:", clf.score(ds, ds.y))
from sawmil.kernels import Product, Polynomial, Linear, RBF, Sum, Scale
k = Sum(Linear(),
Scale(0.5,
Product(Polynomial(degree=2), RBF(gamma=1.0))))
clf = NSK(C=100, kernel=k,
# params to create a bag kernel
normalizer="none",
# svm params
scale_C=True,
tol=1e-8, verbose=False, solver='gurobi').fit(ds, None)
print("Train acc:", clf.score(ds, ds.y))
Linear kernel has no parameters to fit.
Set parameter Username Academic license - for non-commercial use only - expires 2026-08-04 Train acc: 1.0
1.2.3 Fit sMIL with the Linear Kernel¶
In [ ]:
Copied!
from sawmil import sMIL
from sawmil.kernels import Linear
from sawmil import sMIL
from sawmil.kernels import Linear
In [ ]:
Copied!
k = Linear()
clf = sMIL(C=10, kernel=k,
# params to create a bag kernel
normalizer="none",
# svm params
scale_C=True,
tol=1e-8, verbose=False, solver='osqp').fit(ds, None)
k = Linear()
clf = sMIL(C=10, kernel=k,
# params to create a bag kernel
normalizer="none",
# svm params
scale_C=True,
tol=1e-8, verbose=False, solver='osqp').fit(ds, None)
Linear kernel has no parameters to fit.
In [ ]:
Copied!
y = np.array([b.y for b in ds.bags])
# yhat = clf.predict(ds)
print("Train acc:", clf.score(ds, y))
y = np.array([b.y for b in ds.bags])
# yhat = clf.predict(ds)
print("Train acc:", clf.score(ds, y))
Train acc: 0.89
1.2.4. Fit sAwMIL with the Linear kernel¶
In [ ]:
Copied!
from sawmil import sAwMIL
from sawmil.kernels import get_kernel
from sawmil import sAwMIL
from sawmil.kernels import get_kernel
In [ ]:
Copied!
k = get_kernel('linear')
clf = sAwMIL(C=0.1, kernel=k,
solver="gurobi", eta=0.95) # here eta is high, since all items in the bag are relevant
clf.fit(ds)
print("Train acc:", clf.score(ds, ds.y))
clf.predict(ds)
k = get_kernel('linear')
clf = sAwMIL(C=0.1, kernel=k,
solver="gurobi", eta=0.95) # here eta is high, since all items in the bag are relevant
clf.fit(ds)
print("Train acc:", clf.score(ds, ds.y))
clf.predict(ds)
Linear kernel has no parameters to fit. Linear kernel has no parameters to fit.
Train acc: 0.805
Out[ ]:
array([1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 0., 0., 0., 0., 1., 1., 0., 1., 1., 0., 0., 0., 0., 0., 1., 0., 0., 1., 1., 0., 0., 1., 1., 1., 0., 0., 0., 0., 0., 1., 0., 0., 0., 0., 0., 1., 1., 1., 1., 1., 1., 0., 0., 1., 0., 0., 1., 1., 0., 1., 1., 0., 0., 0., 0., 0., 1., 1., 1., 0., 1., 0., 0., 0., 0., 1., 1., 1., 0., 1., 1., 1., 0., 0., 1., 0., 1., 1., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 1., 0., 0., 0., 1., 0., 0., 1., 0., 0., 1., 0.])
In [ ]:
Copied!
from sawmil.data import load_musk_bags
train_ds, test_ds, scaler = load_musk_bags(standardize=True, test_size=0.3, random_state=42)
from sawmil.data import load_musk_bags
train_ds, test_ds, scaler = load_musk_bags(standardize=True, test_size=0.3, random_state=42)
In [ ]:
Copied!
from sawmil import NSK
from sawmil.kernels import Linear, Sum, RBF
from sklearn.metrics import matthews_corrcoef as mcc
k = Sum(Linear(),RBF(gamma=0.5))
clf = NSK(C=10, kernel=k,
normalizer="none",
scale_C=True, tol=1e-8, verbose=False, solver='osqp').fit(train_ds, None)
y = ds.y
yhat = clf.predict(test_ds)
print('Matthews Correlation Coefficient:', mcc(y, yhat))
from sawmil import NSK
from sawmil.kernels import Linear, Sum, RBF
from sklearn.metrics import matthews_corrcoef as mcc
k = Sum(Linear(),RBF(gamma=0.5))
clf = NSK(C=10, kernel=k,
normalizer="none",
scale_C=True, tol=1e-8, verbose=False, solver='osqp').fit(train_ds, None)
y = ds.y
yhat = clf.predict(test_ds)
print('Matthews Correlation Coefficient:', mcc(y, yhat))
Linear kernel has no parameters to fit.
Matthews Correlation Coefficient: 0.6882604778571242
2.2.2 Fit sMIL with Combined Kernel¶
In [ ]:
Copied!
from sawmil.kernels import Linear
from sawmil import sMIL
k = Sum(Linear(),RBF(gamma=0.5))
clf = sMIL(C=10, kernel=k, scale_C=True, tol=1e-8, verbose=True, solver='osqp').fit(train_ds, None)
from sawmil.kernels import Linear
from sawmil import sMIL
k = Sum(Linear(),RBF(gamma=0.5))
clf = sMIL(C=10, kernel=k, scale_C=True, tol=1e-8, verbose=True, solver='osqp').fit(train_ds, None)
Linear kernel has no parameters to fit.
----------------------------------------------------------------- OSQP v1.0.0 - Operator Splitting QP Solver (c) The OSQP Developer Team ----------------------------------------------------------------- problem: variables n = 2199, constraints m = 2200 nnz(P) + nnz(A) = 2423298 settings: algebra = Built-in, OSQPInt = 4 bytes, OSQPFloat = 8 bytes, linear system solver = QDLDL v0.1.8, eps_abs = 1.0e-08, eps_rel = 1.0e-08, eps_prim_inf = 1.0e-04, eps_dual_inf = 1.0e-04, rho = 1.00e-01 (adaptive: 50 iterations), sigma = 1.00e-06, alpha = 1.60, max_iter = 20000 check_termination: on (interval 25, duality gap: on), time_limit: 1.00e+10 sec, scaling: on (10 iterations), scaled_termination: off warm starting: on, polishing: on, iter objective prim res dual res gap rel kkt rho time 1 -2.5694e+01 2.17e+00 2.12e+00 -1.93e+01 2.17e+00 1.00e-01 1.03e+00s 200 -5.1152e+00 2.65e-04 8.27e-04 -4.07e-02 8.27e-04 1.00e-01 1.94e+00s 400 -5.0805e+00 4.98e-05 1.40e-04 -8.78e-03 1.40e-04 1.00e-01 2.87e+00s 600 -5.0729e+00 6.05e-06 1.62e-05 -1.26e-03 1.62e-05 1.00e-01 3.76e+00s 800 -5.0718e+00 9.51e-07 1.06e-05 -2.23e-04 1.06e-05 1.00e-01 4.67e+00s 1000 -5.0717e+00 1.79e-07 5.62e-06 -4.12e-05 5.62e-06 1.00e-01 5.57e+00s 1200 -5.0716e+00 4.16e-08 2.96e-06 -7.74e-06 2.96e-06 1.00e-01 6.48e+00s 1400 -5.0716e+00 1.04e-08 1.62e-06 -1.48e-06 1.62e-06 1.00e-01 7.44e+00s 1600 -5.0716e+00 3.18e-09 8.88e-07 -2.93e-07 8.88e-07 1.00e-01 8.41e+00s 1800 -5.0716e+00 1.40e-09 4.85e-07 -6.18e-08 4.85e-07 1.00e-01 9.41e+00s 2000 -5.0716e+00 7.31e-10 2.65e-07 -1.49e-08 2.65e-07 1.00e-01 1.04e+01s 2200 -5.0716e+00 3.89e-10 1.45e-07 -4.44e-09 1.45e-07 1.00e-01 1.13e+01s 2400 -5.0716e+00 2.08e-10 7.99e-08 -1.64e-09 7.99e-08 1.00e-01 1.23e+01s 2475 -5.0716e+00 1.65e-10 6.39e-08 -1.17e-09 6.39e-08 1.00e-01 1.27e+01s plsh -5.0716e+00 3.84e-15 2.10e-13 7.42e-14 2.10e-13 -------- 1.37e+01s status: solved solution polishing: successful number of iterations: 2475 optimal objective: -5.0716 dual objective: -5.0716 duality gap: 7.4186e-14 primal-dual integral: 2.0957e+01 run time: 1.37e+01s optimal rho estimate: 2.65e-02
In [ ]:
Copied!
y = ds.y
yhat = clf.predict(test_ds)
print('Matthews Correlation Coefficient:', mcc(y, yhat))
y = ds.y
yhat = clf.predict(test_ds)
print('Matthews Correlation Coefficient:', mcc(y, yhat))
Matthews Correlation Coefficient: 0.6369615602528665
In [ ]:
Copied!