Cornac Framework

Cornac 框架

Cornac 是多模态推荐系统的比较框架。它侧重于使利用辅助数据(例如,项目描述性文本和图像、社交网络等)的模型变得方便Cornac 支持快速实验和直接实施新模型。它与现有的机器学习库(例如 TensorFlow、PyTorch)高度兼容

Cornac

快速开始

实验分为五个步骤:

  1. 数据加载
  2. 数据分割
  3. 定义模型
  4. 定义指标
  5. 运行

1、数据加载

1
2
# Load a sample dataset (e.g., MovieLens)
ml_100k = cornac.datasets.movielens.load_feedback()

2、数据分割

1
2
3
4
5
6
7
8
# Split the data into training and testing sets
'''
test_size=0.2: 将数据分成 80% 用于训练,20% 用于测试。
data=ml_100k: 使用 MovieLens 100K 数据集。
rating_threshold: 仅将大于或等于 4.0 的评分视为正面评分。其他评分将被视为用户不喜欢的内容。
seed=123: 以确保结果可重现。将种子设置为特定值将始终产生相同的结果。
'''
rs = RatioSplit(data=ml_100k, test_size=0.2, rating_threshold=4.0, seed=123)

3、定义模型

1
2
3
4
5
6
7
8
9
10
11
12
# Instantiate a recommender model(BPR)
'''
k=10: 将潜在因子的数量设置为10。这意味着每个用户和项目将由 10 个数字的向量表示。
max_iter=200: 将最大迭代次数设置为200。这意味着模型最多将进行 200 次迭代训练。
learning_reg=0.001: 将学习率设置为0.001。这控制模型从每次迭代中学习多少。
lambda_reg=0.01: 将正则化参数设置为0.01。这控制模型对用户和项目向量中较大值的惩罚程度。
seed=123: 以确保结果可重现。将种子设置为特定值将始终产生相同的结果,这是用于 RatioSplit 对象的相同种子。
'''
models = [
BPR(k=10, max_iter=200, learning_rate=0.001, lambda_reg=0.01, seed=123),
PMF(k=10, max_iter=100, learning_rate=0.001, lambda_reg=0.001, seed=123)
]

4、定义指标

1
2
3
4
5
6
7
# Define metrics to evaluate the models
'''
Precision: 精度指标衡量与用户相关的推荐商品的比例。精度越高,模型越好。
Recall: 召回率指标衡量推荐给用户的相关商品的比例。召回率越高,模型越好。
此实例中计算将基于针对每个用户的 10 条建议进行。
'''
metrics = [Precision(k=10), Recall(k=10)]

5、运行

1
2
3
4
5
6
7
8
9
# Put it together in an experiment
'''
eval_method=rs: 使用 RatioSplit 之前定义的对象。
models=models: 使用 BPR 之前定义的模型。
metrics=metrics: 使用之前定义的 Precision 和 Recall。
user_based=True: 根据单个用户评估模型。这意味着将计算每个用户的平均表现,并在所有用户之间取平均值以获得最终结果(用户权重相等)。
user_based=False: 这与通过设置基于所有评分进行评估相反。
'''
cornac.Experiment(eval_method=rs, models=models, metrics=metrics, user_based=True).run()

全部代码

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
import cornac
from cornac.eval_methods import RatioSplit
from cornac.models import BPR, PMF
from cornac.metrics import Precision, Recall

# Load a sample dataset (e.g., MovieLens)
ml_100k = cornac.datasets.movielens.load_feedback()

# Split the data into training and testing sets
'''
test_size=0.2: 将数据分成 80% 用于训练,20% 用于测试。
data=ml_100k: 使用 MovieLens 100K 数据集。
rating_threshold: 仅将大于或等于 4.0 的评分视为正面评分。其他评分将被视为用户不喜欢的内容。
seed=123: 以确保结果可重现。将种子设置为特定值将始终产生相同的结果。
'''
rs = RatioSplit(data=ml_100k, test_size=0.2, rating_threshold=4.0, seed=123)

# Instantiate a recommender model(BPR)
'''
k=10: 将潜在因子的数量设置为10。这意味着每个用户和项目将由 10 个数字的向量表示。
max_iter=200: 将最大迭代次数设置为200。这意味着模型最多将进行 200 次迭代训练。
learning_reg=0.001: 将学习率设置为0.001。这控制模型从每次迭代中学习多少。
lambda_reg=0.01: 将正则化参数设置为0.01。这控制模型对用户和项目向量中较大值的惩罚程度。
seed=123: 以确保结果可重现。将种子设置为特定值将始终产生相同的结果,这是用于 RatioSplit 对象的相同种子。
'''
models = [
BPR(k=10, max_iter=200, learning_rate=0.001, lambda_reg=0.01, seed=123),
PMF(k=10, max_iter=100, learning_rate=0.001, lambda_reg=0.001, seed=123)
]

# Define metrics to evaluate the models
'''
Precision: 精度指标衡量与用户相关的推荐商品的比例。精度越高,模型越好。
Recall: 召回率指标衡量推荐给用户的相关商品的比例。召回率越高,模型越好。
此实例中计算将基于针对每个用户的 10 条建议进行。
'''
metrics = [Precision(k=10), Recall(k=10)]

