|
| 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) |
0 commit comments