train_test_split , StratifiedShuffleSplit и StratifiedKFold от sklearn все стратифицируются на основе меток классов (y-переменная или столбец target_column). Что делать, если мы хотим выполнить выборку на основе столбцов функций (x-переменных), а не на целевом столбце. Если бы это был только один признак, было бы легко стратифицировать на основе этого одного столбца, но что, если столбцов признаков много и мы хотим сохранить пропорции популяции в выбранной выборке?
Ниже я создал df
, который изменил население с большим количеством людей с низким доходом, большим количеством женщин, наименьшим количеством людей из Калифорнии и большинством людей из штата Массачусетс. Я хочу, чтобы выбранная выборка имела эти характеристики, т. е. больше людей с низким доходом, больше женщин, меньше всего людей из Калифорнии и большинство людей из Массачусетса
import random
import string
N = 20000 # Total rows in data
names = [''.join(random.choices(string.ascii_uppercase, k = 5)) for _ in range(N)]
incomes = [random.choices(['High','Low'], weights=(30, 70))[0] for _ in range(N)]
genders = [random.choices(['M','F'], weights=(40, 60))[0] for _ in range(N)]
states = [random.choices(['CA','IL','FL','MA'], weights=(10,20,30,40))[0] for _ in range(N)]
targets_y= [random.choice([0,1]) for _ in range(N)]
df = pd.DataFrame(dict(
name = names,
income = incomes,
gender = genders,
state = states,
target_y = targets_y
))
Еще одна сложность возникает, когда для некоторых характеристик у нас очень мало примеров, и мы хотим включить по крайней мере примеры n
в выбранный образец. Рассмотрим этот пример:
single_row = {'name' : 'ABC',
'income' : 'High',
'gender' : 'F',
'state' : 'NY',
'target_y' : 1}
df = df.append(single_row, ignore_index=True)
df
.
Я хочу, чтобы эта единственная добавленная строка всегда включалась в раздел теста (n=1
здесь).
Это может быть достигнуто с помощью кода pandas
groupby
:Давайте сначала проверим характеристики населения:
Далее давайте создадим тестовый набор с 20% исходных данных
характеристики тестового набора:
Затем мы создаем набор поездов как разницу между исходным df и тестовым набором