|
3 | 3 | from scipy import optimize
|
4 | 4 |
|
5 | 5 | from sklearn.base import BaseEstimator, RegressorMixin
|
6 |
| -from sklearn.linear_model.base import center_data |
| 6 | +from sklearn.linear_model.base import center_data, LinearModel |
| 7 | +from sklearn.preprocessing import StandardScaler |
7 | 8 | from sklearn.utils import check_X_y
|
8 | 9 |
|
9 | 10 | def _huber_loss_and_gradient(w, X, y, epsilon, alpha):
|
@@ -31,21 +32,31 @@ def _huber_loss_and_gradient(w, X, y, epsilon, alpha):
|
31 | 32 | return loss + alpha * np.dot(w, w), grad
|
32 | 33 |
|
33 | 34 |
|
34 |
| -class HuberRegressor(RegressorMixin, BaseEstimator): |
35 |
| - def __init__(self, epsilon=0.1, n_iter=100, alpha=0.0001, warm_start=False): |
| 35 | +class HuberRegressor(LinearModel, RegressorMixin, BaseEstimator): |
| 36 | + def __init__(self, epsilon=0.1, n_iter=100, alpha=0.0001, |
| 37 | + warm_start=False, copy=True): |
36 | 38 | self.epsilon = epsilon
|
37 | 39 | self.n_iter = n_iter
|
38 | 40 | self.alpha = alpha
|
39 | 41 | self.warm_start = warm_start
|
| 42 | + self.copy = copy |
40 | 43 |
|
41 | 44 | def fit(self, X, y):
|
42 |
| - X, y = check_X_y(X, y) |
| 45 | + X, y = check_X_y(X, y, copy=self.copy) |
43 | 46 |
|
44 |
| - coef = getattr(self, 'coef', None) |
| 47 | + coef = getattr(self, 'coef_', None) |
45 | 48 | if not self.warm_start or (self.warm_start and coef is None):
|
46 | 49 | self.coef_ = np.zeros(X.shape[1])
|
47 |
| - self.coef, f, _ = optimize.fmin_l_bfgs_b( |
48 |
| - _huber_loss_and_gradient, self.coef_, |
49 |
| - args=(X, y, self.epsilon, self.alpha), maxiter=self.n_iter) |
| 50 | + |
| 51 | + try: |
| 52 | + self.coef_, f, self.dict_ = optimize.fmin_l_bfgs_b( |
| 53 | + _huber_loss_and_gradient, self.coef_, approx_grad=True, |
| 54 | + args=(X, y, self.epsilon, self.alpha), maxiter=self.n_iter) |
| 55 | + except TypeError: |
| 56 | + self.coef_, f, self.dict_ = optimize.fmin_l_bfgs_b( |
| 57 | + _huber_loss_and_gradient, self.coef_, |
| 58 | + args=(X, y, self.epsilon, self.alpha)) |
| 59 | + |
| 60 | + self.intercept_ = 0.0 |
50 | 61 | self.loss_ = f
|
51 | 62 | return self
|
0 commit comments