Datawhale夏令营第三期:机器学习baseline代码解读

我的python基础不是很好,所以把每段代码都跑了一下

读取数据并print() :


结合udmap的具体数据来看:

存在字典形式 {  } ,还存在 unknown

那么在代码中就要对两种形式分别进行编码 

# 3. 将 'udmap' 列的每个数据进行 One-Hot 编码
# 数据样例:
#                    udmap  key1  key2  key3  key4  key5  key6  key7  key8  key9
# 0           {'key1': 2}     2     0     0     0     0     0     0     0     0
# 1           {'key2': 1}     0     1     0     0     0     0     0     0     0
# 2  {'key1': 3, 'key2': 2}   3     2     0     0     0     0     0     0     0

# 在 python 中, 形如 {'key1': 3, 'key2': 2} 格式的为字典类型对象, 通过key-value键值对的方式存储
# 而在本数据集中, udmap实际是以字符的形式存储, 所以处理时需要先用eval 函数将'udmap' 解析为字典

# 具体实现代码:
# 定义函数 udmap_onethot,用于将 'udmap' 列进行 One-Hot 编码
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 编码后的数组

 具体解读:

import numpy as np

v = np.zeros(9)
print(v)

得到结果:[0. 0. 0. 0. 0. 0. 0. 0. 0.]


如果为 unknown ,则先返回一个零数组

如果有值,则

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)]  # 将字典中的值存储在对应的索引位置上

因为python的索引是从0开始,所以 key1 有值时,要把值保存在 第  0  列


train_udmap_df = pd.DataFrame(np.vstack(train_data['udmap'].apply(udmap_onethot)))
test_udmap_df = pd.DataFrame(np.vstack(test_data['udmap'].apply(udmap_onethot)))
train_data['udmap'].apply(udmap_onethot) 
    把 udmap_onehot 这个方法,apply到 train_data 中 'udmap' 对应的每一行(一行是一个样本)
np.vstack()
    按行进行堆叠(因为本来就是按行的)
pd.DataFrame
    给堆叠好的数组带上标签

Numpy 中 np.vstack() 和 np.hstack() 简单解析_南淮北安的博客-CSDN博客icon-default.png?t=N7T8https://blog.csdn.net/nanhuaibeian/article/details/100597342?ydreferer=aHR0cHM6Ly9jbi5iaW5nLmNvbS8%3D创建pd.DataFrame的方法. pd.DataFrame函数详解 - 知乎 (zhihu.com)icon-default.png?t=N7T8https://zhuanlan.zhihu.com/p/258097637

print(np.vstack(train_data['udmap'].apply(udmap_onethot)))

运行结果: 

print(pd.DataFrame(np.vstack(train_data['udmap'].apply(udmap_onethot))))

运行结果:(带上 行和列 的默认标签)


train_udmap_df.columns = ['key' + str(i) for i in range(1, 10)]
test_udmap_df.columns = ['key' + str(i) for i in range(1, 10)]
print(train_udmap_df.columns)

给数据赋予 新的 列标签

运行结果:


把key1...key9 按列 加在数据的后面

train_data = pd.concat([train_data, train_udmap_df], axis=1)
test_data = pd.concat([test_data, test_udmap_df], axis=1)
print(train_data)


与最开始的对比

最开始的数据
加上key1...key9之后的数据


执行完这个代码,会使 train_data 新增一列

处理 前面没处理的 unknown

train_data['udmap_isunknown'] = (train_data['udmap'] == 'unknown').astype(int)
test_data['udmap_isunknown'] = (test_data['udmap'] == 'unknown').astype(int)
print(train_data['udmap_isunknown'])
print(train_data)


eid是访问行为ID

train_data['eid_freq'] = train_data['eid'].map(train_data['eid'].value_counts())
test_data['eid_freq'] = test_data['eid'].map(train_data['eid'].value_counts())
print(train_data['eid'].value_counts())
print(train_data['eid_freq'])
print(train_data)
train_data['eid'].value_counts() 返回每个 eid 出现的频次计数

 eid 为26 时,出现了174811次......

