解题思路
参赛选手的任务是基于训练集的样本数据,构建一个模型来预测测试集中用户的新增情况。这是一个二分类任务,其中目标是根据用户的行为、属性以及访问时间等特征,预测该用户是否属于新增用户。具体来说,选手需要利用给定的数据集进行特征工程、模型选择和训练,然后使用训练好的模型对测试集中的用户进行预测,并生成相应的预测结果。
思考:这里为什么选择机器学习算法?为什么不考虑深度学习? 在许多机器学习问题中,特征工程的重要性不容忽视。如果特征工程能够充分捕捉数据的关键特征,那么机器学习算法也能够表现很好。深度学习在某种程度上可以自动学习特征,但对于特定问题,手动设计特征可能会更有效。
思考:这里从逻辑回归和决策树中选择,哪一个模型更加合适?
- 决策树能够处理非线性关系,并且可以自动捕获特征之间的交互作用。
- 它可以生成可解释的规则,有助于理解模型如何做出决策。
- 决策树能够处理不同类型的特征,包括分类和数值型。
实践步骤
1. 导入库:首先,代码导入了需要用到的库,包括 pandas(用于数据处理和分析)和 DecisionTreeClassifier(决策树分类器)等。
2. 读取数据:代码通过使用 pd.read_csv 函数从文件中读取训练集和测试集数据,并将其存储在 train_data 和 test_data 两个数据框中。
3. 特征工程:
- udmap_onethot 函数将原始的 udmap 特征进行了预处理,将其转换为一个长度为9的向量,表示每个key是否存在。
- 对 udmap 特征进行编码,生成 udmap_isunknown 特征,表示该特征是否为空。
- 将处理后的 udmap 特征与原始数据拼接起来,形成新的数据框。
- 提取 eid 特征的频次(出现次数)和均值,并添加为新的特征。
- 使用时间戳 common_ts 提取小时部分,生成 common_ts_hour 特征。
4. 决策树模型训练和预测:
- 创建了一个 DecisionTreeClassifier 的实例,即决策树分类器。
- 使用 fit 函数对训练集中的特征和目标进行拟合,训练了决策树模型。
- 对测试集使用已训练的模型进行预测,得到预测结果。
- 将预测结果和相应的 uuid 组成一个DataFrame,并将其保存到 submit.csv 文件中。
代码实现了一个简单的特征工程和模型训练的过程。根据任务的具体要求和数据的特点,可能需要进一步优化特征工程的步骤、选择合适的模型、调参以及进行模型评估等工作。
实操并回答下面问题:
- 如果将submit.csv提交到讯飞比赛页面,会有多少的分数?
初步显示为0.62671
- 代码中如何对udmp进行了人工的onehot?
def udmap_onethot(d):
v = np.zeros(9) # 创建一个长度为 9 的零数组
if d == 'unknown': # 如果 'udmap' 的值是 'unknown'
return v # 返回零数组
d = eval(d) # 将 'udmap' 的值解析为一个字典
for i in range(1, 10): # 遍历 'key1' 到 'key9', 注意, 这里不包括10本身
if 'key' + str(i) in d: # 如果当前键存在于字典中
v[i-1] = d['key' + str(i)] # 将字典中的值存储在对应的索引位置上
return v # 返回 One-Hot 编码后的数组
这个函数的目标是将 udmap 列的内容进行 One-Hot 编码,将字典中的各个键值对对应到一个长度为 9 的数组中。具体步骤如下:
- 创建一个长度为 9 的零数组
v,用于存储 One-Hot 编码后的结果。 - 如果
udmap列的值为'unknown',说明该样本的udmap是未知的,此时直接返回零数组。 - 如果不是
'unknown',则使用eval()函数将字符串解析为字典对象,例如{'key1': 3, 'key2': 2}。 - 循环遍历从
key1到key9的键,如果某个键存在于字典中,就将对应的值存储在v数组的对应索引位置上。例如,如果字典中有'key3': 5,那么就将值5存储在v的第三个索引位置(索引为 2)上。 - 最后返回存储 One-Hot 编码后的数组
v。
在数据预处理阶段,通过对每个样本的 udmap 列应用这个自定义函数,就可以将其转换为对应的 One-Hot 编码表示,然后将编码后的特征与原始数据拼接在一起,从而完成 udmap 列的编码工作。