Я хочу выполнить вложенную перекрестную проверку для задачи классификации, гарантируя, что модель не будет подвергаться воздействию будущих данных. Поскольку данные представляют собой временные ряды, я планирую использовать стратегию разделения с учетом времени. Во внутреннем цикле вложенной перекрестной проверки я пытаюсь применить 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
Применение SMOTE-Tomek для вложенной перекрестной проверки данных временных рядов ⇐ Python
Программы на Python
1736046404
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_)
Подробнее здесь: [url]https://stackoverflow.com/questions/79330093/applying-smote-tomek-to-nested-cross-validation-with-timeseries-data[/url]
Ответить
1 сообщение
• Страница 1 из 1
Перейти
- Кемерово-IT
- ↳ Javascript
- ↳ C#
- ↳ JAVA
- ↳ Elasticsearch aggregation
- ↳ Python
- ↳ Php
- ↳ Android
- ↳ Html
- ↳ Jquery
- ↳ C++
- ↳ IOS
- ↳ CSS
- ↳ Excel
- ↳ Linux
- ↳ Apache
- ↳ MySql
- Детский мир
- Для души
- ↳ Музыкальные инструменты даром
- ↳ Печатная продукция даром
- Внешняя красота и здоровье
- ↳ Одежда и обувь для взрослых даром
- ↳ Товары для здоровья
- ↳ Физкультура и спорт
- Техника - даром!
- ↳ Автомобилистам
- ↳ Компьютерная техника
- ↳ Плиты: газовые и электрические
- ↳ Холодильники
- ↳ Стиральные машины
- ↳ Телевизоры
- ↳ Телефоны, смартфоны, плашеты
- ↳ Швейные машинки
- ↳ Прочая электроника и техника
- ↳ Фототехника
- Ремонт и интерьер
- ↳ Стройматериалы, инструмент
- ↳ Мебель и предметы интерьера даром
- ↳ Cантехника
- Другие темы
- ↳ Разное даром
- ↳ Давай меняться!
- ↳ Отдам\возьму за копеечку
- ↳ Работа и подработка в Кемерове
- ↳ Давай с тобой поговорим...
Мобильная версия