Completed
Push — master ( f67568...5e5af8 )
by Simon
01:28
created

GPR.predict()   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 3
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
6
import numpy as np
7
8
from sklearn.linear_model import BayesianRidge
9
from sklearn.gaussian_process import GaussianProcessRegressor
10
from sklearn.gaussian_process.kernels import Matern
11
from sklearn.ensemble import ExtraTreesRegressor as _ExtraTreesRegressor_
12
from sklearn.ensemble import ExtraTreesRegressor as _RandomForestRegressor_
13
14
15
def _return_std(X, trees, predictions, min_variance):
16
    std = np.zeros(len(X))
17
18
    for tree in trees:
19
        var_tree = tree.tree_.impurity[tree.apply(X)]
20
        var_tree[var_tree < min_variance] = min_variance
21
        mean_tree = tree.predict(X)
22
        std += var_tree + mean_tree ** 2
23
24
    std /= len(trees)
25
    std -= predictions ** 2.0
26
    std[std < 0.0] = 0.0
27
    std = std ** 0.5
28
    # print("std", std)
29
    return std
30
31
32
class TreeEnsembleBase:
33
    def __init__(self, min_variance=0.0, **kwargs):
34
        self.min_variance = min_variance
35
        super().__init__(**kwargs)
36
37
    def fit(self, X, y):
38
        super().fit(X, np.ravel(y))
39
40
    def predict(self, X, return_std=False):
41
        mean = super().predict(X)
42
43
        if return_std:
44
            if self.criterion != "mse":
45
                raise ValueError(
46
                    "Expected impurity to be 'mse', got %s instead" % self.criterion
47
                )
48
            std = _return_std(X, self.estimators_, mean, self.min_variance)
49
            return mean, std
50
        return mean
51
52
53
class RandomForestRegressor(TreeEnsembleBase, _RandomForestRegressor_):
54
    def __init__(self, min_variance=0.0, **kwargs):
55
        super().__init__(**kwargs)
56
57
58
class ExtraTreesRegressor(TreeEnsembleBase, _ExtraTreesRegressor_):
59
    def __init__(self, min_variance=0.0, **kwargs):
60
        super().__init__(**kwargs)
61
62
63
class GPR:
64
    def __init__(self):
65
        self.gpr = GaussianProcessRegressor(kernel=Matern(nu=2.5), normalize_y=True)
66
67
    def fit(self, X, y):
68
        self.gpr.fit(X, y)
69
70
    def predict(self, X, return_std=False):
71
        return self.gpr.predict(X, return_std=return_std)
72
73
74
class GPR_linear:
75
    def __init__(self):
76
        self.gpr = BayesianRidge(n_iter=10, normalize=True)
77
78
    def fit(self, X, y):
79
        self.gpr.fit(X, y)
80
81
    def predict(self, X, return_std=False):
82
        return self.gpr.predict(X, return_std=return_std)
83