Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Factorization machines #172

Open
wants to merge 69 commits into
base: user_item_features
Choose a base branch
from
Open
Changes from 1 commit
Commits
Show all changes
69 commits
Select commit Hold shift + click to select a range
8a3532f
added asym_rmse and asym_mae
martincousi Mar 26, 2018
de2cd0c
Merge pull request #1 from NicolasHug/master
martincousi Mar 26, 2018
6d18af6
Merge pull request #2 from martincousi/asymetric-measures
martincousi Mar 26, 2018
3f6b1d0
disable print in AlgoBase.compute_baselines()
martincousi Mar 27, 2018
daab1ba
Cancel printing of computation of similarities
martincousi Mar 28, 2018
05ef072
Cancel printing of similiraty computation
martincousi Mar 28, 2018
902246f
add load_features_df() method
martincousi Mar 29, 2018
fb64e98
modified construct_trainset() and load_features_df()
martincousi Mar 29, 2018
13f3a28
modified Trainset.__init__()
martincousi Mar 29, 2018
900c0c0
corrected bugs in print statement
martincousi Mar 29, 2018
68ccfca
use user_features_nb to test if initialized
martincousi Mar 30, 2018
f7fa4d8
revert back changes to accuracy.py
martincousi Mar 30, 2018
c6591ae
revert back changes to AlgoBase
martincousi Mar 30, 2018
e31e857
Update .gitignore
martincousi Mar 30, 2018
7d67963
Update .gitignore
martincousi Mar 30, 2018
73bea50
fixed python 2 compatibility
martincousi Mar 30, 2018
4063da8
construction of Lasso.fit()
martincousi Apr 4, 2018
34dd04b
modified predict and estimate methods
martincousi Apr 4, 2018
d275f84
include features in testset and prediction objects
martincousi Apr 4, 2018
14d1248
update matrix factorization estimate method
martincousi Apr 4, 2018
a2b87c4
adapt estimate methods for all prediction algorithms
martincousi Apr 4, 2018
3c5f7e6
add sklearn arguments to Lasso
martincousi Apr 5, 2018
7b82e78
single underscore for dummy variable
martincousi Apr 5, 2018
bf335c2
update documentation for Lasso and change filename
martincousi Apr 5, 2018
e34a5f9
correct conflict with master
martincousi Apr 5, 2018
4081244
add interaction terms in Lasso
martincousi Apr 5, 2018
d3dd0dd
add interaction terms to Lasso.estimate
martincousi Apr 5, 2018
47ff477
correct conflicts with master
martincousi Apr 5, 2018
1279424
correct verbose conflicts in knns
martincousi Apr 5, 2018
62ccd84
add add_interactions to self in Lasso
martincousi Apr 5, 2018
53b8697
change add_interactions fn name
martincousi Apr 5, 2018
7e34298
remove add_interactions_fn
martincousi Apr 5, 2018
39c2601
correct bad index
martincousi Apr 5, 2018
4f3c3a8
pep8 and description
martincousi Apr 5, 2018
aab90a5
add feature labels
martincousi Apr 5, 2018
bfb2b8d
resolve conflicts
martincousi Apr 5, 2018
f9255e1
remove Lasso
martincousi Apr 5, 2018
1d74bef
Merge branch 'master' into features-dataset
martincousi Apr 5, 2018
e63d5ad
Merge pull request #3 from martincousi/features-dataset
martincousi Apr 5, 2018
ed7180d
Revert "Features dataset"
martincousi Apr 5, 2018
40cc8d2
Merge pull request #4 from martincousi/revert-3-features-dataset
martincousi Apr 5, 2018
e3de208
Revert "Revert "Features dataset""
martincousi Apr 5, 2018
c52d707
Merge pull request #5 from martincousi/revert-4-revert-3-features-dat…
martincousi Apr 5, 2018
4fabe29
add lasso
martincousi Apr 5, 2018
e7adc87
Merge pull request #6 from martincousi/lasso
martincousi Apr 5, 2018
4fc4242
Merge pull request #7 from NicolasHug/master
martincousi Apr 6, 2018
885aab2
add factorization_machines.py
martincousi Apr 9, 2018
69c281f
add FMAlgo and FMBasic
martincousi Apr 11, 2018
b8132e5
solve bugs
martincousi Apr 12, 2018
b06a05d
add indication of features in Prediction
martincousi Apr 12, 2018
458a419
add FMBasic based on polylearn
martincousi Apr 13, 2018
d8cea2f
Remove features from Prediction
martincousi Apr 13, 2018
4337b24
changed tests
martincousi Apr 13, 2018
a0765a2
correct tests
martincousi Apr 13, 2018
1b6ee31
correct tests
martincousi Apr 13, 2018
bef04b9
correct FMBasicPL
martincousi Apr 13, 2018
c998024
add tests for datasets with features
martincousi Apr 20, 2018
531b536
add test for missing user or item features
martincousi Apr 20, 2018
991f30f
Add doc to FMBasic and FMBasicPL
martincousi Apr 24, 2018
9550933
Add FMImplicit and FMExplicit
martincousi Apr 25, 2018
e1cea2c
Add FMFeatures
martincousi Apr 25, 2018
037bf10
Added incomplete implementation of FM (without sample_weights)
martincousi May 28, 2019
011105c
Implemented FM with Pytorch
martincousi May 29, 2019
c808cde
Removed FM deprecated implementations
martincousi May 29, 2019
efe2b85
Added dev set functionnality to FM
martincousi May 29, 2019
1053a60
Update linear.py
martincousi May 29, 2019
e65e68a
Merge remote-tracking branch 'origin/lasso' into factorization-machines
martincousi May 29, 2019
cc09a6d
Change Baseline_only default verbose value
martincousi May 29, 2019
723afd7
Updated tests
martincousi Jun 3, 2019
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Prev Previous commit
Next Next commit
correct tests
martincousi committed Apr 13, 2018
commit 1b6ee312dd0f59ac6c139a59501d2e9f6bb87e65
3 changes: 0 additions & 3 deletions surprise/prediction_algorithms/factorization_machines.py
Original file line number Diff line number Diff line change
@@ -7,12 +7,9 @@
import numpy as np
import tensorflow as tf
import scipy.sparse as sps
from six import iteritems
import heapq
from tffm import TFFMClassifier, TFFMRegressor
from polylearn import FactorizationMachineRegressor

