ClassDef CoatData
CoatData: CoatData 类用于处理 Coat 数据集,包括加载数据、提取特征和计算物品相似度等功能。
属性:
- train_data_path: 存储训练数据文件路径的字符串,初始化为 "train.ascii"。
- val_data_path: 存储验证数据文件路径的字符串,初始化为 "test.ascii"。
代码描述: CoatData 类继承自 BaseData 类,专门用于处理 Coat 数据集。它提供了多个方法来加载数据、提取用户和物品的特征、计算物品之间的相似度和流行度等。
get_features
方法用于获取用户特征、物品特征和奖励特征。可以通过参数is_userinfo
控制是否只返回用户ID作为用户特征。get_df
方法根据给定的文件名(默认为 "train.ascii")加载交互数据,并返回处理后的数据框架,包括用户特征和物品特征。get_domination
方法计算并返回物品特征的统治度,如果已经计算过则直接从文件加载。get_item_similarity
方法计算物品之间的相似度,如果已经计算过则直接从文件加载。get_item_popularity
方法计算物品的流行度,如果已经计算过则直接从文件加载。load_user_feat
和load_item_feat
静态方法分别用于加载用户特征和物品特征。load_mat
静态方法用于加载 Coat 数据集的评分矩阵。
CoatData 类在项目中与 CoatEnv 类交互,特别是在 load_env_data
方法中,用于加载环境数据,包括物品特征和物品之间的相似度矩阵。此外,它也被 get_true_env
函数调用,用于初始化环境和数据集。
注意:
- 在使用
get_df
方法时,需要确保数据文件路径(DATAPATH)已正确设置,以便能够正确加载数据。 - 在计算物品相似度和流行度时,如果相关的.pickle文件不存在,则会进行计算并保存结果,这可能需要一定的计算时间。
输出示例:
假设调用 get_features
方法且 is_userinfo
为 True,可能的返回值为:
(['user_id', 'gender_u', 'age', 'location', 'fashioninterest'], ['item_id', 'gender_i', "jackettype", 'color', 'onfrontpage'], ["rating"])
这表示用户特征包括用户ID、性别、年龄、地点和时尚兴趣;物品特征包括物品ID、性别、夹克类型、颜色和是否在首页展示;奖励特征为评分。
FunctionDef init(self)
init: 此函数用于初始化CoatData类的实例。
参数: 此函数不接受任何外部参数。
代码描述: __init__
函数是CoatData类的构造函数,用于初始化类的实例。在这个函数中,首先通过super(CoatData, self).__init__()
调用父类的构造函数来确保父类被正确初始化。接着,函数设置了两个实例变量:train_data_path
和val_data_path
。train_data_path
变量被设置为字符串"train.ascii"
,表示训练数据的路径;val_data_path
变量被设置为字符串"test.ascii"
,表示验证数据的路径。这两个路径通常用于指向存储训练和验证数据的文件,这些数据文件采用ASCII格式存储。
注意: 在使用CoatData类时,需要确保train.ascii
和test.ascii
这两个文件存在于预期的路径下,否则在尝试访问这些路径时可能会遇到文件找不到的错误。此外,虽然这里的路径是硬编码的,但在实际应用中,可能需要根据实际情况修改这些路径以指向正确的数据文件位置。
FunctionDef get_features(self, is_userinfo)
get_features: 此函数的功能是获取用户特征、物品特征和奖励特征。
参数:
- is_userinfo: 布尔类型,用于指示是否需要获取完整的用户信息特征。
代码描述:
get_features
函数用于从数据集中提取用户特征、物品特征和奖励特征。用户特征默认包括"user_id", "gender_u", "age", "location", "fashioninterest"等,但如果参数is_userinfo
为False,则只包括"user_id"。物品特征包括"item_id", "gender_i", "jackettype", "color", "onfrontpage"。奖励特征包括"rating"。此函数通过返回这三类特征的列表,为后续的模型训练和评估提供基础数据。
在项目中,get_features
函数被save_all_models
方法调用,用于在模型保存过程中获取用户特征、物品特征和奖励特征。这些特征被用于计算均值矩阵和方差矩阵,以及在保存模型参数、模型状态和嵌入向量时作为参考。这表明get_features
函数在数据预处理和特征提取阶段起着至关重要的作用,为模型训练和评估提供了必要的数据支持。
注意:
- 在调用此函数时,需要根据实际情况决定是否需要完整的用户信息特征。如果仅需基于用户ID进行操作,应将
is_userinfo
参数设置为False以减少不必要的数据处理。 - 返回的特征列表将直接影响模型的训练和评估过程,因此在使用这些特征之前应仔细检查它们的正确性和完整性。
输出示例:
调用get_features(is_userinfo=True)
可能会返回以下样例数据:
- 用户特征: ["user_id", "gender_u", "age", "location", "fashioninterest"]
- 物品特征: ["item_id", "gender_i", "jackettype", "color", "onfrontpage"]
- 奖励特征: ["rating"]
FunctionDef get_df(self, name)
get_df: 此函数的功能是从指定的ASCII文件中读取交互数据,并结合用户特征数据和项目特征数据,构建完整的数据框。
参数:
name
: 字符串类型,默认值为 "train.ascii"。指定要读取的文件名。
代码描述:
get_df
函数首先根据提供的文件名(默认为 "train.ascii"),从预设的数据路径(DATAPATH
)中读取交互数据。这些数据使用 pandas 的 read_csv
方法读取,数据字段之间以空格分隔。接着,函数创建一个空的DataFrame df_data
,其列名为 ["user_id", "item_id", "rating"],用于存储处理后的交互数据。
函数遍历读取的交互数据的每一列,对于每个物品(列),提取出对该物品有正面评价的用户及其评分,并将这些信息添加到 df_data
中。这一步骤完成后,df_data
包含了用户ID、物品ID和评分信息。
随后,函数调用 load_user_feat
方法加载用户特征数据,并调用 CoatData.load_item_feat
静态方法加载项目特征数据。这两个方法分别从指定的ASCII文件中读取用户和项目的特征信息,并进行必要的处理。
最后,get_df
函数将用户特征数据和项目特征数据通过 "user_id" 和 "item_id" 分别与交互数据进行左连接,构建一个包含用户ID、物品ID、评分以及相应的用户和物品特征的完整数据框。在返回之前,所有的数据类型被转换为整数类型,以确保数据的一致性。
注意:
- 使用此函数前,请确保
DATAPATH
已正确设置,且指定的文件存在于该路径下。 - 此函数依赖于
load_user_feat
和load_item_feat
方法,确保这两个方法能够正确执行是使用get_df
的前提。 - 返回的数据框中的数据类型均为整数,这可能会影响后续处理,特别是在进行数学运算或模型训练时。
输出示例:
函数返回四个对象:df_data
, df_user
, df_item
, list_feat
。其中,df_data
是一个DataFrame,包含了用户ID、物品ID、评分以及用户和物品的特征信息;df_user
和 df_item
分别包含了用户和物品的特征信息;list_feat
为 None,预留作为后续可能的特征列表使用。
假设输入文件中有如下内容:
1 2 3
4 5 6
则 df_data
的可能输出为:
user_id item_id rating gender_u age location fashioninterest gender_i jackettype color onfrontpage
0 1 2 3 1 23 5 3 1 8 12 4
1 4 5 6 2 30 2 2 4 2 10 12
请注意,实际输出将取决于输入文件和用户及物品特征文件的内容。
FunctionDef get_domination(self)
get_domination: 此函数的功能是获取项目特征的占比情况。
参数: 此函数没有参数。
代码描述: get_domination
函数首先调用 get_df
方法从 "train.ascii" 文件中读取训练数据,包括数据框 df_data
和项目特征数据框 df_item
。然后,它检查预定义的数据路径 PRODATAPATH
下是否存在名为 "feature_domination.pickle" 的文件。如果该文件存在,函数将直接从该文件中加载项目特征的占比情况;如果不存在,则调用 get_sorted_domination_features
方法计算项目特征的占比情况,并将结果保存到 "feature_domination.pickle" 文件中以便将来使用。get_sorted_domination_features
方法根据项目特征和数据框计算每个特征值的出现次数及其占比,并按占比降序排序。最终,get_domination
返回项目特征的占比情况。
此函数在项目中的作用是为了优化和加速特征占比的获取过程。通过缓存计算结果,避免了在每次需要特征占比信息时重新计算,从而提高了效率。这在机器学习或推荐系统中尤其重要,因为特征占比信息通常用于特征工程或模型训练过程中。
注意:
- 确保
PRODATAPATH
路径正确设置,并且有足够的权限读写文件。 - 在多次运行或不同实验中,如果项目特征或训练数据发生变化,应删除旧的 "feature_domination.pickle" 文件以确保获取的特征占比信息是最新的。
输出示例:
{
'feature1': [(1, 0.5), (0, 0.5)],
'feature2': [(0, 0.75), (1, 0.25)]
}
此示例展示了两个特征的占比情况。对于 feature1
,值为1的占比为50%,值为0的占比也为50%;对于 feature2
,值为0的占比为75%,值为1的占比为25%。这种格式的输出有助于理解不同特征值在数据集中的分布情况。
FunctionDef get_item_similarity(self)
get_item_similarity: 此函数的功能是获取或计算物品之间的相似度。
参数: 此函数不接受任何外部参数。
代码描述: get_item_similarity
函数首先尝试从PRODATAPATH
路径下加载名为item_similarity.pickle
的文件,如果该文件存在,则直接加载并返回保存的物品相似度矩阵。如果文件不存在,则调用load_mat
函数加载预设数据矩阵,并使用get_saved_distance_mat
函数计算或获取保存的距离矩阵。随后,根据距离矩阵计算物品相似度,计算公式为1 / (mat_distance + 1)
,以确保相似度值在0到1之间。计算完成后,物品相似度矩阵被保存到item_similarity.pickle
文件中,以便将来使用。此函数在项目中被prepare_train_envs_local
和learn_policy
等函数调用,用于准备训练环境和学习策略时获取物品相似度信息,从而支持推荐系统中的物品推荐和用户体验评估。
注意:
- 确保
PRODATAPATH
路径有效,并且有足够的权限进行文件读写操作。 - 物品相似度的计算依赖于预设数据矩阵和距离矩阵的正确加载和计算,因此需要确保相关函数
load_mat
和get_saved_distance_mat
能够正常工作。 - 物品相似度矩阵的计算可能会根据数据集的大小和复杂度消耗一定的时间,特别是在首次计算并保存到文件时。
输出示例: 假设物品之间的距离矩阵为:
[[0.0, 2.0, 3.0],
[2.0, 0.0, 1.0],
[3.0, 1.0, 0.0]]
则get_item_similarity
函数可能返回如下形式的物品相似度矩阵:
[[1.0, 0.333, 0.25],
[0.333, 1.0, 0.5],
[0.25, 0.5, 1.0]]
此矩阵表示物品之间的相似度,其中值越接近1表示相似度越高。
FunctionDef get_item_popularity(self)
get_item_popularity: 此函数的功能是获取每个项目的受欢迎程度。
参数: 此函数没有参数。
代码描述: get_item_popularity
函数首先尝试从预定义的数据路径 PRODATAPATH
下读取名为 "item_popularity.pickle" 的文件,该文件包含了项目的受欢迎程度信息。如果该文件存在,则直接加载并返回这些信息。如果文件不存在,函数将调用 get_df
方法从 "train.ascii" 文件中读取训练数据,并计算每个项目的受欢迎程度。
计算受欢迎程度的步骤如下:
- 使用
get_df
方法获取训练数据,包括用户ID、项目ID和评分。 - 筛选出评分大于等于3的数据,认为这些代表用户对项目的正面评价。
- 对筛选后的数据按项目ID分组,并计算每个项目被正面评价的用户数。
- 计算每个项目的受欢迎程度,定义为正面评价的用户数除以总用户数。
- 如果项目在训练数据中没有被评价,则其受欢迎程度被设置为0。
- 最后,将计算得到的受欢迎程度信息保存到 "item_popularity.pickle" 文件中,以便将来使用。
此函数在项目中被 prepare_train_envs_local
和 learn_policy
等函数调用,用于获取项目的受欢迎程度信息,这些信息在训练环境的准备和策略学习过程中被用来评估项目的推荐效果。
注意:
- 确保
PRODATAPATH
已正确设置,并且有足够的权限读写文件。 - 项目的受欢迎程度是基于训练数据计算得出的,因此其准确性受到训练数据质量的影响。
输出示例: 函数返回一个包含项目受欢迎程度的 pandas Series 对象,索引为项目ID,值为对应的受欢迎程度。例如:
0 0.05
1 0.10
2 0.00
...
在这个示例中,项目ID为0的项目受欢迎程度为0.05,项目ID为1的项目受欢迎程度为0.10,项目ID为2的项目没有被正面评价过,因此受欢迎程度为0。
FunctionDef load_user_feat(self)
load_user_feat: 此函数的功能是加载用户特征数据。
参数: 此函数没有参数。
代码描述: load_user_feat
函数首先从指定的数据路径(DATAPATH
)中读取名为 "user_features.ascii" 的文件,该文件包含了用户的特征信息。使用 pandas 的 read_csv
方法读取数据,数据字段之间以空格分隔。接着,定义了一个特征列的索引列表 feat_cols_user
,这个列表指定了需要从原始数据中提取哪些列来构造新的用户特征数据框 df_user
。df_user
初始化为空,并且包含四个列:'gender_u', 'age', 'location', 'fashioninterest',这些列代表用户的性别、年龄、地点和对时尚的兴趣。函数接着遍历 feat_cols_user
中定义的每一段特征,将这些特征串联起来,并通过一系列转换(包括二进制逆序和对数变换)将其转换为整数类型,最后将这些处理后的特征赋值给 df_user
。df_user
的索引名被设置为 "user_id",以标识每一行数据对应的用户。
此函数在项目中被 get_df
方法调用,用于读取用户特征数据,并将这些数据与其他数据(如交互数据和物品特征数据)结合,以构建完整的数据框,用于后续的数据分析或模型训练过程。
注意: 使用此函数时,需要确保 DATAPATH
已经正确设置,并且 "user_features.ascii" 文件存在于该路径下。此外,原始数据的格式和预期的特征列需要严格匹配,否则可能会导致数据处理错误。
输出示例:
gender_u age location fashioninterest
user_id
0 1 23 5 3
1 2 30 2 2
...
此输出示例展示了一个可能的 df_user
数据框,其中包含了几个用户的性别、年龄、地点和对时尚的兴趣等特征信息。每一行代表一个用户,user_id
作为索引。
FunctionDef load_item_feat
load_item_feat: 该函数的功能是加载并处理项目特征数据。
参数: 该函数没有参数。
代码描述: load_item_feat
函数首先构建项目特征文件的路径,然后使用 pandas 库读取该文件。文件格式预期为 ASCII,字段之间使用空白符分隔。函数接着定义了一个特定的列索引列表 feat_cols_item
,这些索引指定了将要从原始数据中提取哪些列以构建新的 DataFrame。新 DataFrame df_item
的列名被指定为 ['gender_i', 'jackettype', 'color', 'onfrontpage'],这些列代表了项目的不同特征。对于每一列,函数通过将指定范围内的原始数据列合并并转换为整数类型来填充新 DataFrame 的相应列。特别地,数据转换包括反转字符串、将其作为二进制数解析,然后取对数。这一处理步骤确保了所有的特征值都是整数。最后,函数将 DataFrame 的索引名称设置为 "item_id" 并返回该 DataFrame。
在项目中,load_item_feat
函数被 get_df
和 load_env_data
函数调用。在 get_df
函数中,它用于加载项目特征数据,然后将这些数据与用户交互数据和用户特征数据结合,以构建一个完整的数据集。在 load_env_data
函数中,它同样用于加载项目特征数据,但这次是为了与其他环境数据一起使用,以支持环境的初始化和数据处理。
注意: 在使用该函数时,需要确保 DATAPATH
已正确设置,并且指定路径下存在名为 "item_features.ascii" 的文件。此外,该文件的格式和内容需要符合函数处理的预期,特别是列的选择和数据转换逻辑。
输出示例: 假设 "item_features.ascii" 文件中有以下内容:
1 0010 1000 1100 0100
2 0100 0010 1010 1100
那么,load_item_feat
函数的输出可能如下:
gender_i jackettype color onfrontpage
item_id
1 1 8 12 4
2 4 2 10 12
请注意,实际输出将取决于文件内容和指定的特征列。
FunctionDef load_mat
load_mat: 此函数的功能是加载并返回预设数据矩阵。
参数: 此函数不接受任何参数。
代码描述: load_mat
函数负责从指定的数据文件中加载矩阵数据。首先,它构造了数据文件的路径,该文件位于DATAPATH
下的RL4Rec_data
目录中,文件名为coat_pseudoGT_ratingM.ascii
。此文件来源于GitHub上的RL4Rec
仓库。然后,使用pandas
库的read_csv
方法读取该文件,其中分隔符为连续的空格("\s+"
),并且没有列名(header=None
)。读取后的数据被转换为numpy
数组,数据类型为整型(int
)。最终,这个矩阵被返回。
在项目中,load_mat
函数被get_item_similarity
和load_env_data
两个函数调用。在get_item_similarity
中,它用于加载物品评分矩阵,进一步计算物品之间的相似度并保存。在load_env_data
中,它同样用于加载物品评分矩阵,以便与其他数据一起用于环境数据的加载。这表明load_mat
函数在项目中扮演着核心数据加载的角色,为后续的数据处理和分析提供基础。
注意: 使用此函数时,需要确保DATAPATH
变量已正确设置,并且指定路径下存在coat_pseudoGT_ratingM.ascii
文件。此外,需要安装pandas
和numpy
库。
输出示例: 假设coat_pseudoGT_ratingM.ascii
文件中有如下内容:
1 2
3 4
则load_mat
函数的返回值将是一个numpy
数组:
[[1 2]
[3 4]]