Стратифицированное разбиение информационного блока панд в обучающем, валидационном и тестовом наборе - PullRequest
0 голосов
/ 10 июня 2018

Следующий чрезвычайно упрощенный DataFrame представляет гораздо больший DataFrame, содержащий медицинские диагнозы:

medicalData = pd.DataFrame({'diagnosis':['positive','positive','negative','negative','positive','negative','negative','negative','negative','negative']})
medicalData

    diagnosis
0   positive
1   positive
2   negative
3   negative
4   positive
5   negative
6   negative
7   negative
8   negative
9   negative

Для машинного обучения Мне нужно случайным образом разбить этот кадр данных на три подкадра следующим образом:

trainingDF, validationDF, testDF = SplitData(medicalData,fractions = [0.6,0.2,0.2])

Если массив разделения указывает долю полных данных, которые поступают в каждый подкадр, данные в подкадре должны быть взаимоисключающими, а массив разделения должен суммироваться в единицу. Кроме того, доля положительных диагнозов в каждом подмножестве должна быть примерно одинаковой.

Ответы на этот вопрос рекомендуют использовать метод выборки панд или функция train_test_split из sklearn .Но ни одно из этих решений, по-видимому, не обобщает хорошо на n разбиений, и ни одно из них не дает стратифицированного разбиения.

Ответы [ 2 ]

0 голосов
/ 29 июля 2019

Чистый pandas раствор

Разделить на поезд / валидацию / тестирование в соотношении 70/20/10%:

train_df = df.sample(frac=0.7, random_state=random_seed)
tmp_df = df.drop(train_df.index)
test_df = tmp_df.sample(frac=0.33333, random_state=random_seed)
valid_df = tmp_df.drop(test_df.index)

assert len(df) == len(train_df) + len(valid_df) + len(test_df), "Dataset sizes don't add up"
del tmp_df
0 голосов
/ 10 июня 2018

np.array_split

Если вы хотите обобщить до n разбиений, np.array_split - ваш друг (он хорошо работает с DataFrames).

fractions = np.array([0.6, 0.2, 0.2])
# shuffle your input
df = df.sample(frac=1) 
# split into 3 parts
train, val, test = np.array_split(
    df, (fractions[:-1].cumsum() * len(df)).astype(int))

train_test_split

Ветреное решение, использующее train_test_split для многослойного расщепления.

y = df.pop('diagnosis').to_frame()
X = df

X_train, X_test, y_train, y_test = train_test_split(
        X, y,stratify=y, test_size=0.4)

X_test, X_val, y_test, y_val = train_test_split(
        X_test, y_test, stratify=y_test, test_size=0.5)

Где X - DataFrameваших функций, а y - это одиночный столбец данных с вашими метками.

...