Python 如何确保用户和项目出现在sklearn中的train_test_split的列车和测试数据集中?

Python 如何确保用户和项目出现在sklearn中的train_test_split的列车和测试数据集中?,python,pandas,machine-learning,scikit-learn,cross-validation,Python,Pandas,Machine Learning,Scikit Learn,Cross Validation,我有一个数据集,包括用户ID,项目ID,以及评级,如下所示: user ID item ID rating 1233 1011 4 1220 0999 3 2011 0702 1 ... 当我将它们分为train和test组时: from sklearn import cross_validation train, test = cross_validation.train_test_spli

我有一个数据集,包括
用户ID
项目ID
,以及
评级
,如下所示:

user ID     item ID    rating
 1233        1011       4
 1220        0999       3
 2011        0702       1
 ...
当我将它们分为
train
test
组时:

from sklearn import cross_validation

train, test = cross_validation.train_test_split(df, test_size = 0.2)

测试集中的用户是否已经出现在列车集中,项目是否已经出现?如果没有,我怎么做?我在这本书里找不到答案。您能告诉我吗?

如果您想确保您的培训和测试分区不包含相同的用户和项目对,那么您可以用整数标签替换每个唯一的(用户、项目)组合,然后将这些标签传递给。要为每个唯一配对分配整数标签,可以使用:


我还是很难理解你的问题。如果您想保证您的培训和测试集确实包含同一用户的示例,则可以使用:

def系列测试分割(自身、额定值、系列速率=0.8):
"""
将评分分为训练集和测试集
"""
grps=评级.groupby('user_id')。组
test_df_index=list()
列车df_索引=列表()
test_iid=list()
列车iid=列表()
对于GRP中的键:
计数=0
本地索引=列表()
grp=np.array(list(grps[key]))
n_测试=int(长度(grp)*(1-列车速度))
对于i,枚举中的索引(grp):
如果计数>=n\u测试:
打破
如果测试iid中的ratings.iloc[index]['movie\u id']:
持续
test\u iid.append(ratings.iloc[index]['movie\u id'])
test_df_index.append(索引)
局部索引追加(i)
计数+=1
grp=np.delete(grp,本地索引)
如果计数=n\u测试:
打破
test\u iid.append(ratings.iloc[index]['movie\u id'])
test_df_index.append(索引)
局部索引追加(i)
计数+=1
grp=np.delete(grp,本地索引)
序列df索引追加(grp)
test_df_index=np.hstack(np.array(test_df_index))
train_df_index=np.hstack(np.array(train_df_index))
np.random.shuffle(测试索引)
np.random.shuffle(训练索引)
返回评级.iloc[训练指数],ratings.iloc[测试指数]

您可以使用此方法进行拆分,我已经尽力确保培训集和测试集具有相同的用户id和电影id。

我不理解这个问题。你到底想做什么?@kazemakase该模型用于预测测试集中从
用户
项目
评分
。为此,我们必须测量列车组中
用户
项目
的潜在因素。那么,我如何确保测试集中的用户也在列车集中呢。当然,同样的事情也应该发生在物品中。更好吗?我也不太明白你在问什么。是否要按用户、项目或用户与项目的唯一组合进行分层?例如,您是否允许您的培训和测试分区都包含用户X对不同项目的排名,或者都包含不同用户对项目Y的排名?它们都包含用户X和项目Y的示例,只要它们都不包含用户X对项目Y的评级,是否可以?@ali_m这就是我的意思:
允许您的培训和测试分区都包含用户X对不同项目的排名,或者两者都包含不同用户对项目Y的排名
好,它们都包含用户X和项目Y的示例,只要它们都不包含用户X对项目Y的评分
对不起,我不担心训练集和测试集包含同一对用户和项目。我担心测试集中出现的用户未在培训集中测量。请参阅我的编辑。我发现很难推断你想要什么,因为你的问题措辞含糊不清。
import numpy as np
import pandas as pd
from sklearn.cross_validation import LabelKFold

df = pd.DataFrame({'users':[0, 0, 0, 0, 1, 1, 1, 1, 2, 2, 2, 2],
                   'items':[0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1],
                   'ratings':[2, 4, 3, 1, 4, 3, 0, 0, 0, 1, 0, 1]})

users_items = df[['users', 'items']].values
d = np.dtype((np.void, users_items.dtype.itemsize * users_items.shape[1]))
_, uidx = np.unique(np.ascontiguousarray(users_items).view(d), return_inverse=True)

for train, test in LabelKFold(uidx):

    # train your classifier using df.loc[train, ['users', 'items']] and
    # df.loc[train, 'ratings']...

    # cross-validate on df.loc[test, ['users', 'items']] and
    # df.loc[test, 'ratings']...
for train, test in StratifiedKFold(df['users']):
    # ...