# Put it together in an experiment
'''
eval_method=rs: 使用 RatioSplit 之前定义的对象。
models=models: 使用 BPR 之前定义的模型。
metrics=metrics: 使用之前定义的 Precision 和 Recall。
user_based=True: 根据单个用户评估模型。这意味着将计算每个用户的平均表现,并在所有用户之间取平均值以获得最终结果(用户权重相等)。
user_based=False: 这与通过设置基于所有评分进行评估相反。
'''
cornac.Experiment(eval_method=rs, models=models, metrics=metrics, user_based=True).run()

实验结果

研究工作

研究分为四个步骤:

  1. 进行实验
  2. 调整超参数
  3. 优化超参数
  4. 定义超参数并运行

1、进行实验

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
import cornac
from cornac.eval_methods import RatioSplit
from cornac.models import BPR, PMF
from cornac.metrics import Precision, Recall

# Load a sample dataset (e.g., MovieLens)
ml_100k = cornac.datasets.movielens.load_feedback()

# Split the data into training and testing sets
rs = RatioSplit(data=ml_100k, test_size=0.2, rating_threshold=4.0, seed=123)

# Instantiate a matrix factorization model (e.g., BPR)
models = [
BPR(k=10, max_iter=200, learning_rate=0.001, lambda_reg=0.01, seed=123),
PMF(k=10, max_iter=100, learning_rate=0.001, lambda_reg=0.001, seed=123),
]

# Define metrics to evaluate the models
metrics = [Precision(k=10), Recall(k=10)]

# put it together in an experiment, voilà!
cornac.Experiment(eval_method=rs, models=models, metrics=metrics, user_based=True).run()

2、调整超参数

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
import cornac
from cornac.eval_methods import RatioSplit
from cornac.models import BPR
from cornac.hyperopt import Discrete, Continuous
from cornac.hyperopt import GridSearch, RandomSearch

# Load a sample dataset (e.g., MovieLens)
ml_100k = cornac.datasets.movielens.load_feedback()

# Split the data into training, validation and testing sets
'''
在 RatioSplit 方法中添加了验证集。
实例化用于跟踪模型性能的 Recall@100 指标
'''
rs = RatioSplit(data=ml_100k, test_size=0.1, val_size=0.1, rating_threshold=4.0, seed=123)

# Instantiate Recall100 for evaluation
rec100 = cornac.metrics.Recall(100)

# Instantiate a matrix factorization model(BPR)
bpr = BPR(k=10, max_iter=200, learning_rate=0.001, lambda_reg=0.01, seed=123)

3、优化超参数

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
'''
想要优化 k 和 learning_rate 超参数。为此,可以使用 cornac.hyperopt 模块来执行搜索
'''
# Grid Search
gs_bpr = GridSearch(
model=bpr,
space=[
Discrete(name='k', values=[5, 10, 50]),
Discrete(name="learning_rate", values=[0.001, 0.05, 0.01, 0.1])
],
metric=rec100,
eval_method=rs,
)

# Random Search
rs_bpr = RandomSearch(
model=bpr,
space=[
Discrete(name='k', values=[5, 10, 50]),
Continuous(name="learning_rate", low=0.001, high=0.01)
],
metric=rec100,
eval_method=rs,
n_trails=20,
)

4、 定义超参数并运行

1
2
3
4
5
6
7
8
9
10
11
# Define the experiment
cornac.Experiment(
eval_method=rs,
models=[gs_bpr, rs_bpr],
metrics=[rec100],
user_based=False,
).run()

# Obtain the best params
print(gs_bpr.best_params)
print(rs_bpr.best_params)

全部代码

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
import cornac
from cornac.eval_methods import RatioSplit
from cornac.models import BPR
from cornac.hyperopt import Discrete, Continuous
from cornac.hyperopt import GridSearch, RandomSearch

# Load a sample dataset (e.g., MovieLens)
ml_100k = cornac.datasets.movielens.load_feedback()

# Split the data into training, validation and testing sets
'''
在 RatioSplit 方法中添加了验证集。
实例化用于跟踪模型性能的 Recall@100 指标
'''
rs = RatioSplit(data=ml_100k, test_size=0.1, val_size=0.1, rating_threshold=4.0, seed=123)

# Instantiate Recall100 for evaluation
rec100 = cornac.metrics.Recall(100)

# Instantiate a matrix factorization model(BPR)
bpr = BPR(k=10, max_iter=200, learning_rate=0.001, lambda_reg=0.01, seed=123)

'''
想要优化 k 和 learning_rate 超参数。为此,可以使用 cornac.hyperopt 模块来执行搜索
'''
# Grid Search
gs_bpr = GridSearch(
model=bpr,
space=[
Discrete(name='k', values=[5, 10, 50]),
Discrete(name="learning_rate", values=[0.001, 0.05, 0.01, 0.1])
],
metric=rec100,
eval_method=rs,
)

# Random Search
rs_bpr = RandomSearch(
model=bpr,
space=[
Discrete(name='k', values=[5, 10, 50]),
Continuous(name="learning_rate", low=0.001, high=0.01)
],
metric=rec100,
eval_method=rs,
n_trails=20,
)

# Define the experiment
cornac.Experiment(
eval_method=rs,
models=[gs_bpr, rs_bpr],
metrics=[rec100],
user_based=False,
).run()

# Obtain the best params
print(gs_bpr.best_params)
print(rs_bpr.best_params)

实验结果


Cornac Framework
https://www.renkelin.vip/2025/02/21/Cornac-framework/
Author
Kolin
Posted on
February 21, 2025
Licensed under