.map() 方法将每个样本的 eid 映射到训练数据中 eid 的频次计数,

即用 频次计数 来代替 eid 中原本的数字 ,形成 eid_freq

加上eid_freq后的数据


train_data['eid_mean'] = train_data['eid'].map(train_data.groupby('eid')['target'].mean())
test_data['eid_mean'] = test_data['eid'].map(train_data.groupby('eid')['target'].mean())
print(train_data.groupby('eid')) # <pandas.core.groupby.generic.DataFrameGroupBy object at 0x000001930C8E58E0>
print(list(train_data.groupby('eid'))) # 用list来查看
print(train_data.groupby('eid')['target'].mean())
print(train_data)

groupby

Pandas教程 | 超好用的Groupby用法详解 - 知乎 (zhihu.com)icon-default.png?t=N7T8https://zhuanlan.zhihu.com/p/101284491

train_data.groupby('eid') 用 eid 来对 trian_data 进行分组
截取图片: eid为0 ,eid为1 , eid为2
['target'].mean() ,计算每个 eid 分组的 目标值(target) 均值, 【不知道为什么】
然后 .map() 映射,即用 mean 来代替 eid 中原本的数字 ,形成 eid_mean

添加eid_mean后的数据

# 提取时间戳
# 使用 pd.to_datetime() 函数将时间戳列转换为 datetime 类型
# 样例:1678932546000->2023-03-15 15:14:16
# 注: 需要注意时间戳的长度, 如果是13位则unit 为 毫秒, 如果是10位则为 秒, 这是转时间戳时容易踩的坑
# 具体实现代码:
train_data['common_ts'] = pd.to_datetime(train_data['common_ts'], unit='ms')
test_data['common_ts'] = pd.to_datetime(test_data['common_ts'], unit='ms')
print(train_data['common_ts'])
print(train_data)
时间戳改变~
仅对 common_ts 进行更新

提取小时信息,可以判断是几点进入网站?

# 使用 dt.hour 属性从 datetime 列中提取小时信息,并将提取的小时信息存储在新的列 'common_ts_hour'
train_data['common_ts_hour'] = train_data['common_ts'].dt.hour
test_data['common_ts_hour'] = test_data['common_ts'].dt.hour
print(train_data)
可以看到,新增 common_ts_hour 列


终于到训练了!!!

# 加载决策树模型进行训练(直接使用sklearn中导入的包进行模型建立)
clf = DecisionTreeClassifier()
# 使用 fit 方法训练模型
# train_data.drop(['udmap', 'common_ts', 'uuid', 'target'], axis=1) 从训练数据集中移除列 'udmap', 'common_ts', 'uuid', 'target'
# 这些列可能是特征或标签,取决于数据集的设置
# train_data['target'] 是训练数据集中的标签列,它包含了每个样本的目标值
clf.fit(
    train_data.drop(['udmap', 'common_ts', 'uuid', 'target'], axis=1),  # 特征数据:移除指定的列作为特征
    train_data['target']  # 目标数据:将 'target' 列作为模型的目标进行训练
)

.drop() 会把中括号内数据移除,再返回一个新dataframe来存放删除后的数据。

python进行数据处理——pandas的drop函数_python drop_nuaadot的博客-CSDN博客icon-default.png?t=N7T8https://blog.csdn.net/nuaadot/article/details/78304642?ydreferer=aHR0cHM6Ly9jbi5iaW5nLmNvbS8%3D


预测!!!

# 对测试集进行预测,并保存结果到result_df中
# 创建一个DataFrame来存储预测结果,其中包括两列:'uuid' 和 'target'
# 'uuid' 列来自测试数据集中的 'uuid' 列,'target' 列将用来存储模型的预测结果
result_df = pd.DataFrame({
    'uuid': test_data['uuid'],  # 使用测试数据集中的 'uuid' 列作为 'uuid' 列的值
    'target': clf.predict(test_data.drop(['udmap', 'common_ts', 'uuid'], axis=1))
    # 使用模型 clf 对测试数据集进行预测,并将预测结果存储在 'target' 列中
})

保存结果

result_df.to_csv('submit.csv', index=None)

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值