@@ -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,12 @@ 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 and solver != 'sag' :
290
+ warnings .warn ("In Ridge, only 'sag' solver can currently fit the "
291
+ "intercept when X is sparse. Solver has been "
292
+ "automatically changed into 'sag'." )
293
+ solver = 'sag'
294
+
284
295
# SAG needs X and y columns to be C-contiguous and np.float64
285
296
if solver == 'sag' :
286
297
X = check_array (X , accept_sparse = ['csr' ],
@@ -375,14 +386,22 @@ def ridge_regression(X, y, alpha, sample_weight=None, solver='auto',
375
386
376
387
coef = np .empty ((y .shape [1 ], n_features ))
377
388
n_iter = np .empty (y .shape [1 ], dtype = np .int32 )
389
+ intercept = np .zeros ((y .shape [1 ], ))
378
390
for i , (alpha_i
ED48
span>, target ) in enumerate (zip (alpha , y .T )):
391
+ start = {'coef' : np .zeros (n_features + int (return_intercept ))}
379
392
coef_ , n_iter_ , _ = sag_solver (
380
393
X , target .ravel (), sample_weight , 'squared' , alpha_i ,
381
394
max_iter , tol , verbose , random_state , False , max_squared_sum ,
382
- dict ())
383
- coef [i ] = coef_
395
+ start )
396
+ if return_intercept :
397
+ coef [i ] = coef_ [:- 1 ]
398
+ intercept [i ] = coef_ [- 1 ]
399
+ else :
400
+ coef [i ] = coef_
384
401
n_iter [i ] = n_iter_
385
402
403
+ if intercept .shape [0 ] == 1 :
404
+ intercept = intercept [0 ]
386
405
coef = np .asarray (coef )
387
406
388
407
if solver == 'svd' :
@@ -395,7 +414,11 @@ def ridge_regression(X, y, alpha, sample_weight=None, solver='auto',
395
414
# When y was passed as a 1d-array, we flatten the coefficients.
396
415
coef = coef .ravel ()
397
416
398
- if return_n_iter :
417
+ if return_n_iter and return_intercept :
418
+ return coef , n_iter , intercept
419
+ elif return_intercept :
420
+ return coef , intercept
421
+ elif return_n_iter :
399
422
return coef , n_iter
400
423
else :
401
424
return coef
@@ -428,12 +451,21 @@ def fit(self, X, y, sample_weight=None):
428
451
X , y , self .fit_intercept , self .normalize , self .copy_X ,
429
452
sample_weight = sample_weight )
430
453
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 )
454
+ if sparse .issparse (X ) and self .fit_intercept :
455
+ self .coef_ , self .n_iter_ , self .intercept_ = ridge_regression (
456
+ X , y , alpha = self .alpha , sample_weight = sample_weight ,
457
+ max_iter = self .max_iter , tol = self .tol , solver = self .solver ,
458
+ random_state = self .random_state , return_n_iter = True ,
459
+ return_intercept = True )
460
+ self .intercept_ += y_mean
461
+ else :
462
+ self .coef_ , self .n_iter_ = ridge_regression (
463
+ X , y , alpha = self .alpha , sample_weight = sample_weight ,
464
+ max_iter = self .max_iter , tol = self .tol , solver = self .solver ,
465
+ random_state = self .random_state , return_n_iter = True ,
466
+ return_intercept = False )
467
+ self ._set_intercept (X_mean , y_mean , X_std )
435
468
436
- self ._set_intercept (X_mean , y_mean , X_std )
437
469
return self
438
470
439
471
0 commit comments