def test_sample_weight(): model = LightFM() train = sp.coo_matrix(np.array([[0, 1], [0, 1]])) with pytest.raises(ValueError): # Wrong number of weights sample_weight = sp.coo_matrix(np.zeros((2, 2))) model.fit(train, sample_weight=sample_weight) with pytest.raises(ValueError): # Wrong shape sample_weight = sp.coo_matrix(np.zeros(2)) model.fit(train, sample_weight=sample_weight) with pytest.raises(ValueError): # Wrong order of entries model.fit(train, sample_weight=sample_weight) sample_weight = sp.coo_matrix((train.data, (train.row, train.col))) model.fit(train, sample_weight=sample_weight) model = LightFM(loss='warp-kos') with pytest.raises(NotImplementedError): model.fit(train, sample_weight=np.ones(1))
def test_nan_interactions(): no_users, no_items = 1000, 1000 train = sp.rand(no_users, no_items, format='csr', random_state=42) train.data *= np.nan model = LightFM(loss='warp') with pytest.raises(ValueError): model.fit(train)
def test_nan_features(): no_users, no_items = 1000, 1000 train = sp.rand(no_users, no_items, format='csr', random_state=42) features = sp.identity(no_items) features.data *= np.nan model = LightFM(loss='warp') with pytest.raises(ValueError): model.fit(train, epochs=10, user_features=features, item_features=features)
def test_return_self(): no_users, no_items = 10, 100 train = sp.coo_matrix((no_users, no_items), dtype=np.int32) model = LightFM() assert model.fit_partial(train) is model assert model.fit(train) is model
def test_coo_with_duplicate_entries(): # Calling .tocsr on a COO matrix with duplicate entries # changes its data arrays in-place, leading to out-of-bounds # array accesses in the WARP code. # Reported in https://github.com/lyst/lightfm/issues/117. rows, cols = 1000, 100 mat = sp.random(rows, cols) mat.data[:] = 1 # Duplicate entries in the COO matrix mat.data = np.concatenate((mat.data, mat.data[:1000])) mat.row = np.concatenate((mat.row, mat.row[:1000])) mat.col = np.concatenate((mat.col, mat.col[:1000])) for loss in ('warp', 'bpr', 'warp-kos'): model = LightFM(loss=loss) model.fit(mat)
def test_regression_full_batch_predict(): no_components = 2 np.random.seed(42) ds = RandomDataset(no_items=5, density=1) model = LightFM(no_components=no_components) model.fit(ds.train, user_features=ds.user_features, item_features=ds.item_features) # Set non zero biases model.item_biases += 0.2 model.user_biases += 0.5 user_ids = [0, 1, 2] model.batch_setup(item_chunks={0: ds.item_ids}, item_features=ds.item_features, user_features=ds.user_features) recoms = model.batch_predict( user_ids=user_ids, chunk_id=0, top_k=0, # Score all items ) zeros = 0 for user_id in user_ids: scores = model.predict( user_ids=user_id, item_ids=ds.item_ids, item_features=ds.item_features, user_features=ds.user_features, num_threads=1, ) if sum(scores) != 0: zeros += 1 assert_array_almost_equal(recoms[user_id][1], scores) assert zeros != 0
def test_exception_on_divergence(): no_users, no_items = 1000, 1000 train = sp.rand(no_users, no_items, format='csr', random_state=42) model = LightFM(learning_rate=10000000.0, loss='warp') with pytest.raises(ValueError): model.fit(train, epochs=10)