Passed
Push — master ( f9b33d...26c46e )
by Simon
03:26
created

GPR1.__init__()   A

Complexity

Conditions 1

Size

Total Lines 2
Code Lines 2

Duplication

Lines 0
Ratio 0 %

Importance

Changes 0
Metric Value
cc 1
eloc 2
nop 1
dl 0
loc 2
rs 10
c 0
b 0
f 0
1
# Author: Simon Blanke
2
# Email: [email protected]
3
# License: MIT License
4
5
import numpy as np
6
7
from sklearn.linear_model import BayesianRidge
8
from sklearn.gaussian_process import GaussianProcessRegressor
9
from sklearn.gaussian_process.kernels import Matern, WhiteKernel, RBF
10
from sklearn.ensemble import ExtraTreesRegressor as _ExtraTreesRegressor_
11
from sklearn.ensemble import RandomForestRegressor as _RandomForestRegressor_
12
from sklearn.ensemble import (
13
    GradientBoostingRegressor as _GradientBoostingRegressor_,
14
)
15
16
17
class EnsembleRegressor:
18
    def __init__(self, estimators, min_std=0.001):
19
        self.estimators = estimators
20
        self.min_std = min_std
21
22
    def fit(self, X, y):
23
        for estimator in self.estimators:
24
            estimator.fit(X, np.ravel(y))
25
26
    def predict(self, X, return_std=False):
27
        predictions = []
28
        for estimator in self.estimators:
29
            predictions.append(estimator.predict(X).reshape(-1, 1))
30
31
        predictions = np.array(predictions)
32
        mean = predictions.mean(axis=0)
33
        std = predictions.std(axis=0)
34
35
        std[std < self.min_std] = self.min_std
36
37
        if return_std:
38
39
            return mean, std
40
        return mean
41
42
43
def _return_std(X, trees, predictions, min_variance):
44
    """
45
    used from: 
46
    https://github.com/scikit-optimize/scikit-optimize/blob/master/skopt/learning/forest.py
47
    """
48
    std = np.zeros(len(X))
49
    trees = list(trees)
50
51
    for tree in trees:
52
        if isinstance(tree, np.ndarray):
53
            tree = tree[0]
54
55
        var_tree = tree.tree_.impurity[tree.apply(X)]
56
        var_tree[var_tree < min_variance] = min_variance
57
        mean_tree = tree.predict(X)
58
        std += var_tree + mean_tree ** 2
59
60
    std /= len(trees)
61
    std -= predictions ** 2.0
62
    std[std < 0.0] = 0.0
63
    std = std ** 0.5
64
    return std
65
66
67
class TreeEnsembleBase:
68
    def __init__(self, min_variance=0.001, **kwargs):
69
        self.min_variance = min_variance
70
        super().__init__(**kwargs)
71
72
    def fit(self, X, y):
73
        super().fit(X, np.ravel(y))
74
75
    def predict(self, X, return_std=False):
76
        mean = super().predict(X)
77
78
        if return_std:
79
            std = _return_std(X, self.estimators_, mean, self.min_variance)
80
81
            return mean, std
82
        return mean
83
84
85
class RandomForestRegressor(TreeEnsembleBase, _RandomForestRegressor_):
86
    def __init__(self, min_variance=0.001, **kwargs):
87
        super().__init__(**kwargs)
88
89
90
class ExtraTreesRegressor(TreeEnsembleBase, _ExtraTreesRegressor_):
91
    def __init__(self, min_variance=0.001, **kwargs):
92
        super().__init__(**kwargs)
93
94
95
class GradientBoostingRegressor(TreeEnsembleBase, _GradientBoostingRegressor_):
96
    def __init__(self, min_variance=0.001, **kwargs):
97
        super().__init__(**kwargs)
98
99
100
class GPR:
101
    def __init__(self):
102
        length_scale_param = 1
103
        length_scale_bounds_param = (1e-05, 100000.0)
104
        nu_param = 0.5
105
        matern = Matern(
106
            # length_scale=length_scale_param,
107
            # length_scale_bounds=length_scale_bounds_param,
108
            nu=nu_param,
109
        )
110
111
        self.gpr = GaussianProcessRegressor(
112
            kernel=matern + WhiteKernel(), n_restarts_optimizer=0
113
        )
114
115
    def fit(self, X, y):
116
        self.gpr.fit(X, y)
117
118
    def predict(self, X, return_std=False):
119
        return self.gpr.predict(X, return_std=return_std)
120
121
122
class GPR_linear:
123
    def __init__(self):
124
        self.gpr = BayesianRidge()
125
126
    def fit(self, X, y):
127
        self.gpr.fit(X, y)
128
129
    def predict(self, X, return_std=False):
130
        return self.gpr.predict(X, return_std=return_std)
131