def test_tf_bmf_batch_accuracy(tf_session): from lenskit.algorithms import basic from lenskit.algorithms import bias import lenskit.crossfold as xf from lenskit import batch import lenskit.metrics.predict as pm ratings = lktu.ml100k.ratings algo = lktf.BiasedMF(25, damping=10, batch_size=1024, epochs=20, rng_spec=42) algo = basic.Fallback(algo, bias.Bias(damping=10)) def eval(train, test): _log.info('running training') algo.fit(train) _log.info('testing %d users', test.user.nunique()) return batch.predict(algo, test) folds = xf.partition_users(ratings, 5, xf.SampleFrac(0.2)) preds = pd.concat(eval(train, test) for (train, test) in folds) mae = pm.mae(preds.prediction, preds.rating) assert mae == approx(0.83, abs=0.025) user_rmse = preds.groupby('user').apply( lambda df: pm.rmse(df.prediction, df.rating)) assert user_rmse.mean() == approx(1.03, abs=0.05)
def test_tf_bmf_save_load(tmp_path, tf_session): "Training, saving, and loading a bias model." fn = tmp_path / 'bias.bpk' ratings = lktu.ml_test.ratings original = lktf.BiasedMF(20, batch_size=1024, epochs=20) original.fit(ratings) assert original.user_features_.shape == (ratings.user.nunique(), 20) assert original.item_features_.shape == (ratings.item.nunique(), 20) binpickle.dump(original, fn) _log.info('serialized to %d bytes', fn.stat().st_size) algo = binpickle.load(fn) assert algo.bias.mean_ == original.bias.mean_ assert np.all(algo.bias.user_offsets_ == original.bias.user_offsets_) assert np.all(algo.bias.item_offsets_ == original.bias.item_offsets_) assert np.all(algo.user_features_ == original.user_features_) assert np.all(algo.item_features_ == original.item_features_) preds = algo.predict_for_user(100, [5, 10, 30]) assert all(preds.notna())