Объединить результаты нескольких моделей

Вопрос или проблема

Я использую партии по 100000 строк из CSV файла для обучения простой модели LASSO.

Как мне объеденить все эти модели, обученные на разных партициях? Я хотел бы использовать все эти обученные модели для предсказания.

Я знаком с DASK и другими альтернативами, но хотел бы использовать Pandas.

pipelines = {
    'lasso' : make_pipeline(StandardScaler(), Lasso(random_state=123))
}

for key, value in pipelines.items():
    print( key, type(value) )

# Гиперпараметры Lasso
lasso_hyperparameters = { 
    'lasso__alpha' : [0.001, 0.005, 0.01, 0.05, 0.1, 0.5, 1, 5, 10] 
}

hyperparameters = {
'lasso' : lasso_hyperparameters
}

# Создайте пустой словарь под названием fitted_models
fitted_models = {}

# Создайте объект кросс-валидации из конвейера и гиперпараметров
model = GridSearchCV(pipeline, hyperparameters[name], cv=10, n_jobs=-1)

def train(X_train, y_train):  
    # Обучите модель на X_train, y_train
    model.fit(X_train, y_train)

    # Сохраните модель в fitted_models[name] 
    fitted_models[name] = model

    # Выведите '{name} обучен'
    print(name, 'обучен.')
    print ("__________________________________")
    print (model.cv_results_)


for df in pd.read_csv('train_V2.csv', chunksize=100000):
    df = df.dropna()
    df = pd.get_dummies(df, columns=['matchType'])
    df_train = df.drop(['Id', 'groupId', 'matchId'], axis = 1)
    y = df_train.winPlacePerc       
    X = df_train.drop('winPlacePerc', axis=1)
    X_train, X_test, y_train, y_test = train_test_split(X, y, 
                                                    test_size=0.2, 
                                                    random_state=1234)
    X_train = np.asarray(X_train)
    X_test = np.asarray(X_test)
    y_train = np.asarray(y_train)
    y_test = np.asarray(y_test)

    train(X_train, y_train)

То, что вам нужно, называется “стохастическая оптимизация”. Вам не нужно обучать отдельные модели и затем объединять их.

Рассмотрите возможность использования sklearn.linear_model.SGDRegressor с L1 штрафом, который эквивалентен Lasso.

Это имеет реализацию .partial_fit для поэтапного обучения модели с помощью партий данных, вместо обучения отдельных моделей.

Например:

for epoch in epochs:
    for df in pd.read_csv('train_V2.csv', chunksize=100000):
        model.partial_fit(*args)

У вас есть 2 варианта:

  • Либо вы собираете все результаты ваших моделей с помощью Voting
    Regressor
    .
  • Либо вы поэтапно обучаете свою модель.

Учитывая ваш случай использования, я бы выбрал поэтапное обучение. Тем не менее, не все модели scikit-learn поддерживают поэтапное обучение. Вы можете проверить список классификаторов, которые поддерживают поэтапное обучение здесь.

Поскольку вы используете простую модель LASSO, вы можете использовать SDGRegressor с L1 регуляризацией.

Ответ или решение

Для объединения результатов нескольких моделей, обученных на различных кусках данных, существует несколько подходов. Рассмотрим стратегии, которые помогут вам оптимизировать процесс обучения и предсказания на основе ваших данных.

1. Использование инкрементального обучения

Поскольку вы уже используете модель LASSO, можно рассмотреть возможность инкрементального обучения с использованием класса SGDRegressor из библиотеки sklearn. Данный регрессор поддерживает метод partial_fit, который позволяет обучать модель на небольших порциях данных без необходимости создавать отдельные модели для каждой порции.

Пример кода:

import pandas as pd
import numpy as np
from sklearn.linear_model import SGDRegressor
from sklearn.pipeline import make_pipeline
from sklearn.preprocessing import StandardScaler
from sklearn.model_selection import train_test_split

# Фаза 1: Создание пайплайна
pipeline = make_pipeline(StandardScaler(), SGDRegressor(penalty='l1', random_state=123))

# Фаза 2: Чтение данных и инкрементальное обучение
for df in pd.read_csv('train_V2.csv', chunksize=100000):
    df = df.dropna()
    df = pd.get_dummies(df, columns=['matchType'])
    df_train = df.drop(['Id', 'groupId', 'matchId'], axis=1)
    y = df_train.winPlacePerc
    X = df_train.drop('winPlacePerc', axis=1)

    # Обучение модели на данной порции данных
    pipeline.fit(X, y)

    # Обратите внимание, что можно использовать `partial_fit` на готовой модели,
    # если предварительно подготовить ее.

2. Ансамблирование моделей

Если вы всё же хотите обучить несколько моделей на разных кусках данных и объединить их результаты, вы можете воспользоваться подходом ансамблирования. Для этого можно использовать VotingRegressor, который позволяет объединять предсказания многих регрессоров и получать итоговые предсказания.

Пример кода:

from sklearn.ensemble import VotingRegressor

# Создайте список регрессоров
models = []
for name, value in pipelines.items():
    model = GridSearchCV(value, hyperparameters[name], cv=10, n_jobs=-1)
    models.append((name, model))

voting_model = VotingRegressor(estimators=models)

# Обучение и предсказание
for df in pd.read_csv('train_V2.csv', chunksize=100000):
    df = df.dropna()
    df = pd.get_dummies(df, columns=['matchType'])
    df_train = df.drop(['Id', 'groupId', 'matchId'], axis=1)
    y = df_train.winPlacePerc
    X = df_train.drop('winPlacePerc', axis=1)

    # Обучаем все модели
    for name, model in models:
        model.fit(X, y)

# Объединяем предсказания
predictions = [model.predict(X_test) for name, model in models]
final_predictions = np.mean(predictions, axis=0)

3. Заключение

Инкрементальное обучение с помощью SGDRegressor является более оптимальным решением для большого объема данных в вашем случае, так как оно позволяет избежать лишних затрат на ресурсы в процессе обучения. Но если ваша цель заключается в создании ансамбля моделей, то VotingRegressor предложит вам возможность объединить усилия каждого из ваших LASSO-моделей и улучшить общее качество предсказаний.

Учитывайте конкретные требования вашего проекта и объем данных, чтобы выбрать наиболее подходящий способ реализации. Выбор правильного подхода поможет достичь высоких результатов в анализе ваших данных и повысит эффективность модели.

Оцените материал
Добавить комментарий

Капча загружается...