Перебирайте переменные в Dask с помощью машинного обучения - PullRequest
0 голосов
/ 13 мая 2018

Добрый день.

Я столкнулся с небольшим икотой в Даске.Я довольно новичок в Dask (в Python), и я хотел бы запускать параллельные модели ML, используя чистый Dask (в отличие от dask-ml) на основе переменной с именем 'class'.Я хотел бы знать, каким будет прогнозируемый результат модели, поскольку я изменяю характеристику1 (поскольку, по моим данным, я знаю, что это наиболее значимый вариант).Я запускаю свои вычисления в кластере с 4 узлами и сохраняю все предсказанные для всех классов данные в predicted_all.

Вот пример моих данных для панд df:

+-------+--------+-------------+-------------+---+-------------+
| class | target |  feature1   |  feature2   | … |  feature10  |
+-------+--------+-------------+-------------+---+-------------+
| A     |      5 | 97.19859896 | 816.6842211 | … | 0.54895439  |
| A     |      6 | 46.09606585 | 784.3270075 | … | 8.251889349 |
| A     |     43 | 17.65188263 | 549.5501609 | … | 13.50763389 |
| A     |      2 | 98.85817622 | 708.1968399 | … | 7.621150619 |
| A     |     56 | 88.01917025 | 613.0401243 | … | 6.000443628 |
| B     |      4 | 70.80513786 | 906.0185026 | … | 19.41657943 |
| B     |     78 | 93.80801173 | 891.289798  | … | 8.501099853 |
| B     |      7 | 46.63101139 | 483.0638367 | … | 3.875892614 |
| B     |      1 | 67.5788966  | 743.5923161 | … | 8.671806546 |
| B     |      0 | 90.90392867 | 109.8205978 | … | 17.70970394 |
| …     |        | …           | …           | … | …           |
| Z     |     89 | 58.424834   | 794.9165579 | … | 17.51302389 |
| Z     |    854 | 58.21094669 | 714.8873807 | … | 3.334251242 |
| Z     |     25 | 75.5155099  | 61.59911771 | … | 8.507249536 |
| Z     |     90 | 47.13722692 | 861.3884932 | … | 11.95500215 |
| Z     |     52 | 9.824626526 | 528.1958297 | … | 10.10468804 |
+-------+--------+-------------+-------------+---+-------------+

df являетсяИнформационный кадр pandas, на котором я хотел бы запустить цикл, чтобы dask распараллеливал работу на каждом узле при использовании информационного кадра pandas.

Согласно учебным пособиям по Dask, я делаю следующее:

import pandas as pd
import numpy as np
from sklearn.linear_model import LinearRegression

classes = ['ABC...Z']
predicted_all = pd.DataFrame()

def linearmodel(class): #application of linear regression on data

    global predicted_all
    df_oneClass = df[df['class'] == class].drop(['class'], axis=1)
    df_y = pd.DataFrame(df_oneClass['target'])
    df_X = df_oneClass.drop(['target'], axis=1)

    model = LinearRegression()
    model.fit(df_X, df_y)

    X_predict = [] ## range of feature1 values I'd like to know the forecast outcome for
    y_predict = model.predict(X_predict)
    predicted_all = pd.concat([predicted_all, y_predict], axis = 0

results = [delayed(linearmodel)(class) for class in classes]
resultsDask = compute(*results, get=dask.multiprocessing.get)

Согласно предложению MRocklin, я переписал и сосредоточился на получении средних абсолютных ошибок каждой итерации класса и создании кортежа.Моя функция теперь выглядит следующим образом:

def linearmodel(class): #application of linear regression on data

    df_oneClass = df[df['class'] == class].drop(['class'], axis=1)
    df_y = pd.DataFrame(df_oneClass['target'])
    df_X = df_oneClass.drop(['target'], axis=1)

    model = LinearRegression()
    model.fit(df_X, df_y)

    y_predict = model.predict(X_predict)
    mae = mean_absolute_error(df_y, y_predict)

    return (class, mae)

results = [delayed(linearmodel)(class) for class in classes]
resultsDask = compute(*results, get=dask.multiprocessing.get)

К сожалению, работа не распараллелена, и в поле предиката все пусто.Любые подсказки о том, почему, пожалуйста?

Спасибо, что нашли время, чтобы прочитать это, и любая помощь или указатели приветствуются.

С уважением,

Кристиан

1 Ответ

0 голосов
/ 14 мая 2018

Я рекомендую не использовать глобальное состояние и вместо этого использовать функции, которые возвращают значения напрямую.

...