from .predictions import PredictionImpossible
from .algo_base import AlgoBase


6 changes: 3 additions & 3 deletions tests/custom_test
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
There are three lines to be ignored
Line format is user - item - rating

user3 item0 None None 5
user0 item1 None None 1
user_neverseen item_neverseen None None 5
user3 item0 5
user0 item1 1
user_neverseen item_neverseen 5
12 changes: 6 additions & 6 deletions tests/custom_train
Original file line number Diff line number Diff line change
@@ -1,9 +1,9 @@
There are three lines to be ignored
Line format is user - item - rating

user0 item0 None None 4
user1 item0 None None 4
user1 item1 None None 2
user2 item0 None None 1
user2 item1 None None 1
user3 item1 None None 5
user0 item0 4
user1 item0 4
user1 item1 2
user2 item0 1
user2 item1 1
user3 item1 5
22 changes: 11 additions & 11 deletions tests/test_dataset.py
Original file line number Diff line number Diff line change
@@ -145,12 +145,12 @@ def test_trainset_testset():
for i in range(4):
assert trainset.to_inner_uid('user' + str(i)) == i
with pytest.raises(ValueError):
trainset.to_inner_uid('unkown_user')
trainset.to_inner_uid('unknown_user')

for i in range(2):
assert trainset.to_inner_iid('item' + str(i)) == i
with pytest.raises(ValueError):
trainset.to_inner_iid('unkown_item')
trainset.to_inner_iid('unknown_item')

# test inner2raw
assert trainset._inner2raw_id_users is None
@@ -167,19 +167,19 @@ def test_trainset_testset():
algo.fit(trainset)
testset = trainset.build_testset()
algo.test(testset) # ensure an algorithm can manage the data
assert ('user0', 'item0', 4) in testset
assert ('user3', 'item1', 5) in testset
assert ('user3', 'item1', 0) not in testset
assert ('user0', 'item0', None, None, 4) in testset
assert ('user3', 'item1', None, None, 5) in testset
assert ('user3', 'item1', None, None, 0) not in testset

# Test the build_anti_testset() method
algo = BaselineOnly()
algo.fit(trainset)
testset = trainset.build_anti_testset()
algo.test(testset) # ensure an algorithm can manage the data
assert ('user0', 'item0', trainset.global_mean) not in testset
assert ('user3', 'item1', trainset.global_mean) not in testset
assert ('user0', 'item1', trainset.global_mean) in testset
assert ('user3', 'item0', trainset.global_mean) in testset
assert ('user0', 'item0', None, None, trainset.global_mean) not in testset
assert ('user3', 'item1', None, None, trainset.global_mean) not in testset
assert ('user0', 'item1', None, None, trainset.global_mean) in testset
assert ('user3', 'item0', None, None, trainset.global_mean) in testset


def test_load_form_df():
@@ -238,11 +238,11 @@ def test_build_anti_testset():
# fill with some specific value
for fillvalue in (0, 42., -1):
anti = trainset.build_anti_testset(fill=fillvalue)
for (u, i, r) in anti:
for (u, i, u_f, i_f, r) in anti:
assert r == fillvalue
# fill with global_mean
anti = trainset.build_anti_testset(fill=None)
for (u, i, r) in anti:
for (u, i, u_f, i_f, r) in anti:
assert r == trainset.global_mean
expect = trainset.n_users * trainset.n_items
assert trainset.n_ratings + len(anti) == expect
2 changes: 1 addition & 1 deletion tests/test_split.py
Original file line number Diff line number Diff line change
@@ -299,7 +299,7 @@ def test_LeaveOneOut():
# Make sure only one rating per user is present in the testset
loo = LeaveOneOut()
for _, testset in loo.split(data):
cnt = Counter([uid for (uid, _, _) in testset])
cnt = Counter([uid for (uid, _, _, _, _) in testset])
assert all(val == 1 for val in itervalues(cnt))

# test the min_n_ratings parameter
4 changes: 2 additions & 2 deletions tests/test_train2fit.py
Original file line number Diff line number Diff line change
@@ -35,7 +35,7 @@ def fit(self, trainset):
self.bu, self.bi = 1, 1
self.cnt += 1

def estimate(self, u, i):
def estimate(self, u, i, *_):
return self.est

algo = CustomAlgoFit()
@@ -91,7 +91,7 @@ def train(self, trainset):
self.bu, self.bi = 1, 1
self.cnt += 1

def estimate(self, u, i):
def estimate(self, u, i, *_):
return self.est

with pytest.warns(UserWarning):