ClassDef KuaiRandData
KuaiRandData: KuaiRandData 类用于处理和提供KuaiRand环境下的数据特征、数据帧、项目相似度、项目流行度等信息。
属性:
- train_data_path: 字符串,表示训练数据的文件路径。
- val_data_path: 字符串,表示验证数据的文件路径。
代码描述: KuaiRandData 类继承自 BaseData 类,主要负责处理KuaiRand环境下的数据。它重写了 BaseData 类的部分方法,并添加了一些特定的方法来满足KuaiRand环境的需求。
__init__
方法初始化数据路径。get_features
方法根据是否需要用户信息返回用户特征、项目特征和奖励特征。get_df
方法加载并处理指定名称的数据文件,返回处理后的数据框架、用户特征和项目特征。get_domination
方法获取项目特征的统治性信息。get_item_similarity
方法计算项目之间的相似度。get_item_popularity
方法计算项目的流行度。load_user_feat
和load_item_feat
方法分别加载用户特征和项目特征。- 类中还包含几个静态方法,如
load_mat
、load_category
、load_video_duration
和get_saved_distance_mat
,用于加载和处理特定的数据。
在项目中,KuaiRandData 类与 KuaiRandEnv 类相互调用。KuaiRandEnv 类通过调用 KuaiRandData 类的方法来加载环境数据,包括用户特征、项目特征、项目相似度等,以支持环境的运行和决策过程。
注意:
- 在使用
get_df
方法时,需要确保传入的数据文件路径正确,并且数据文件格式符合预期。 - 在处理用户特征和项目特征时,可能需要对特定的特征进行编码或转换,以适应模型的输入要求。
输出示例:
由于 KuaiRandData 类主要负责数据处理,其方法的输出通常为处理后的数据框架(DataFrame)或特征列表。例如,get_features
方法可能返回以下格式的输出:
(['user_id', 'user_active_degree', ...], ['item_id', 'feat0', 'feat1', ...], ['is_click'])
这表示用户特征列表、项目特征列表和奖励特征列表。
FunctionDef init(self)
init: 该函数用于初始化KuaiRandData类的实例。
参数: 该函数没有参数。
代码描述: __init__
函数是KuaiRandData类的构造函数,负责初始化类的实例。在这个函数中,首先通过super(KuaiRandData, self).__init__()
调用父类的构造函数来确保父类被正确初始化。接着,该函数设置了两个实例变量:train_data_path
和val_data_path
。这两个变量分别用于存储训练数据和验证数据的文件路径。在这个例子中,训练数据的文件名被设置为"train_processed.csv"
,验证数据的文件名被设置为"test_processed.csv"
。这意味着KuaiRandData类的实例将会从这两个文件中读取训练和验证数据。
注意: 在使用KuaiRandData类之前,确保相应的数据文件train_processed.csv
和test_processed.csv
存在于预期的位置,并且格式符合类的处理要求。如果文件路径或文件名有变化,需要相应地更新这些变量的值。
FunctionDef get_features(self, is_userinfo)
get_features: 此函数的功能是获取用户特征、项目特征和奖励特征的列表。
参数:
- is_userinfo: 布尔值,用于指定是否需要获取完整的用户信息特征。
代码描述:
get_features
函数根据传入的参数 is_userinfo
决定返回的用户特征范围。如果 is_userinfo
为 False
,则只返回用户的 "user_id";如果为 True
,则返回包括 "user_id"、用户活跃度、是否为直播主播、是否为视频作者、关注用户数范围、粉丝用户数范围、好友用户数范围、注册天数范围以及18个onehot编码特征。项目特征包括 "item_id"、三个特征字段和一个标准化的持续时间特征。奖励特征为单一的 "is_click" 字段,表示用户是否点击。
在项目中,get_features
函数被 EnsembleModel
类的 save_all_models
方法调用,用于获取用户特征、项目特征和奖励特征,这些特征随后用于计算和保存模型的预测结果和方差,以及模型参数和嵌入。这表明 get_features
函数在模型训练和评估过程中起着至关重要的作用,它为后续的数据处理和模型训练提供了必要的特征信息。
注意:
- 在调用此函数时,需要明确是否需要完整的用户信息特征,因为这将影响返回的用户特征集合的大小和内容。
- 函数返回的特征列表将直接影响模型的输入维度和结构,因此在设计模型时需要考虑这一点。
输出示例:
(['user_id'], ['item_id', 'feat0', 'feat1', 'feat2', 'duration_normed'], ['is_click'])
如果 is_userinfo
为 False
,上述输出示例展示了函数返回的用户特征、项目特征和奖励特征列表。
FunctionDef get_df(self, name, is_sort)
get_df: 该函数的功能是根据给定的文件名加载数据,并对数据进行预处理和特征整合。
参数:
name
: 字符串类型,指定要加载的数据文件名。is_sort
: 布尔类型,默认为True。指定是否对数据按照用户ID和时间戳进行排序。
代码描述:
get_df
函数首先根据给定的文件名和全局变量DATAPATH
构建完整的文件路径。然后,调用get_df_data
函数读取指定列的数据,这些列包括用户ID、项目ID、时间戳、是否喜欢、是否点击、长观看、规范化后的持续时间和规范化后的观看比例。
接下来,函数调用load_category
方法加载项目类别特征,该方法返回一个包含特征列表和一个特征DataFrame的元组。通过join
操作,将这些特征整合到主数据集中。
然后,通过调用load_item_feat
方法加载项目特征信息,并通过join
操作将其整合到主数据集中。
紧接着,通过调用load_user_feat
方法加载用户特征信息,并通过join
操作将其整合到主数据集中。
如果is_sort
参数为True,则对数据按照用户ID和时间戳进行排序,并重置索引。
最后,函数返回处理和整合后的主数据集、用户特征集、项目特征集和特征列表。
注意:
- 在调用
get_df
函数之前,需要确保DATAPATH
变量已正确设置,且指定的数据文件存在于该路径下。 - 该函数依赖于
get_df_data
、load_category
、load_item_feat
和load_user_feat
等函数的正确实现和数据文件的正确格式,因此在使用前需要确保这些依赖项的准备工作已经完成。
输出示例:
调用get_df("train_processed.csv")
可能返回的输出示例为:
(df_data, df_user, df_item, list_feat)
其中df_data
为主数据集DataFrame,包含了用户ID、项目ID、时间戳等信息以及整合后的特征信息;df_user
为用户特征集DataFrame,包含了用户的活跃度、是否为直播主播等信息;df_item
为项目特征集DataFrame,包含了项目的标签特征和视频平均时长信息;list_feat
为一个包含特征名称的列表。
FunctionDef get_domination(self)
get_domination: 该函数的功能是获取特征占比情况。
参数: 该函数不接受任何外部参数,但依赖于类内部状态和其他成员函数的结果。
代码描述: get_domination
函数首先调用get_df
方法,加载train_processed.csv
文件中的数据,并将其分解为数据集、用户特征集、项目特征集和特征列表。然后,函数检查feature_domination.pickle
文件是否存在于预定义的PRODATAPATH
路径下。如果该文件存在,函数将直接从该文件中加载已经计算好的特征占比情况;如果不存在,则调用get_sorted_domination_features
方法计算特征占比。计算完成后,将结果保存到feature_domination.pickle
文件中,以便将来使用。最终,函数返回特征占比的字典。
get_sorted_domination_features
方法根据给定的数据集和项目特征集,计算并排序特征的占比情况。该方法支持处理多热编码的特征,并允许通过is_multi_hot
参数、yname
目标列名称和threshold
阈值来调整计算逻辑,以适应不同的数据处理需求。
get_df
方法则负责加载和预处理指定的数据文件,整合数据特征,并返回处理后的数据集和特征集。
在项目中,get_domination
方法被多个场景调用,例如在策略学习、用户模型训练等环节,用于获取特征占比信息,以指导模型的训练和决策过程。这些调用场景表明,特征占比信息在项目中扮演着重要的角色,对于理解用户行为、优化推荐策略等方面具有重要价值。
注意:
- 在调用
get_domination
方法之前,需要确保相关的数据文件已经准备好,并且PRODATAPATH
路径正确设置。 - 该方法依赖于
pickle
模块来序列化和反序列化特征占比数据,因此需要注意文件的读写权限和数据的兼容性问题。 - 特征占比的计算可能会涉及到大量的数据处理操作,因此在性能敏感的应用场景中,应当注意优化数据处理逻辑,减少不必要的计算开销。
输出示例:
{
'feature1': [(1, 0.5), (0, 0.5)],
'feature2': [(0, 0.75), (1, 0.25)]
}
此示例展示了一个可能的输出格式,其中字典的键为特征名称,值为一个列表,列表中的每个元组表示特征值及其在数据集中的占比。
FunctionDef get_item_similarity(self)
get_item_similarity: 该函数的功能是获取物品之间的相似度。
参数: 该函数没有参数。
代码描述: get_item_similarity
函数首先尝试从预定义的路径PRODATAPATH
下加载名为"item_similarity.pickle"的文件,该文件假定包含了物品之间的相似度信息。如果该文件存在,则直接加载并返回相似度矩阵。如果文件不存在,函数将执行以下步骤来计算物品相似度:
- 调用
load_mat
函数加载用户-物品交互矩阵,该矩阵基于用户点击行为("is_click")构建。 - 使用加载的交互矩阵,调用
get_saved_distance_mat
函数获取或计算物品之间的距离矩阵。 - 计算物品相似度,这里使用的公式是
1 / (mat_distance + 1)
,以确保相似度在0到1之间,并避免除以零的错误。 - 将计算得到的相似度矩阵保存到"item_similarity.pickle"文件中,以便将来使用时可以直接加载。
在项目中,get_item_similarity
函数被prepare_train_envs_local
和learn_policy
两个函数调用。在prepare_train_envs_local
函数中,物品相似度被用于环境准备阶段,为模拟环境提供必要的相似度信息。在learn_policy
函数中,物品相似度被用于策略学习过程中,作为评估用户体验的一个因素。这表明物品相似度在项目中扮演着重要角色,既用于环境模拟,也用于策略优化。
注意:
- 确保
PRODATAPATH
变量已正确设置,且指向一个有效的文件存储路径。 - 在计算物品相似度之前,确保相关的用户-物品交互数据已经准备妥当。
- 保存的相似度矩阵文件可以避免重复计算,提高效率。
输出示例: 假设物品数量为3,返回的相似度矩阵可能如下:
[[1. 0.5 0.33]
[0.5 1. 0.25]
[0.33 0.25 1. ]]
这个矩阵展示了每对物品之间的相似度,相似度值越接近1表示物品之间越相似。
FunctionDef get_item_popularity(self)
get_item_popularity: 该函数的功能是获取每个项目的受欢迎程度。
参数: 该函数没有参数。
代码描述: get_item_popularity
函数首先尝试从预定义的路径PRODATAPATH
下加载名为item_popularity.pickle
的文件,该文件包含了项目的受欢迎程度信息。如果该文件存在,则直接加载并返回这些信息。如果文件不存在,函数将执行以下步骤来计算每个项目的受欢迎程度:
- 从
DATAPATH
路径下的train_processed.csv
文件中读取数据,使用get_df_data
函数,该函数专门用于读取处理后的数据集。读取的列包括user_id
、item_id
和is_click
。 - 计算数据集中独特的用户数和项目数。注意,项目数被硬编码为7583,这是因为测试数据中有7583个项目,而训练数据中有7538个项目。
- 过滤出
is_click
大于等于0的数据,并对这些数据按item_id
进行分组,然后计算每个项目的受欢迎程度,即该项目被点击的用户数占总用户数的比例。 - 创建一个新的DataFrame,包含所有项目的ID,并将计算得到的受欢迎程度与之合并,未匹配到的项目受欢迎程度填充为0。
- 将计算得到的项目受欢迎程度信息保存到
item_popularity.pickle
文件中,以便下次可以直接加载。
该函数在项目中的作用是为其他模块提供项目受欢迎程度的信息,这对于推荐系统的训练和评估是非常重要的。例如,在prepare_train_envs_local
和learn_policy
函数中,通过调用get_item_popularity
获取项目受欢迎程度信息,以便在训练和评估推荐策略时考虑项目的受欢迎程度。
注意: 在调用get_item_popularity
函数之前,需要确保PRODATAPATH
和DATAPATH
路径下的文件结构和内容是正确的,特别是train_processed.csv
文件必须按预期格式存在。
输出示例: 函数返回一个Pandas Series,其中索引为项目ID,值为对应的受欢迎程度。例如:
0 0.05
1 0.10
2 0.15
...
7582 0.00
Name: popularity, dtype: float64
这表示项目ID为0的项目受欢迎程度为0.05,项目ID为1的项目受欢迎程度为0.10,依此类推,直到项目ID为7582的项目,其受欢迎程度为0.00。
FunctionDef load_user_feat(self)
load_user_feat: 该函数的功能是加载用户特征数据。
参数: 该函数没有参数。
代码描述: load_user_feat
函数主要用于从指定的数据文件中加载用户特征,并对这些特征进行预处理,最终返回一个以用户ID为索引的DataFrame。具体步骤如下:
- 首先,函数通过拼接
DATAPATH
(一个全局变量,表示数据存储路径)和'user_features_pure.csv'
文件名来确定用户特征数据文件的完整路径。 - 使用
pandas.read_csv
函数读取指定列的数据。这些列包括用户ID、用户活跃度、是否为直播主播、是否为视频作者、关注用户数范围、粉丝用户数范围、好友用户数范围、注册天数范围以及18个onehot编码特征。 - 对于非onehot编码的特征列,如果特征值为'UNKNOWN',则将其映射为
chr(0)
。然后使用LabelEncoder
对这些特征进行编码。如果编码后的类别中包含chr(0)
或-124,则不进行加1操作;否则,对编码后的特征值加1,以避免某些特殊值的影响。 - 对于onehot编码的特征列,如果特征值缺失,则将其填充为-124。同样使用
LabelEncoder
进行编码,并根据编码后的类别值决定是否进行加1操作。 - 最后,将
user_id
列设置为DataFrame的索引,并返回处理后的用户特征DataFrame。
在项目中,load_user_feat
函数被get_df
函数调用,用于加载用户特征信息,并将这些信息通过join
操作合并到主数据集中。这样可以为后续的数据分析和模型训练提供丰富的用户维度特征。
注意: 在使用该函数时,需要确保DATAPATH
变量已正确设置,且user_features_pure.csv
文件存在于该路径下,并包含所有必要的列。
输出示例: 假设DATAPATH
指向的目录下有一个user_features_pure.csv
文件,该函数可能返回如下形式的DataFrame:
user_active_degree is_live_streamer is_video_author follow_user_num_range fans_user_num_range friend_user_num_range register_days_range onehot_feat0 onehot_feat1 ... onehot_feat17
user_id
1 2 1 0 3 4 2 5 0 1 ... 3
2 3 0 1 2 3 1 4 1 0 ... 2
...
此DataFrame以用户ID为索引,包含了用户的活跃度、是否为直播主播、是否为视频作者等特征,以及18个onehot编码特征。
FunctionDef load_item_feat(self)
load_item_feat: 该函数的功能是加载项目特征并与视频平均时长信息进行整合。
参数: 此函数不接受任何外部参数。
代码描述: load_item_feat
函数首先调用 load_category
方法来加载和处理项目标签特征,返回的是一个包含标签列表和一个DataFrame的元组。接着,调用 load_video_duration
方法来加载视频的平均时长信息,该信息也以DataFrame的形式返回。随后,使用DataFrame的 join
方法将项目特征DataFrame和视频平均时长信息DataFrame进行左连接(left join),连接键为 item_id
。这样,每个项目的特征信息就会与相应的视频平均时长信息整合在一起,形成一个新的DataFrame,该DataFrame包含了项目的标签特征和视频平均时长信息。
在项目中,load_item_feat
函数被 get_df
方法调用,用于获取整合了视频平均时长信息的项目特征,这对于构建推荐系统或进行数据分析是非常重要的一步。通过整合这些信息,可以更好地理解视频内容和用户行为之间的关系,从而提高推荐系统的准确性和用户满意度。
注意:
- 在调用
load_item_feat
函数之前,确保已经正确实现了load_category
和load_video_duration
方法,并且相关的数据文件路径已经设置正确,数据文件存在且格式正确。 - 由于
load_item_feat
函数依赖于load_category
和load_video_duration
方法的输出,因此在使用时需要注意这两个方法的输出格式和内容,确保它们能够正确地被整合。
输出示例: 调用 load_item_feat
函数可能返回的DataFrame示例如下:
item_id | feat0 | feat1 | feat2 | tags | duration_normed |
---|---|---|---|---|---|
1001 | 1 | 2 | -1 | ['tag1','tag2'] | 0.75 |
1002 | 1 | -1 | -1 | ['tag3'] | 0.60 |
此DataFrame包含了每个项目的标签特征(feat0, feat1, feat2, tags)和对应的视频平均时长(duration_normed)。
FunctionDef load_mat(yname, read_user_num)
load_mat: 该函数的功能是根据指定的用户行为类型加载相应的用户-物品交互矩阵。
参数:
- yname: 指定用户行为类型的字符串,默认为"is_click"。可选值包括"is_click"、"is_like"、"long_view"和"watch_ratio_normed",分别对应点击、喜欢、长时间观看和标准化观看比例。
- read_user_num: 读取的用户数量,类型为整数或None。如果指定了该参数,则只加载用户ID小于该值的数据,默认为None,表示加载所有数据。
代码描述:
函数首先根据yname
参数选择对应的CSV文件名,这些文件包含了不同用户行为类型的用户-物品交互数据。然后,函数构建文件路径并使用pandas读取CSV文件为DataFrame。如果read_user_num
参数不为None,则函数会进一步筛选出用户ID小于该参数值的部分数据。接着,函数计算唯一用户和物品的数量,并断言这些数量与预期值(用户数为27285,物品数为7583)相匹配。最后,函数使用筛选后的数据创建一个稀疏矩阵(CSR格式),并将其转换为数组形式返回。
在项目中,load_mat
函数被get_item_similarity
和load_env_data
两个函数调用。get_item_similarity
函数使用它来加载用户-物品交互矩阵,以计算物品之间的相似度。load_env_data
函数则在加载环境数据时调用load_mat
,以获取用户-物品交互矩阵、特征列表和基于用户行为类型的距离矩阵。这说明load_mat
函数在处理用户行为数据和环境数据加载过程中起着核心作用。
注意:
- 确保在调用此函数之前,相应的CSV文件已经位于正确的路径下。
- 断言用户数和物品数的目的是确保加载的数据符合预期,如果实际值与预期不符,可能需要检查数据文件或调用参数。
输出示例:
假设调用load_mat(yname="is_click", read_user_num=100)
,返回的可能是一个形状为(100, 7583)的numpy数组,其中每个元素代表特定用户对特定物品的点击行为(存在或不存在)。
FunctionDef load_category(tag_label)
load_category: 该函数的功能是加载并处理项目标签特征。
参数:
tag_label
: 字符串类型,默认值为"tags"。用于指定返回的DataFrame中标签列的名称。
代码描述:
load_category
函数主要用于从指定的数据文件中加载项目(如视频)的标签特征,并对这些特征进行预处理,最终生成两种格式的特征数据供后续使用。首先,函数通过pd.read_csv
读取存储特征的CSV文件,只保留标签列,并处理空值。对于非空的标签数据,将其转换为列表格式;对于空值,则将其替换为包含单个元素[-1]
的列表,表示缺失标签。接着,将处理后的标签列表转换为DataFrame格式,为每个标签分配一个特征列(feat0
, feat1
, feat2
),并对所有缺失值填充-1
。此外,函数还会对特征值进行加一操作,并将原始的标签列表作为新的一列添加到DataFrame中,列名由参数tag_label
指定。
在项目中,load_category
函数被多个对象调用,用于加载和整合项目特征信息。例如,在get_df
方法中,它用于加载项目特征并将其与其他数据进行合并;在load_item_feat
方法中,它用于加载项目特征,并与视频平均时长信息进行整合;在load_env_data
方法中,它用于加载项目特征,以便与其他环境数据一起使用。这些调用情况表明,load_category
函数是数据预处理和特征工程中的一个关键步骤,为后续的数据分析和模型训练提供了必要的输入。
注意:
- 确保在调用此函数之前,数据文件路径
DATAPATH
已正确设置,并且相应的CSV文件存在且格式正确。 - 由于函数内部使用了
eval
函数来处理字符串转列表的操作,因此在输入数据的安全性上需要特别注意,避免执行恶意代码。
输出示例:
调用load_category()
可能返回的输出示例为:
(
[['tag1', 'tag2'], ['tag3'], [-1]],
pd.DataFrame({
'feat0': [1, 1, -1],
'feat1': [2, -1, -1],
'feat2': [-1, -1, -1],
'tags': [['tag1', 'tag2'], ['tag3'], [-1]]
}, index=pd.Index([0, 1, 2], name='item_id'))
)
此输出示例包含了处理后的标签列表和一个DataFrame,DataFrame中包含了转换和填充后的特征值,以及原始的标签列表。
FunctionDef load_video_duration
load_video_duration: 该函数的功能是加载视频的平均时长信息。
参数: 此函数不接受任何参数。
代码描述: load_video_duration
函数首先尝试从预设的数据路径(PRODATAPATH)中加载名为"video_duration_normed.csv"的文件,该文件包含了视频的平均时长信息。如果该文件存在,则直接读取并返回其中的"duration_normed"列作为视频的平均时长数据。
如果预设路径下不存在"video_duration_normed.csv"文件,函数将从另外两个数据文件("test_processed.csv"和"train_processed.csv")中加载视频时长数据。这两个文件分别代表测试集和训练集的处理后数据。函数通过调用get_df_data
方法读取这些文件中的"item_id"和"duration_normed"列,然后将测试集和训练集的数据合并。接着,对合并后的数据按"item_id"进行分组,并计算每个视频ID的平均时长("duration_normed")。计算完成后,将结果保存到"video_duration_normed.csv"文件中,以便后续使用。
该函数与项目中的其他对象有以下调用关系:被KuaiRandData.py
中的load_item_feat
方法调用,用于获取视频的特征信息,其中包括视频的平均时长。这是构建推荐系统或进行数据分析时的一个重要步骤,因为视频时长是影响用户观看偏好和行为的关键因素之一。
注意: 在使用此函数之前,需要确保PRODATAPATH
和DATAPATH
路径下的数据文件已经准备妥当。此外,get_df_data
函数的正确实现对于从原始数据文件中读取数据至关重要。
输出示例: 函数返回的video_mean_duration
是一个DataFrame,其索引名为"item_id",包含一个名为"duration_normed"的列,示例如下:
item_id | duration_normed |
---|---|
1001 | 0.75 |
1002 | 0.60 |
... | ... |
此DataFrame包含了每个视频ID及其对应的平均时长(已规范化)。
FunctionDef get_saved_distance_mat(yname, mat)
get_saved_distance_mat: 此函数的功能是获取或计算并保存一个距离矩阵。
参数:
- yname: 一个字符串参数,用于指定距离矩阵的名称,进而构成文件名。
- mat: 一个二维数组,包含了需要计算距离的向量。
代码描述:
get_saved_distance_mat
函数首先尝试从指定路径加载已保存的距离矩阵。如果矩阵文件存在,则直接加载并返回该矩阵。如果文件不存在,则调用get_distance_mat
函数计算距离矩阵,之后将计算得到的矩阵保存到文件中,以便未来使用时可以直接加载,从而避免重复计算。这个过程涉及到矩阵的序列化和反序列化,使用了pickle模块。在计算距离矩阵时,会根据输入的mat
矩阵计算其内部向量两两之间的欧几里得距离。
在项目中,此函数被KuaiRandData
类中的其他方法调用,如get_item_similarity
和load_env_data
,用于获取项目中不同环节所需的距离矩阵。这表明get_saved_distance_mat
函数是处理数据预处理和优化存储结构的关键部分,旨在提高数据处理效率和减少重复计算。
注意:
- 输入的
mat
矩阵应该是一个二维数组,其中每一列代表一个向量。 - 需要确保
PRODATAPATH
变量已正确设置,指向一个有效的文件存储路径。 - 使用此函数前,确保已经有适当的权限去读写指定路径下的文件。
输出示例:
假设yname
为"example",且mat
为一个2x3的矩阵,表示有3个二维向量。如果距离矩阵文件不存在,函数将计算并保存一个3x3的距离矩阵到"distance_mat_example.csv"文件中。如果该文件已存在,则直接加载并返回该矩阵。返回的矩阵可能如下(仅为示例,实际值取决于具体向量):
[[0.0, 2.8284271247461903, 5.656854249492381],
[2.8284271247461903, 0.0, 2.8284271247461903],
[5.656854249492381, 2.8284271247461903, 0.0]]