去年8月份,我拿到了数据挖掘工程师的offer。很多人告诉我,数据挖掘工程师就是每天分析分析数据,再拍一下脑袋,想出几个新特征,或者调调参数,他们还有个外号叫『调参工程师』。
今年8月份,我已经正式入职一个月了,那么我的第一个月工作是什么呢?
1、阅读我们组负责的核心代码,并做一次汇报。大部分代码都是用python或shell脚本编写,很容易看懂每一行代码的含义。虽然能够轻易认识每一行代码,但要弄懂整套代码的流程和细节就不那么容易了。『1+1>2』,『虽然每个字都听得懂,但就是不知道他在说啥』……这类情况与我现在碰到的问题也是大同小异的。除了编程语言,我们还需要了解hadoop的基础知识,因为公司的数据量都相当大,单机一般跑不动数据。另外,我们需要预先知道机器学习应用的常见套路:解析输入数据,提取一级特征,提取二级特征,……用分类器进行训练,预测,获得一个分数,然后和其他分数进行整合,输出结果。
2、学习开发工具和开发流程。读书的时候,我一直用C++在Windows上进行内核开发。现在需要学习基本的linux命令,hadoop命令,SVN的使用,vim的使用,怎么提交代码并将代码上线。
3、接手师兄的部分工作,协助师兄完成一些任务。工作可以分为两类。第一类,接手的项目。这一块非常重要,因为你未来的几个月都要和它纠缠在一起。认认真真看代码,在师兄的指导下完成与该项目相关的小任务,能够跑通这个项目,知道怎么修改代码。以后数据或别人告诉你,你的项目出问题了,你要能及时跟踪问题,定位问题,解决问题。第二类,接手的事务性工作。这部门工作主要是为了服务他人和团队。我目前有三个小小的事务性工作,比如接到我负责的数据源的报警信息后,需要追查报警原因。
——————————干货分享—————————
干货四篇:SVN,Linux,Hadoop,策略
SVN篇
SVN代码提交步骤
1、从SVN上下载代码:svn co 代码地址
2、修改代码
3、在本地自测
4、发起code review
5、评审人进行code review
6、一般情况下需要进行QA评测,如果改动较少,也可以免测
7、提交代码,分五步
查看本地代码与最新代码的差异:svn diff
没改动的的代码与svn的最新版本同步:svn up
将新增的文件加入svn版本控制中(若只是改动原文件,可以跳过这一步):svn add 新增文件名
将修改后的文件提交到版本库:svn ci -m "注释内容"
SVN的其他常用命令
查看所有版本的文件修改信息:svn log -v > svn_log.txt
查看指定的两个版本的差异:svn diff -r 第一个版本号:第二个版本号
更新至指定的版本:svn up -r 某一个版本号
Linux篇
文件传输
首先安装SecureCRT
从linux服务器传输文件到本地电脑:sz -be 文件名
从本地电脑传输文件到linux服务器:rz -be
从其他机器上拷贝文件到当前机器:wget -r ftp://机器名//文件夹的绝对路径
Linux的常用命令
按内容提取文件中的某些行:grep,例grep -aP ^Hello part-00000 > hello.txt
按行号提取文件中的连续行:sed,例sed -n '19,19p' text.txt >> result.txt
查看两个文件的不同:diff old.txt new.txt > diff.txt
查看文件夹中文件个数:ls | wc -l
后台执行:nohup 命令 &
解压:gunzip FileName.gz
解压缩:tar -xzvf FileName.tar.gz
建立压缩文件:tar -cvf 压缩后的文件名.tar 待压缩的目录
查看指定命令的进程ID: ps -ef |grep cmd命令
杀死进程:kill -9 [PID]
杀死含指定关键字的进程:ps -ef | grep 关键字 | grep -v grep | cut -c 9-15 | xargs kill -9
文件和目录名称自动补全:文件和目录名称前缀+tab键
跳到命令行的头部位置:Ctrl + a
跳到命令行的尾部位置:Ctrl + e
Vim的常用命令
退出编辑,不保存:q!,回车
退出编辑,保存:wq,回车
查询指定字符串:/查询字符串,回车,n向后查找,N向前查找
直接跳到指定行::行号,回车
插入,删除,修改文件内容:i进入插入模式,esc退出模式
Hadoop篇
Hadoop常用命令
hadoop命令与linux命令非常相似,通常以hadoop fs开头
从集群上复制文件到当前文件夹:hadoop fs -get 集群上的文件存放路径(带文件名)./
将集群上同一个文件夹下的所有文件合并成一个文件,放在当前文件夹中:hadoop fs -getmerge 集群上的文件存放路径(不带文件名) 合并后的文件名
运行时根据JobID修改map.capacity:例 hadoop job -set-map-capacity JobID 3000
查找指定key所在的输出文件编号:KeyFieldBasedPartitioner key 总文件个数,例如输出文件有1000个,依次为part-00000.gz,part-00001.gz,……part-00998.gz,part-00999.gz,想知道key =『大米』的记录在哪个文件,可以采用命令『KeyFieldBasedPartitioner 大米 1000』,若返回66,则表示key =『大米』的记录全在part-00066.gz文件中。
Hadoop作业的参数设置
hadoop作业模板
job_name = 作业名称
mapper = python map文件名.py
reducer = python reduce文件名.py
input = 输入路径
output = 输出路径
mapred.map.tasks = 3000
mapred.reduce.tasks = 10000
mapred.job.map.capacity = 10000
mapred.job.reduce.capacity = 5000
# "file =" 将本地文件分发到集群上的每个计算节点
file = 程序运行时所需要的可执行文件、脚本或者配置文件
策略篇
评估一个特征的修改对其他特征造成的影响
特征按纯度可以划分为基础特征和组合特征。顾名思义,组合特征是将多个特征通过函数变换组合起来。基础特征的变动,可能导致相应组合特征的变动。
如何评估一个特征的修改对其他特征造成的影响呢?常用方法是做对比实验。在同一个数据集上,分别运行修改特征前和修改特征后的代码,然后观察特征值的变化情况,并对变化作出解释。
正式上线的代码需要处理超大规模的数据,而我们自己测试时,可以只抽取少量数据,节省时间。
评估新增的功能有没有生效
基本方法也是做对比实验。重要的事情要重复说才会印象深刻。特别强调一点,和评估特征修改的影响面类似,新增的功能导致输出结果的变化要符合预期,即只改变你预期中它该变化的地方,不改变预期中它不应该变化的地方。