Вопрос или проблема
Я использую партии по 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-моделей и улучшить общее качество предсказаний.
Учитывайте конкретные требования вашего проекта и объем данных, чтобы выбрать наиболее подходящий способ реализации. Выбор правильного подхода поможет достичь высоких результатов в анализе ваших данных и повысит эффективность модели.