@@ -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,12 @@ 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 and if X is sparse, the method also returns the intercept,
273
+ and the solver is automatically changed to 'sag'. This is only a
274
+ temporary fix for fitting the intercept with sparse data. For dense
275
+ data, use sklearn.linear_model.center_data before your regression.
276
+
271
277
Returns
272
278
-------
273
279
coef : array, shape = [n_features] or [n_targets, n_features]
@@ -277,10 +283,20 @@ def ridge_regression(X, y, alpha, sample_weight=None, solver='auto',
277
283
The actual number of iteration performed by the solver.
278
284
Only returned if `return_n_iter` is True.
279
285
286
+ intercept : float or array, shape = [n_targets]
287
+ The intercept of the model. Only returned if `return_intercept`
288
+ is True and if X is a scipy sparse array.
289
+
280
290
Notes
281
291
-----
282
292
This function won't compute the intercept.
283
293
"""
294
+ if return_intercept and sparse .issparse (X ) and solver != 'sag' :
295
+ warnings .warn ("In Ridge, only 'sag' solver can currently fit the "
296
+ "intercept when X is sparse. Solver has been "
297
+ "automatically changed into 'sag'." )
298
+ solver = 'sag'
299
+
284
300
# SAG needs X and y columns to be C-contiguous and np.float64
285
301
if solver == 'sag' :
286
302
X = check_array (X , accept_sparse = ['csr' ],
@@ -375,14 +391,22 @@ def ridge_regression(X, y, alpha, sample_weight=None, solver='auto',
375
391
376
392
coef = np .empty ((y .shape [1 ], n_features ))
377
393
n_iter = np .empty (y .shape [1 ], dtype = np .int32 )
394
+ intercept = np .zeros ((y .shape [1 ], ))
378
395
for i , (alpha_i , target ) in enumerate (zip (alpha , y .T )):
396
+ start = {'coef' : np .zeros (n_features + int (return_intercept ))}
379
397
coef_ , n_iter_ , _ = sag_solver (
380
398
X , target .ravel (), sample_weight , 'squared' , alpha_i ,
381
399
max_iter , tol , verbose , random_state , False , max_squared_sum ,
382
- dict ())
383
- coef [i ] = coef_
400
+ start )
401
+ if return_intercept :
402
+ coef [i ] = coef_ [:- 1 ]
403
+ intercept [i ] = coef_ [- 1 ]
404
+ else :
405
+ coef [i ] = coef_
384
406
n_iter [i ] = n_iter_
385
407
408
+ if intercept .shape [0 ] == 1 :
409
+ intercept = intercept [0 ]
386
410
coef = np .asarray (coef )
387
411
388
412
if solver == 'svd' :
@@ -395,7 +419,11 @@ def ridge_regression(X, y, alpha, sample_weight=None, solver='auto',
395
419
# When y was passed as a 1d-array, we flatten the coefficients.
396
420
coef = coef .ravel ()
397
421
398
- if return_n_iter :
422
+ if return_n_iter and return_intercept :
423
+ return coef , n_iter , intercept
424
+ elif return_intercept :
425
+ return coef , intercept
426
+ elif return_n_iter :
399
427
return coef , n_iter
400
428
else :
401
429
return coef
@@ -428,12 +456,22 @@ def fit(self, X, y, sample_weight=None):
428
456
X , y , self .fit_intercept , self .normalize , self .copy_X ,
429
457
sample_weight = sample_weight )
430
458
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 )
459
+ # temporary fix for fitting the intercept with sparse data using 'sag'
460
+ if sparse .issparse (X ) and self .fit_intercept :
461
+ self .coef_ , self .n_iter_ , self .intercept_ = ridge_regression (
462
+ X , y , alpha = self .alpha , sample_weight = sample_weight ,
463
+ max_iter = self .max_iter , tol = self .tol , solver = self .solver ,
464
+ random_state = self .random_state , return_n_iter = True ,
465
+ return_intercept = True )
466
+ self .intercept_ += y_mean
467
+ else :
468
+ self .coef_ , self .n_iter_ = ridge_regression (
469
+ X , y , alpha = self .alpha , sample_weight = sample_weight ,
470
+ max_iter = self .max_iter , tol = self .tol , solver = self .solver ,
471
+ random_state = self .random_state , return_n_iter = True ,
472
+ return_intercept = False )
473
+ self ._set_intercept (X_mean , y_mean , X_std )
435
474
436
- self ._set_intercept (X_mean , y_mean , X_std )
437
475
return self
438
476
439
477
0 commit comments