Skip to content

Commit 9c162a8

Browse files
committed
ENH micro-optimize RFECV
Skip repeated indexing into X and y.
1 parent 35260c1 commit 9c162a8

File tree

1 file changed

+7
-8
lines changed
  • sklearn/feature_selection

1 file changed

+7
-8
lines changed

sklearn/feature_selection/rfe.py

Lines changed: 7 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -325,30 +325,29 @@ def fit(self, X, y):
325325
scores = np.zeros(X.shape[1])
326326

327327
# Cross-validation
328-
n = 0
328+
for n, (train, test) in enumerate(cv):
329+
X_train, X_test = X[train], X[test]
330+
y_train, y_test = y[train], y[test]
329331

330-
for train, test in cv:
331332
# Compute a full ranking of the features
332-
ranking_ = rfe.fit(X[train], y[train]).ranking_
333+
ranking_ = rfe.fit(X_train, y_train).ranking_
333334
# Score each subset of features
334335
for k in range(0, max(ranking_)):
335336
mask = np.where(ranking_ <= k + 1)[0]
336337
estimator = clone(self.estimator)
337-
estimator.fit(X[train][:, mask], y[train])
338+
estimator.fit(X_train[:, mask], y_train)
338339

339340
if self.loss_func is None:
340-
loss_k = 1.0 - estimator.score(X[test][:, mask], y[test])
341+
loss_k = 1.0 - estimator.score(X_test[:, mask], y_test)
341342
else:
342343
loss_k = self.loss_func(
343-
y[test], estimator.predict(X[test][:, mask]))
344+
y_test, estimator.predict(X_test[:, mask]))
344345

345346
if self.verbose > 0:
346347
print("Finished fold with %d / %d feature ranks, loss=%f"
347348
% (k, max(ranking_), loss_k))
348349
scores[k] += loss_k
349350

350-
n += 1
351-
352351
# Pick the best number of features on average
353352
best_score = np.inf
354353
best_k = None

0 commit comments

Comments
 (0)