Completed
Push — master ( c91794...a5dac5 )
by Simon
02:20 queued 11s
created

meta_opt_extensive_example   A

Complexity

Total Complexity 8

Size/Duplication

Total Lines 87
Duplicated Lines 0 %

Importance

Changes 0
Metric Value
wmc 8
eloc 60
dl 0
loc 87
rs 10
c 0
b 0
f 0

3 Functions

Rating   Name   Duplication   Size   Complexity  
A meta_opt() 0 22 4
A data_aug() 0 20 3
A model() 0 9 1
1
import numpy as np
2
import random
3
from sklearn.model_selection import cross_val_score
4
from sklearn.tree import DecisionTreeClassifier
5
from sklearn.datasets import load_breast_cancer
6
from hyperactive import Hyperactive
7
8
data = load_breast_cancer()
9
X, y = data.data, data.target
10
11
X_list, y_list = [X], [y]
12
13
def data_aug(X, y, sample_multi=5, feature_multi=5):
14
    X_list, y_list = [], []
15
16
    n_samples = X.shape[0]
17
    n_features = X.shape[1]
18
19
    for sample in range(1, sample_multi+1):
20
        idx_sample = np.random.randint(n_samples, size=int(n_samples / sample))
21
22
        for feature in range(1, feature_multi+1):
23
            idx_feature = np.random.randint(n_features, size=int(n_features / feature))
24
25
            X_temp_ = X[idx_sample, :]
26
            X_temp = X_temp_[:, idx_feature]
27
            y_temp = y[idx_sample]
28
29
            X_list.append(X_temp)
30
            y_list.append(y_temp)
31
32
    return X_list, y_list
33
34
def model(para, X, y):
35
    model = DecisionTreeClassifier(
36
        max_depth=para["max_depth"],
37
        min_samples_split=para["min_samples_split"],
38
        min_samples_leaf=para["min_samples_leaf"],
39
    )
40
    scores = cross_val_score(model, X, y, cv=3)
41
42
    return scores.mean()
43
44
search_config_model = {
45
    model: {
46
        "max_depth": range(2, 50),
47
        "min_samples_split": range(2, 50),
48
        "min_samples_leaf": range(1, 50),
49
    }
50
}
51
52
53
def meta_opt(para, X_list, y_list):
54
    scores = []
55
    
56
    for X, y in zip(X_list, y_list):
57
        X_list, y_list = data_aug(X, y, sample_multi=3, feature_multi=3)
58
59
        for X, y in zip(X_list, y_list):
60
61
            for n_iter in [10, 25, 50, 100]:
62
                opt = Hyperactive(
63
                    search_config_model,
64
                    optimizer={
65
                        "ParticleSwarm": {"inertia": para["inertia"], "cognitive_weight": para["cognitive_weight"], "social_weight": para["social_weight"]}
66
                    }, 
67
                    n_iter=n_iter,
68
                    verbosity=None,
69
                )
70
                opt.search(X, y)
71
                score = opt.score_best
72
                scores.append(score)
73
74
    return np.array(scores).mean()
75
76
77
search_config_meta = {
78
    meta_opt: {
79
        "inertia": np.arange(0, 1, 0.01),
80
        "cognitive_weight": np.arange(0, 1, 0.01),
81
        "social_weight": np.arange(0, 1, 0.01),
82
    }
83
}
84
85
opt = Hyperactive(search_config_meta, optimizer="Bayesian", n_iter=30)
86
opt.search(X_list, y_list)
87