@@ -194,7 +194,7 @@ def _solve_svd(X, y, alpha):
194
194
195
195
def ridge_regression (X , y , alpha , sample_weight = None , solver = 'auto' ,
196
196
max_iter = None , tol = 1e-3 , verbose = 0 , random_state = None ,
197
- return_n_iter = False ):
197
+ return_n_iter = False , return_intercept = False ):
198
198
"""Solve the ridge equation by the method of normal equations.
199
199
200
200
Read more in the :ref:`User Guide <ridge_regression>`.
@@ -268,6 +268,11 @@ def ridge_regression(X, y, alpha, sample_weight=None, solver='auto',
268
268
If True, the method also returns `n_iter`, the actual number of
269
269
iteration performed by the solver.
270
270
271
+ return_intercept : boolean, default False
272
+ If True, the method also returns the intercept, and the solver
273
+ is automatically changed to 'sag'. This is only a temporary fix
274
+ for fitting the intercept with sparse data.
275
+
271
276
Returns
272
277
-------
273
278
coef : array, shape = [n_features] or [n_targets, n_features]
@@ -281,6 +286,9 @@ def ridge_regression(X, y, alpha, sample_weight=None, solver='auto',
281
286
-----
282
287
This function won't compute the intercept.
283
288
"""
289
+ if return_intercept :
290
+ solver = 'sag'
291
+
284
292
# SAG needs X and y columns to be C-contiguous and np.float64
285
293
if solver == 'sag' :
286
294
X = check_array (X , accept_sparse = ['csr' ],
@@ -375,12 +383,18 @@ def ridge_regression(X, y, alpha, sample_weight=None, solver='auto',
375
383
376
384
coef = np .empty ((y .shape [1 ], n_features ))
377
385
n_iter = np .empty (y .shape [1 ], dtype = np .int32 )
386
+ intercept = np .zeros ((y .shape [1 ], ))
378
387
for i , (alpha_i , target ) in enumerate (zip (alpha , y .T )):
388
+ start = {'coef' : np .zeros (n_features + int (return_intercept ))}
379
389
coef_ , n_iter_ , _ = sag_solver (
380
390
X , target .ravel (), sample_weight , 'squared' , alpha_i ,
381
391
max_iter , tol , verbose , random_state , False , max_squared_sum ,
382
- dict ())
383
- coef [i ] = coef_
392
+ start )
393
+ if return_intercept :
394
+ coef [i ] = coef_ [:- 1 ]
395
+ intercept [i ] = coef_ [- 1 ]
396
+ else :
397
+ coef [i ] = coef_
384
398
n_iter [i ] = n_iter_
385
399
386
400
coef = np .asarray (coef )
@@ -395,7 +409,11 @@ def ridge_regression(X, y, alpha, sample_weight=None, solver='auto',
395
409
# When y was passed as a 1d-array, we flatten the coefficients.
396
410
coef = coef .ravel ()
397
411
398
- if return_n_iter :
412
+ if return_n_iter and return_intercept :
413
+ return coef , n_iter , intercept
414
+ elif return_intercept :
415
+ return coef , intercept
416
+ elif return_n_iter :
399
417
return coef , n_iter
400
418
else :
401
419
return coef
@@ -428,12 +446,21 @@ def fit(self, X, y, sample_weight=None):
428
446
X , y , self .fit_intercept , self .normalize , self .copy_X ,
429
447
sample_weight = sample_weight )
430
448
431
- self .coef_ , self .n_iter_ = ridge_regression (
432
- X , y , alpha = self .alpha , sample_weight = sample_weight ,
433
- max_iter = self .max_iter , tol = self .tol , solver = self .solver ,
434
- random_state = self .random_state , return_n_iter = True )
449
+ if sparse .issparse (X ) and self .fit_intercept :
450
+ self .coef_ , self .n_iter_ , self .intercept_ = ridge_regression (
451
+ X , y , alpha = self .alpha , sample_weight = sample_weight ,
452
+ max_iter = self .max_iter , tol = self .tol , solver = self .solver ,
453
+ random_state = self .random_state , return_n_iter = True ,
454
+ return_intercept = True )
455
+ self.intercept_ += y_mean
456
+ else :
457
+ self .coef_ , self .n_iter_ = ridge_regression (
458
+ X , y , alpha = self .alpha , sample_weight = sample_weight ,
459
+ max_iter = self .max_iter , tol = self .tol , solver = self .solver ,
460
+ random_state = self .random_state , return_n_iter = True ,
461
+ return_intercept = False )
462
+ self ._set_intercept (X_mean , y_mean , X_std )
435
463
436
- self ._set_intercept (X_mean , y_mean , X_std )
437
464
return self
438
465
439
466
0 commit comments