Преамбула: Я работаю с искаженным набором данных, где из ~7000 точек данных только ~2500 являются ненулевыми значениями, причем наиболее интересными точками данных являются крайне правые выбросы. Я надеюсь использовать LightGBM для прогнозирования этих целевых данных на основе ряда функций, но у меня возникли проблемы из-за асимметрии данных. Я рассматривал возможность использования преобразований (например, log, sqrt, box-cox), но они не улучшили производительность модели машинного обучения.
Я наткнулся на imblearn.oversampling, который может быть решением моих проблем. Он создает синтетические выборки для выбросов, чтобы у модели было больше точек данных для обучения. Однако, поскольку я работаю с целыми числами, а не с классификациями, мне нужно объединить данные. Я настроил свой код следующим образом:
# Set up continous target for SMOTE
binning = KBinsDiscretizer(n_bins=200, encode='ordinal', strategy='quantile')
targets['binned'] = binning.fit_transform(new_targets.values.reshape(-1, 1)).ravel()
# Define the dynamic sampling strategy for SMOTE
smote_sampling_strategy = {i: 125 for i in range(1, 83)}
# Apply SMOTE with the adjusted strategy
smote = SMOTE(sampling_strategy=smote_sampling_strategy, random_state=42)
features_upsampled, binned_targets_upsampled = smote.fit_resample(features, new_targets['binned'])
# Replace the binned target with continuous values
bin_centers = binning.inverse_transform(binned_targets_upsampled.to_numpy().reshape(-1, 1)).ravel()
# Reconstruct upsampled targets DataFrame
upsampled_targets = pd.DataFrame({
'new_hothr': bin_centers,
'binned': binned_targets_upsampled
})
Вопрос:[/b]
Хотя мне бы хотелось использовать этот подход, у меня есть вопросы относительно лучших практик использования этого метода, которые четко не найдены в документации imblearn, например as: Как вы определяете количество ячеек, на которые нужно разделить данные? Как определить, сколько синтетических образцов нужно добавить? Как гарантировать, что этот метод не приведет к переобучению? Наконец, даже при повышении дискретизации, как описано выше, этот уточненный набор данных по-прежнему не может уловить 99-й процентиль выбросов в прогнозируемых LightGBM результатах тестирования/обучения (с использованием GridSearchCV для выбора гиперпараметров), поэтому, если у кого-то есть дополнительные предложения о том, как можно попробовать, я я весь в ушах.
Заранее всем спасибо за ваше время и идеи! -В
[b]Преамбула:[/b] Я работаю с искаженным набором данных, где из ~7000 точек данных только ~2500 являются ненулевыми значениями, причем наиболее интересными точками данных являются крайне правые выбросы. [b]Я надеюсь использовать LightGBM для прогнозирования этих целевых данных на основе ряда функций, но у меня возникли проблемы из-за асимметрии данных. Я рассматривал возможность использования преобразований (например, log, sqrt, box-cox), но они не улучшили производительность модели машинного обучения. [img] https://i.sstatic.net/82MSekyT.png[/img]
Я наткнулся на imblearn.oversampling, который может быть решением моих проблем. Он создает синтетические выборки для выбросов, чтобы у модели было больше точек данных для обучения. Однако, поскольку я работаю с целыми числами, а не с классификациями, мне нужно объединить данные. Я настроил свой код следующим образом: [code]# Set up continous target for SMOTE binning = KBinsDiscretizer(n_bins=200, encode='ordinal', strategy='quantile') targets['binned'] = binning.fit_transform(new_targets.values.reshape(-1, 1)).ravel()
# Define the dynamic sampling strategy for SMOTE smote_sampling_strategy = {i: 125 for i in range(1, 83)} # Apply SMOTE with the adjusted strategy smote = SMOTE(sampling_strategy=smote_sampling_strategy, random_state=42) features_upsampled, binned_targets_upsampled = smote.fit_resample(features, new_targets['binned'])
# Replace the binned target with continuous values bin_centers = binning.inverse_transform(binned_targets_upsampled.to_numpy().reshape(-1, 1)).ravel()
Вопрос:[/b] Хотя мне бы хотелось использовать этот подход, у меня есть вопросы относительно лучших практик использования этого метода, которые четко не найдены в документации imblearn, например as: Как вы определяете количество ячеек, на которые нужно разделить данные? Как определить, сколько синтетических образцов нужно добавить? Как гарантировать, что этот метод не приведет к переобучению? Наконец, даже при повышении дискретизации, как описано выше, этот уточненный набор данных по-прежнему не может уловить 99-й процентиль выбросов в прогнозируемых LightGBM результатах тестирования/обучения (с использованием GridSearchCV для выбора гиперпараметров), поэтому, если у кого-то есть дополнительные предложения о том, как можно попробовать, я я весь в ушах. Заранее всем спасибо за ваше время и идеи! -В