Возникла проблема с вычислением n разделения для больших данных.Python

Программы на Python
Anonymous
Возникла проблема с вычислением n разделения для больших данных.

Сообщение Anonymous »

Я выполняю задачу по извлечению мета-функций, но в какой-то момент кажется, что вычисления занимают всю доступную память, поэтому Ubuntu продолжает убивать процесс () из-за чрезмерного использования памяти.
Я решил разделить вычисления на более мелкие задачи, а затем агрегировать окончательный результат. Кажется, это нормально, но я заметил, что некоторые вычисления метрик не удались. Я протестировал это на небольшом наборе данных в двух сценариях: 1) с использованием всего набора данных (поскольку он помещается в память), 2) с использованием реализованного мной вычисления n_splits.
Я ожидаю, что сценарий 2 даст конечный результат примерно близок к сценарию 1. Однако он также не может вычислить эти показатели.
Чтобы получить MWE, я иллюстрирую это с помощью набора данных iris следующим образом:

Код: Выделить всё

!pip -q install pymfe # library for meta-feature comput.

import numpy as np
from sklearn.datasets import load_iris
from pymfe.mfe import MFE

data = load_iris()
X, y= data.data, data.target

Сценарий 1 вычисления над целыми данными

Код: Выделить всё

features_to_compute = ['f1', 'f2', 'f3', 't1']  # meta-features
summaries = ['min', 'max', 'mean', 'sd']        # summary

extractor = MFE(features=features_to_compute, groups=["complexity"], summary=summaries)
extractor.fit(X,y)
res = extractor.extract()

# results
for i in range(len(res[0])):
var_sp = res[0][i].split('.')
g_name = var_sp[0]
print(f"{res[0][i]} = {res[1][i]}\n")

f1.max = 0.599217152923665

f1.mean = 0.2775641932566493

f1.min = 0.05862828094263208

f1.sd = 0.2612622587707819

f2.max = 0.01914529914529914

f2.mean = 0.0063817663817663794

f2.min = 0.0

f2.sd = 0.011053543615254369

f3.max = 0.37

f3.mean = 0.12333333333333334

f3.min = 0.0

f3.sd = 0.21361959960016152

t1 = 0.12
Кажется, это нормально.
Сценарий 2 разделение на более мелкие задачи для большого набора данных, превышающего доступную память.

Код: Выделить всё

#  helper functions
def split_dataset(X, y, n_splits):
# Split the data into n_splits smaller datasets.
split_X = np.array_split(X, n_splits)
split_y = np.array_split(y, n_splits)
return split_X, split_y

def compute_meta_features(X, y, features, summary):
# Compute meta-features for a given dataset split.
extractor = MFE(features=features, groups=["complexity"], summary=summary)
extractor.fit(X,y)
return extractor.extract()

def average_results(results):
# Average the results from multiple splits.
features = results[0][0]
summary_values = np.mean([result[1] for result in results], axis=0)
return features, summary_values

n_splits = 10
split_X, split_y = split_dataset(X, y, n_splits)

results = [compute_meta_features(X_part, y_part, features=features_to_compute,
summary=summaries) for X_part, y_part in zip(split_X, split_y)]
# here stack trace issued several warnings, e.g.
0/dist-packages/pymfe/_internal.py:731: RuntimeWarning: Can't summarize feature 'f2' with summary 'mean'. Will set it as 'np.nan'.
warnings.warn(
/usr/local/lib/python3.10/dist-packages/pymfe/_internal.py:731: RuntimeWarning: Can't summarize feature 'f2' with summary 'max'. Will set it as 'np.nan'.
warnings.warn(
/usr/local/lib/python3.10/dist-packages/pymfe/_internal.py:731: RuntimeWarning: Can't summarize feature 'f2' with summary 'min'. Will set it as 'np.nan'.
warnings.warn(
/usr/local/lib/python3.10/dist-packages/pymfe/_internal.py:731: RuntimeWarning: Can't summarize feature 'f2' with summary 'sd'. Will set it as 'np.nan'.
warnings.warn(
/usr/local/lib/python3.10/dist-packages/pymfe/_internal.py:731: RuntimeWarning: Can't summarize feature 'f3' with summary 'mean'.  Will set it as 'np.nan'.

Результаты сценария 2:

Код: Выделить всё

final_features, final_summary = average_results(results)
for i in range(len(final_features)):
var_sp = final_features[i].split('.')
g_name = var_sp[0]
print(f"{final_features[i]} = {final_summary[i]}\n")

f1.max = 0.9378374974227318

f1.mean = 0.8736795575459622

f1.min = 0.8198589466408711

f1.sd = 0.058203211724503635

f2.max = nan

f2.mean = nan

f2.min = nan

f2.sd = nan

f3.max = nan

f3.mean = nan

f3.min = nan

f3.sd = nan

t1 = nan

Код: Выделить всё

f1, f2, f3, ...
все нан. Аналогичный результат получается при использовании набора данных openml Volunesa1.
Я не могу понять, что является причиной этого, в чем возникает проблема. Как это можно исправить?


Подробнее здесь: https://stackoverflow.com/questions/786 ... large-data

Вернуться в «Python»