Код: Выделить всё
KilledЯ решил разделить вычисления на более мелкие задачи, а затем агрегировать окончательный результат. Кажется, это нормально, но я заметил, что некоторые вычисления метрик не удались. Я протестировал это на небольшом наборе данных в двух сценариях: 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
Код: Выделить всё
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'.
Код: Выделить всё
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, ...Я не могу понять, что является причиной этого, в чем возникает проблема. Как это можно исправить?
Подробнее здесь: https://stackoverflow.com/questions/786 ... large-data