Я думаю, вам следует использовать BaggingClassifier от scikit-learn. Короче говоря, он подходит нескольким классификаторам для случайных подвыборок ваших данных, а затем заставляет их голосовать за выполнение классификации. Этот метаоценщик элегантно помешает вам написать цикл for. Что касается выборки (которая, как я полагаю, является вашей первоначальной мотивацией для написания цикла), вы можете отрегулировать веса в методе model.fit ().
import numpy as np
from sklearn.ensemble import BaggingClassifier
from sklearn.linear_model import LogisticRegression
from sklearn import datasets
from sklearn.model_selection import train_test_split
from sklearn.metrics import balanced_accuracy_score
breast_cancer = datasets.load_breast_cancer()
X = breast_cancer.data
y = breast_cancer.target
X_train, X_test, y_train, y_test = train_test_split(X,y)
Как видите, набор данных несбалансирован (в конце концов, это медицинские данные):
len(y_train[y_train == 0]),len(y_train[y_train == 1]) # 163, 263
Поэтому давайте добавим выборочные веса
y0 = len(y_train[y_train == 0])
y1 = len(y_train[y_train == 1])
w0 = y1/y0
w1 = 1
sample_weights = np.zeros(len(y_train))
sample_weights[y_train == 0] = w0
sample_weights[y_train == 1] = w1
Теперь классификатор Bagging:
model = BaggingClassifier(LogisticRegression(solver = 'liblinear'),
n_estimators=10,
bootstrap = True, random_state = 2019)
model.fit(X,y,sample_weights)
balanced_accuracy_score(y_test,model.predict(X_test)) # 94.2%
Обратите внимание, что, если я не соответствую весам выборки, я получу только 92,1% сбалансированной точности (сбалансированная точность = средняя отзывность, что очень удобно для несбалансированных задач)