Вопрос или проблема
Я пытаюсь вычислить интервалы предсказаний для классификатора, который я обучил в scikit-learn. Даже после установки нового параметра random_state
в моем конвейере, это, похоже, не изменяет результаты при повторной подгонке на данных. Что я могу с этим сделать? Вот соответствующий фрагмент кода, который я использую:
SEED_VALUE = 3
t_clf = Pipeline(steps=[('preprocessor', preprocessor),
('lgbm', LGBMClassifier(class_weight="balanced",random_state=SEED_VALUE, max_depth=20, min_child_samples=20, num_leaves=31))
])
states = [0,1,2,3]
///
for state in states:
train_temp = train.copy()
t_clf.set_params(lgbm__random_state=state)
t_clf.fit(train_temp, train_temp['label'])
t_clf.predict_proba(test)
# результат predict_proba не меняется при различных значениях state
То же самое происходит, когда я пытаюсь изменить порядок перемешивания.
Я осознал, что при перемешивании я не установил параметр replace
в True
, что помешало вставить случайность в процесс.
SEED_VALUE = 3
t_clf = Pipeline(steps=[('preprocessor', preprocessor),
('lgbm', LGBMClassifier(class_weight="balanced",random_state=SEED_VALUE, max_depth=20, min_child_samples=20, num_leaves=31))
])
states = [0,1,2,3]
///
for state in states:
train_temp = train.copy().sample(frac=1, replace=True).reset_index(drop=True)
t_clf.fit(train_temp, train_temp['label'])
t_clf.predict_proba(test)
# результат predict_proba должен быть различным при каждом запуске
Ответ или решение
Проблема изменения предсказаний в моделях Scikit-learn при изменении параметра random_state
может быть вызвана рядом факторов. В вашем случае, несмотря на изменение значения random_state
, результаты предсказания остаются неизменными. Давайте углубимся в эту проблему и рассмотрим потенциальные пути её решения.
Причины проблемы
-
Поскольку не происходит изменений в данных, на которых обучается модель, то и предсказания остаются прежними. В вашем фрагменте кода переменная
train_temp
берётся изtrain.copy()
без применения какого-либо случайного перемешивания. Так, если ваши данные не изменяются, не имеет значения, каково значениеrandom_state
. -
Свойство
random_state
в модели LGBMClassifier. Этот параметр управляет внутренними случайными процессами, однако, если ваши входные данные не меняются между вызовамиfit
, вы не увидите различий в выходных данных. Этот параметр важен при создании бутстрепа или другой случайной подвыборки, но изменения данных всегда имеют первостепенное значение. -
Параметр
replace
в методеsample()
. Вы правильно заметили, что неустановленный параметрreplace
влияет на уровень случайности. Установивreplace=True
, вы позволяете выбору повторяться и тем самым увеличиваете вероятность получения различной выборки для каждой итерации цикла.
Рекомендации
Вот несколько рекомендаций, которые помогут вам устранить проблему:
1. Измените выборку обучающих данных
Убедитесь, что вы фактически изменяете данные между итерациями, что поможет лучше увидеть эффект изменения random_state
:
for state in states:
train_temp = train.copy().sample(frac=1, replace=True, random_state=state).reset_index(drop=True)
t_clf.fit(train_temp, train_temp['label'])
predictions = t_clf.predict_proba(test)
print(predictions)
2. Проверьте другие параметры модели
Если после выполнения вышеприведённых изменений вы все равно не получаете изменяющиеся предсказания, проверьте другие параметры вашей модели LGBMClassifier
. Возможно, какие-либо из них также влияют на предсказания и требуют изменения.
3. Используйте кросс-валидацию
Применение методов кросс-валидации может помочь лучше оценить стабильность ваших предсказаний:
from sklearn.model_selection import cross_val_predict
predictions = cross_val_predict(t_clf, train_temp.drop('label', axis=1), train_temp['label'], cv=5)
Это не только предоставляет различные предсказания для каждой итерации, но и позволяет оценить качество и стабильность модели.
Заключение
Изменения в стратегии выбора данных и использование параметров, управляющих случайностью, являются ключевыми для получения различных предсказаний в моделях машинного обучения. Убедитесь, что данные, на которых вы обучаете вашу модель, действительно подвергаются изменению между запусками. Так вы сможете достичь своей цели в вычислении интервалов предсказаний для классификатора. Если у вас возникнут дополнительные вопросы, не стесняйтесь обращаться за помощью.