利用机器学习在Dask中遍历变量

2024-09-24 20:37:20 发布

您现在位置:Python中文网/ 问答频道 /正文

下午好。你知道吗

我在达斯克遇到了一个小问题。我对Dask(在Python中)相当陌生,我想使用纯Dask(而不是Dask-ML)基于名为“class”的变量运行并行化的ML模型。我想知道当我改变特征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)

不幸的是,这项工作没有并行化,所有的工作都是空的。有什么线索说明为什么吗?你知道吗

感谢您花时间阅读本文,我们非常欢迎您的帮助和指点。你知道吗

谨致问候

基督教徒


Tags: 数据targetdfmodelallpredictresultsdask