Разделите фрейм данных pandas на тест и обучение на основе уникального идентификатора

#python-3.x #pandas #dataframe #scikit-learn

Вопрос:

Я хочу разделить его на два фрейма данных(обучить и протестировать), используя значения в столбце идентификатор. Разделение должно быть таким, чтобы в первом фрейме данных у меня было 70% (уникальных) идентификаторов, а во втором фрейме данных у меня было 30% идентификаторов. Идентификаторы должны быть разделены случайным образом.

У меня есть несколько значений, соответствующих одному идентификатору.

Приведенный ниже сценарий, который я пробовал:

 Training_data, Test_data = sklearn.model_selection.train_test_split(data, data['ID_sample'].unique(), train_size=0.30, test_size=0.70, random_state=5)
 

Комментарии:

1. data_train, data_test = train_test_split(data, test_size=0.3, stratify=data['ID_sample'])

2. @pratyaysengupta Добро пожаловать в сообщество SO, чтобы получить помощь и достойный ответ, вам нужно предоставить минимальный набор данных для воспроизведения окружающей среды и дать объяснимый ответ, пожалуйста, продемонстрируйте некоторые данные из вашего фрейма данных.

Ответ №1:

Решите проблему следующим образом

 samplelist = data["ID_sample"].unique()
    training_samp, test_samp = sklearn.model_selection.train_test_split(samplelist, train_size=0.7, test_size=0.3, random_state=5, shuffle=True)
    
    training_data = data[data['ID_sample'].isin(training_samp)]
    test_data = data[data['ID_sample'].isin(test_samp)]
 

Ответ №2:

Я не специалист по склирну, но я мало что знаю об этом, и с тех пор, как это появилось, подобные вопросы я вижу, что все новички привыкли задавать.

В любом случае, вот как вы можете решить эту проблему, вы можете выбрать импорт import train_test_split из sklearn.model_selection и выполнить его. Я только что создал случайные данные и применил то же самое.

 >>> import pandas as pd
>>> import numpy as np
>>> df = pd.DataFrame(np.random.randn(100, 2))
>>> df
           0         1
0  -1.214487  0.455726
1  -0.898623  0.268778
2   0.262315 -0.009964
3   0.612664  0.786531
4   1.249646 -1.020366
..       ...       ...
95 -0.171218  1.083018
96  0.122685 -2.214143
97 -1.420504  0.469372
98  0.061177  0.465881
99 -0.262667 -0.406031

[100 rows x 2 columns]
>>> from sklearn.model_selection import train_test_split
>>> train, test = train_test_split(df, test_size=0.3)
 

Вот ваш первый фрейм данных train

 >>> train
           0         1
26 -2.651343 -0.864565
17  0.106959 -0.763388
78 -0.398269 -0.501073
25  1.452795  1.290227
47  0.158705 -1.123697
..       ...       ...
29 -1.909144 -0.732514
7   0.641331 -1.336896
43  0.769139  2.816528
59 -0.683185  0.442875
11 -0.543988 -0.183677

[70 rows x 2 columns]
 

Вот его второй фрейм данных test :

 >>> test
           0         1
30 -1.562427 -1.448936
24  0.638780  1.868500
70 -0.572035  1.615093
72  0.660455 -0.331350
82  0.295644 -0.403386
22  0.942676 -0.814718
15 -0.208757 -0.112564
45  1.069752 -1.894040
18  0.600265  0.599571
93 -0.853163  1.646843
91 -1.172471 -1.488513
10  0.728550  1.637609
36 -0.040357  2.050128
4   1.249646 -1.020366
60 -0.907925 -0.290945
34  0.029384  0.452658
38  1.566204 -1.171910
33 -1.009491  0.105400
62  0.930651 -0.124938
42  0.401900 -0.472175
80  1.266980 -0.221378
95 -0.171218  1.083018
74 -0.160058 -1.383118
28  1.257940  0.604513
87 -0.136468 -0.109718
27  1.909935 -0.712136
81 -1.449828 -1.823526
61  0.176301 -0.885127
53 -0.593061  1.547997
57 -0.527212  0.781028
 

В вашем случае в идеале это должно работать, как показано ниже, однако вам не нужно train_size определять, определяете ли вы test_size или наоборот.

 >>> train, test = train_test_split(data['ID_sample'], test_size=0.3)
 

или

 >>> train, test = train_test_split(data['ID_sample'], test_size=0.3, random_state=5)
 

или

Это возвращает список массивов …

 >>> train, test = train_test_split(data['ID_sample'].unique(), test_size=0.30, random_state=5)