Я использую PySpark для распространения операции машинного обучения, состоящей из следующих шагов:
- Чтение данных
Разделите данные на основе столбца (~ 100 столбцов, разделив один столбец с 50 уникальными значениями, поэтому необходимо распределить процесс по этому столбцу). Я распараллеливаю этот процесс, используя метод sc.parallelize.
Для каждых данных инициализируйте классификатор через конвейер и используйте GridSearchCV из spark_sklearn для распараллеливания этой операции. Поскольку для этого требуется собственный искровой контекст, я создаю для этого еще один объект искрового контекста внутри небольшой функции.
Пример кода ниже
образец кода
sc = SparkContext('local', appName="abc")
def sample():
## some code
## read data and extract text features using pipeline
## use grid search CV from spark_sklearn package -- this requires its own sparkcontext
sc1 = SparkContext('local', appName="xyz")
grid_search = sp_GridSearchCV(sc1, clf, parameters, n_jobs=-1, cv=cv, verbose=1, scoring='f1_macro')
grid_search.fit(X, y)
sc1.stop()
return grid_search
results = sc.parallelize(labels).map(sample).collect()
sc.stop()
Я хотел бы знать, будет ли это правильным способом сделать это, и если нет, то каким будет лучший способ. Я думаю, что этот процесс, безусловно, можно улучшить. Например, инициализация sparkobject каждый раз добавляет дополнительные накладные расходы, которые можно минимизировать.
Любые направления будут оценены. Спасибо!