2017-02-22 12 views
2

Я использую набор данных movielens (ratings.dat) и базу данных pandas для чтения и обработки данных. Мне нужно разбить эти данные на тестовые и обучающие комплекты. При использовании PANDAS dataframe.sample функции, и может разделить данные в случайный splits.For Например:Сплит-набор данных для пользователя в соответствии с меткой времени в тренировке и тестовом наборе в python

поезд = df.sample (гидроразрыв = 0,8, random_state = 200)

теста = df.drop (train.index)

Теперь я пытаюсь сортировать данные по user_id, а затем по метке времени, и мне нужно разделить данные на 80% -20% на пользователя в наборе обучения и тестовом наборе соответственно.

Так, например, если user1 рейтинг 10 фильмов, то данные для этого пользователя следует сортируется от старых к последней в соответствии с временной меткой

рейтинги = pd.read_csv («имя_файла», Сентябре = '\ т », двигатель = 'Python', заголовок = 0)

sorted_df = ratings.sort ([ 'user_id', 'временная метка'], по возрастанию = [Правда, True])

и расщепление должно таким образом, чтобы первые 8 записей с самой старой отметкой времени были в наборе тренировок и последние 2 записи будут в тестовом наборе.

Я понятия не имею, как я мог это сделать. Какие-либо предложения?

Благодаря

данных:

  user_id item_id rating Timestamp 
15    1  539  5 838984068 
16    1  586  5 838984068 
5    1  355  5 838984474 
9    1  370  5 838984596 
12    1  466  5 838984679 
14    1  520  5 838984679 
19    1  594  5 838984679 
7    1  362  5 838984885 
20    1  616  5 838984941 
23    2  260  5 868244562 
29    2  733  3 868244562 
32    2  786  3 868244562 
36    2  1073  3 868244562 
33    2  802  2 868244603 
38    2  1356  3 868244603 
30    2  736  3 868244698 
31    2  780  3 868244698 
27    2  648  2 868244699 

ответ

3

Это требует многократного шага, но можно достичь следующим образом.

Интуиция для создания ранга в соответствии с отметкой времени, и тяготами его между 0 и 1. Тогда все, что ниже 0,8 будет ваш поезда набора, в противном случае вашего теста набора.

Как мы это делаем? Создание ранга легко, так как это

df.groupby('user_id')['Timestamp'].rank(method='first') 
Out[51]: 
0  1.0 
1  2.0 
2  3.0 
3  4.0 
4  5.0 
5  6.0 
6  7.0 
7  8.0 
8  9.0 
9  1.0 
10 2.0 
11 3.0 
12 4.0 
13 5.0 
14 6.0 
15 7.0 
16 8.0 
17 9.0 
Name: Timestamp, dtype: float64 

Затем вам нужно создать сопоставление между количеством значений в каждой группе. Вы можете найти дополнительную информацию здесь: Inplace transformation pandas with groupby.

df['user_id'].map(df.groupby('user_id')['Timestamp'].apply(len)) 
Out[52]: 
0  9 
1  9 
2  9 
3  9 
4  9 
5  9 
6  9 
7  9 
8  9 
9  9 
10 9 
11 9 
12 9 
13 9 
14 9 
15 9 
16 9 
17 9 
Name: user_id, dtype: int64 

Теперь вы можете положить все вместе

ranks = df.groupby('user_id')['Timestamp'].rank(method='first') 
counts = df['user_id'].map(df.groupby('user_id')['Timestamp'].apply(len)) 
(ranks/counts) > 0.8 
Out[55]: 
0  False 
1  False 
2  False 
3  False 
4  False 
5  False 
6  False 
7  True 
8  True 
9  False 
10 False 
11 False 
12 False 
13 False 
14 False 
15 False 
16  True 
17  True 
dtype: bool 
+1

спасибо. Объяснение очень ясное, это помогло :) – ssh26

+0

приветствия, я рад, что это сделал трюк! :) –