Вопрос или проблема
Сохранение обученной модели таким образом даст мне модель, обученную на каждом куске данных, или только на последнем куске?
df = pd.read_csv(, chunksize=10000)
for chunk in df:
text = chunk['body']
label = chunk['user_id']
print(text.shape, label.shape)
X_train, X_test, y_train, y_test = train_test_split(text, label, test_size=0.3)
text_clf.fit(X_train, y_train)
filename="finalized_model.sav"
joblib.dump(text_clf, filename)
# загрузка модели с диска
loaded_model = joblib.load(filename)
Например, если в первом куске были метки 1 и 2, а во втором 3 и 4, сможет ли финальная модель предсказать только 3 и 4? Или 1 и 2 тоже, учитывая, что тестовые данные содержат все метки. Любая помощь?
ОБНОВЛЕНИЕ
Часть используется для получения текста из csv. Я обновил свой код.
Краткий ответ: модель не сможет предсказать атрибут, который она не видела во время процесса обучения. Исходя из вашего кода, каждая модель будет стирать предыдущую.
Я предполагаю, что у вас нет доступа к более мощной машине (например, использование облачных вычислений) и вам нужно запускать это локально каким-то образом. Если это так, один из вариантов, который я бы предложил, – попробовать комбинацию Vaex и функциональности SGDRegressor
из sklearn.
Вы можете рассматривать Vaex как способ легкой манипуляции с датафреймами, которые превышают вашу память (т.е. датафреймы вне кэша). С этим вы можете выполнять инжиниринг признаков и EDA более простым способом, чем загружая куски.
Когда вы будете готовы к моделированию, вы можете использовать некоторые из моделей в sklearn, которые позволяют обучаться на партиях данных за раз (например, SGDRegressor
или SGDClassifier
). Эти варианты предоставляют метод partial_fit
для последовательного обучения вашей модели на различных партиях из вашего набора данных.
Некоторые ссылки, если вам интересно следовать по этому пути:
https://github.com/vaexio/vaex
https://scikit-learn.org/stable/modules/generated/sklearn.linear_model.SGDRegressor.html
Ответ или решение
Сохранение обученной модели: обновление и реализация
Вопрос, который вы подняли, имеет важное значение для понимания работы с моделями машинного обучения в условиях ограниченных ресурсов. Вы абсолютно правы в том, что сохранение модели таким образом приведет к тому, что каждая новая итерация обучения будет перезаписывать предыдущую. Это происходит вследствие того, что вы вызываете метод fit
, который переобучает модель на каждом новом фрагменте данных, и после выполнения данной операции сохраняется только последнее состояние модели.
Данные и модель
Ваша модель будет обучена только на данных последнего фрагмента (chunk) из CSV-файла. Например, если первый фрагмент содержит метки 1 и 2, а второй — 3 и 4, то в результате ваш финальный модель будет способна предсказывать только метки 3 и 4. Это происходит потому, что модель не "помнит" о предыдущих фрагментах, а перезаписывает свои параметры во время каждой итерации.
Решения проблемы
1. Использование partial_fit
Чтобы избежать потери информации из предыдущих частей данных, вам следует рассмотреть возможность использования метода partial_fit
, который предоставляет некоторые модели из библиотеки Scikit-learn, такие как SGDRegressor
или SGDClassifier
. Эти модели позволяют обучать модель на пакетах данных последовательно, при этом обновляя её параметры без полной перезаписи:
from sklearn.linear_model import SGDClassifier
text_clf = SGDClassifier()
df = pd.read_csv('your_file.csv', chunksize=10000)
for chunk in df:
text = chunk['body']
label = chunk['user_id']
# Обработка текста и меток, привести их к нужному виду
text_clf.partial_fit(X, y, classes=np.unique(label)) # Обучаем модель на текущем фрагменте
# Сохраняем модель после цикла
joblib.dump(text_clf, "finalized_model.sav")
2. Применение альтернативных библиотек
Если ваши вычислительные ресурсы ограничены, вы можете рассмотреть возможность использования библиотеки Vaex, которая позволяет эффективно работать с большими данными, не загружая их целиком в оперативную память. Она предоставляет удобные методы для манипуляции данными и может быть совместима с моделями Scikit-learn.
Дополнительные ресурсы:
Заключение
В заключение, при использовании подхода с сохранением модели без применения partial_fit
ваши результаты будут ограничены только последним фрагментом данных. Чтобы избежать потери обучения «на старых данных», внедрение стратегии последовательного обновления модели будет оптимальным решением. Это позволит вам использовать весь доступный набор данных, повышая точность и предсказательную силе вашей модели.