Python Стратифицированный KFold - PullRequest
0 голосов
/ 16 июня 2020

У меня есть фрейм данных df, который выглядит примерно так. Я пытаюсь смоделировать эти данные, используя логистическую c регрессию, где функции (f1-f6) являются двоичными, а цель также двоичными. уверен, что в обучающем наборе и наборе тестов есть прилично равномерное распределение меток. Но я хочу убедиться, что распределение равномерное, для каждой функции также четное.

Например, у меня может быть перекрестная таблица для определенной функции, например:

  target   0 1
f1 
0        240 125
1         11 18

Как вы можете увидеть, что f1, равный 1, имеет небольшое количество случаев, и я хочу убедиться, что он отображается как в тесте, так и в наборе для обучения разумно. Я хочу убедиться в этом для всех функций.

Я сделал что-то вроде ниже (https://scikit-learn.org/stable/modules/generated/sklearn.model_selection.StratifiedKFold.html). Но я думаю, это только гарантирует, что ярлыки даже не учитывают дисбаланс функций. Как я могу выполнить перекрестную проверку данных, чтобы обеспечить прилично равномерное распределение по всем функциям / меткам?

import numpy as np
from sklearn.model_selection import StratifiedKFold
X = df[['f1','f2','f3','f4','f5','f6']]
y = df['target']
skf = StratifiedKFold(n_splits=2)
skf.get_n_splits(X, y)

StratifiedKFold(n_splits=5)
for train_index, test_index in skf.split(X, y):
     X_train, X_test = X.iloc[train_index], X.iloc[test_index]
     y_train, y_test = y.iloc[train_index], y.iloc[test_index]
]

1 Ответ

0 голосов
/ 25 июня 2020

Я использовал метод, который Джейсон Браунли, Machine Learning Mastery, объясняет и показывает хороший простой рабочий пример:

from sklearn.model_selection import KFold
import pandas as pd

data = {'f1': [0,0,0,1],
        'f2': [0,1,1,1],
        'f3': [1,0,1,0],
        'f4': [1,0,1,0],
        'f5': [0,0,1,1],
        'f6': [1,0,0,0],
        'target': [0,0,1,1]}

df = pd.DataFrame(data, columns=['f1','f2','f3','f4','f5','f6','target'])

print(df)

kfold = KFold(3, True, 1)

for train, test in kfold.split(data):
    print('train: %s, test: %s' % (train, test))

# scikit-learn k-fold cross-validation
from numpy import array
from sklearn.model_selection import KFold

# data sample
data = array([0, 0, 1, 1, 0, 1, 0])

# prepare cross validation
kfold = KFold(3, shuffle=True, random_state=1, )

# enumerate splits
for train, test in kfold.split(data):
    print('train: %s, test: %s' % (data[train], data[test]))

https://machinelearningmastery.com/k-fold-cross-validation/

Вот результат PyCharm на Macbook Pro с использованием Python 3.8:

введите описание изображения здесь

...