コード例 #1
0
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))
コード例 #2
0
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)
コード例 #3
0
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)
コード例 #4
0
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
コード例 #5
0
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)
コード例 #6
0
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
コード例 #7
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)