Применение SMOTE-Tomek для вложенной перекрестной проверки данных временных рядовPython

Программы на Python
Ответить Пред. темаСлед. тема
Anonymous
 Применение SMOTE-Tomek для вложенной перекрестной проверки данных временных рядов

Сообщение Anonymous »

Я хочу выполнить вложенную перекрестную проверку для задачи классификации, гарантируя, что модель не будет подвергаться воздействию будущих данных. Поскольку данные представляют собой временные ряды, я планирую использовать стратегию разделения с учетом времени. Во внутреннем цикле вложенной перекрестной проверки я пытаюсь применить SMOTE-Tomek, но не знаю, как это сделать.
Это мой пример кадра данных.
Это мой пример фрейма данных.
# Test data
data = pd.DataFrame({
"Date": pd.date_range(start="2023-01-01", periods=100, freq='D'),
"Feature1": np.random.rand(100),
"Feature2": np.random.rand(100),
'Category': [random.choice(['A', 'B', 'C']) for _ in range(100)],
"Target": np.random.choice([0, 1], size=100)
})

и это мой код на данный момент, не уверен, что мой подход верен
!pip install imbalanced-learn

import pandas as pd
import numpy as np
import random
from sklearn.model_selection import cross_validate, GridSearchCV, TimeSeriesSplit
from sklearn.ensemble import RandomForestClassifier
from sklearn.linear_model import LogisticRegression
import category_encoders as ce
from imblearn.combine import SMOTETomek

# Defining X and y
encoder = ce.OneHotEncoder(handle_missing='value', handle_unknown='value', use_cat_names=True)

X0 = data[['Feature1', 'Feature2', 'Category']]
X_enc = encoder.fit_transform(X0)
y = data[['Target']]

X = np.array(X_enc)
y = np.array(y)

# Start nested cross-validation
# Defining each Model
RFC = RandomForestClassifier(random_state=0)
LR = LogisticRegression(random_state=0)

# Defining the cross-validation function with TimeSeriesSplit
def CrossValidate(model, X, y, print_model=False):
# Using TimeSeriesSplit for splitting by date
tscv = TimeSeriesSplit(n_splits=10)

cv = cross_validate(model, X, y, scoring='f1_macro', cv=tscv)

# Join scores and calculate the mean
scores = ' + '.join(f'{s:.2f}' for s in cv["test_score"])
mean_ = cv["test_score"].mean()

# Message formatting for classification model output
msg = f'Cross-validated F1 score: ({scores}) / 10 = {mean_:.2f}'

if print_model:
msg = f'{model}:\n\t{msg}\n'

print(msg)

# Inner loops
# Logistic Regression inner loop
LR_grid = GridSearchCV(LogisticRegression(random_state=0),
param_grid={'C': [10, 100]})
CrossValidate(LR_grid, X, y, print_model=False)
LR_grid.fit(X, y)
print('The best Parameters for Logistic Regression are:', LR_grid.best_params_)

# Random Forest inner loop
RFC_grid = GridSearchCV(RandomForestClassifier(random_state=0),
param_grid={'n_estimators': [2, 3],
'max_depth': [3, 5]})
CrossValidate(RFC_grid, X, y, print_model=False)
RFC_grid.fit(X, y)
print('The best Parameters for Random Forest are:', RFC_grid.best_params_)



Подробнее здесь: https://stackoverflow.com/questions/793 ... eries-data
Реклама
Ответить Пред. темаСлед. тема

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

  • Похожие темы
    Ответы
    Просмотры
    Последнее сообщение

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