声明:本学习笔记大概率存在诸多问题,建议另去知识分享blog查看相关内容。by小信
一、关于平台文件
.ipynb文件是使用交互式笔记本Jupyter Notebook,有文字和代码。
在jupyter下的File—>Download as —>python(.py)可以将.ipynb转化为.py文件。
注意:pycharm也可以直接打开.ipynb格式的文件查看(不能运行)。Jupyter也可以打开.py格式的文件查看(不能运行)。
————————————————
版权声明:本文为CSDN博主「小小小花儿」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:.py文件和.ipynb文件_小小小花儿的博客-CSDN博客
二、库
注:Anaconda 里面已经集成了你想要的各种机器学习库,比如:numpy,scipy,pandas等,
而且学习机器学习用jupyter notebook挺方便的。
————————————————
版权声明:本文为CSDN博主「人大神成长记2」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/weixin_43330388/article/details/88043375
1.Pandas是第三方库,需要安装;同时会安装numpy库。
2.选取的决策树模型(from sklearn.tree import DecisionTreeClassifier)需要sklearn模块,一般似乎都在虚拟环境下pip安装。。那我就放弃本地了。老老实实用BML CodeLab在线平台(不知道.py文件怎么运行,所以最终选择notebook文件写代码并运行)了。
…
三、比赛
(1)评判标准
1.混淆矩阵2x2,TP,FP,FN,TN
2.查准率precision=TP/(TP+FP)
查全率recall=TP/(TP+FN)
3.f1=2/(1/precision+1/recall)=2TP/(2TP+FP+FN)。f1 正相关评价 判断的效果。
(2)机器学习一般流程
1.数据探索是人工借助工具挖掘数据之间的关系,是最具活力、最有深远意义的步骤。
2.数据清洗是剔除离群的疑似错误的数据,避免对模型造成损害。
(3)赛题数据
1.共包含13个字段。其中uuid为样本唯一标识(1);eid为访问行为ID,udmap为行为属性key1到key9(2);common_ts为应用访问记录发生时间(毫秒时间戳)(1); x1至x8为用户相关的属性(8);target字段为预测目标(1)。
2.据观察公开数据表,eid存在重复,udmap存在unknown且key不齐。
四、Python
(1)import
1.(导入包名)import os
2.from math import pow
3.from math import *
4.(导入并赋名)import math as m
5.(导入并赋名)from math import pi as p
(2)类debug
1.data.info() 每列类型,以及查空值
2.data.head() 显示前几行,参数类型int,可空默认int
3.data.tail() 显示后几行
4.data.colums 显示所有列名,无参数
(3)读取数据
1.pandas库的read_文件格式(“文件路径”) 函数。返回对应文件形式的数据类型,比如表格。
2.使用 pd.to_datetime() 函数将时间戳列转换为 datetime 类型。参数为数据,“unit=”是输入数据的时间单位。
【如下图的common_ts】
注: 需要注意时间戳的长度, 如果是13位则unit 为 毫秒, 如果是10位则为 秒, 这是转时间戳时容易踩的坑
→
此后,用dt.hour 属性从 datetime 列中提取小时信息等。
3.数据集中, udmap实际是以字符的形式存储, 所以处理时需要先用eval 函数将'udmap' 解析为字典。
(4)数据处理
1.定义函数 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 编码后的数组
注:字典按键key迭代。
2.pandas库的apply()函数
①dataframe.apply(函数名)
②dataframe['列名'].apply(函数名) or data.loc[:,'列名'].apply(函数名)
Pandas读取某列、某行数据——loc、iloc用法总结_pandas iloc_子木同学的博客-CSDN博客
3.np.vstack() 用于将结果堆叠成一个数组。数组维度+1。
4.DataFrame的创建和使用(下方链接含baseline中常见的 加 列 操作)
Python Pandas中dataframe常用操作(创建、读取写入、切片等)_Parzival_的博客-CSDN博客
5.pd.concat([dataframe1,dataframe2],axis=1)拼接矩阵
axis:合并时参考的轴,axis=0为基于行合并,往下拼;axis=1为列合并,往右拼;默认为0。
6.备用fillna
Python中缺失值的填充fillna()函数_刘经纬老师的博客-CSDN博客
(5)特征工程
1.列与值直接比较是逐行比较逐行返回结果成列。
eg.每个样本的 'udmap' 列与字符串 'unknown' 进行比较,返回一个布尔值的 Series(可用于加列)
注:().astype(int) 将布尔值转换为整数(0 或 1)
2.map() 方法将 根据样本获取的值 映射到 对应样本(如图三)
如图一,.value_counts()(频次特征)的结果是不重复的。如图二,map是根据寻找原值来映射。
3.train_data.groupby('eid')['target'].mean()
按eid分组,求target平均值;因为target是01分布,所以十分直观。
(6)决策树模型(待补充)
1.train_data.drop(['udmap', 'common_ts', 'uuid', 'target'], axis=1)
从训练数据集中移除列 'udmap', 'common_ts', 'uuid', 'target'
2.使用 fit 方法训练模型
clf.fit(
train_data.drop(['udmap', 'common_ts', 'uuid', 'target'], axis=1), # 特征数据:移除指定的列作为特征
train_data['target'] # 目标数据:将 'target' 列作为模型的目标进行训练
)
(7)结果保存
result_df = pd.DataFrame({
'uuid': test_data['uuid'],
'target': clf.predict(test_data.drop(['udmap', 'common_ts', 'uuid'], axis=1)) #clf为决策树
})
result_df.to_csv('submit.csv', index=None)
五、回答问题
1.如果将submit.csv提交到讯飞比赛页面,会有多少的分数?
答:0.6~0.7
2.代码中如何对udmp进行了人工的onehot?
答:多维向量法,按位置记录对应数据,用0记空。