写在狗年来临之前

个人随笔 fireling 7023℃

很早就准备了一些话,想写在这里,结果拖到现在,趁着狗年来临之际,梳理一下,总结一下,规划一下。

去年的年终总结:写在鸡年来临之前,先分享给读者。

过去的一年,我的技术栈搭建更加丰满,掌握技能进一步丰富,同时作为在单位中负责开发、咨询于一体的部门,除了技术,我对于自己在其他方面的能力,如项目的需求把控、实现方案及规划、与客户的交流沟通等,也在积极的培养。

关于数据抓取:

目前我关注的重点不在这一块,就简单几句。

基于很早以前工作的积累,我整理并总结了关于网络爬虫的一系列心得分享:Python入门网络爬虫之精华版 PythonSpiderNotes,目前在Github上已经获得了1.7k+的stars。

个人认为,爬虫是一项“攻”“防”的拉锯战与持久战。搞好爬虫的重点在于你需要明白,怎样做反爬,怎样分析页面,怎么去重及存储,等等。

关于数据储存:

数据库方面,我来回折腾了一段时间的mysql、mongodb、oracle、sqlserver、elesticsearch,另外hivehbase也做了一番细致的学习和使用。

讲几点印象比较深刻的部分。

Python来连接mysql数据库,以前Python2有MySQLdb库,由于时代变了,Python2未来会逐步被Python3取代,为了与时俱进,我尝试了mysqlclientPyMySQL,它们都支持Python2和Python3。

在遇到导入oracle数据库的时候,通常需要获取dmp文件的字符集。如果该数据文件较小,完全可以采用编辑器如UltraEdit以16进制方式打开,看第2第3个字节的内容。如果dmp文件过大,那就需要在Linux上进行文件操作,使用如下命令,即可查询到字符。


cat *.dmp | od -x | head -1 | awk '{print $2 $3}' | cut -c 3-6

上面这种方式给我们带来一些启发,在处理一些大的sql文件时,我们可能只关心sql文件中的部分字段,这就可以采用sedawk命令对sql文件进行操作,提取目标字段,整合新的sql指令重写到新的sql文件中,再进行导入。

检索是一个很广泛的需求,以前大部分应用是基于lucene,而elasticsearch是一个基于lucene的搜索服务器,本质上也是一个分布式数据库,包括index、type、document、fields等概念,可以与关系型数据库做类比进行学习,这里我把它就归结到本节吧。

关于数据处理:

数据处理是数据分析和数据挖掘的前提基础,凡是好的分析和挖掘一定存在一个好的数据处理流程。很多情况下,我们获取到的原始数据,往往不是我们能够直接使用的,往往需要进行相关计算或操作。

有一些基于JDK环境的ETL工具,如kettle、openrefine,但是这往往不解渴,而且对于数据量的支持并不能灵活扩展到很大。

Python下的Pandas库则是一个科学计算的利器,尤其是Pandas能与多种数据源进行IO操作。掌握了SeriesDataFrame两种数据结构的使用,基本上在数据处理方面,可以所向披靡。

干货分享:

Pandas数据处理

关于数据分析:

个人认为,数据分析重点在于业务的理解思路的规划,因此,营销的技巧有时也是必需的。好的数据分析,本质上来说,就是给大家讲出一个好的精彩的story,这个story能带给大家思考并引起共鸣。下图是我在进行一个数据分析项目时,提炼出来的几个关键步骤。

关于数据可视化:

数据分析离不开数据可视化,我研究了市面上比较常用的在线可视化工具,包括BDP、百度图说、大数据魔镜。关联分析及可视化,是一个大的需求点,在反欺诈领域和知识图谱领域应用很广,基于此,我也重点研究了gephineo4j。下图是neo4j的UI界面,读者感兴趣的可以进一步尝试。

其他BI系统,也在持续关注,一个跟了很久的项目,superset,打算细致研究。

关于数据挖掘:

我这里说的数据挖掘,主要偏重机器学习算法

做数据挖掘的人,最怕不懂数据又似懂非懂算法的客户提需求。

数据挖掘很多时候第一步理解业务和客户需求,这一步往往被客户和销售忽略掉。我们得到的往往是客户一下子扔过来的数据,外加没有相关文档及字段说明,”你们按照需求做吧”。要知道,在梳理数据,我们往往需要从浩瀚的数据表来找关联,处理各种可能遇到的编码、字符缺失等一系列绊脚石,好的情况是做出来了,但是客户又改需求指定算法,我们往往又得另起炉灶进行数据的清理。

机器学习算法,多数情况下,是为产品服务的,而不是为项目服务的。项目在变,需求在变,算法实现也在变。而产品则是出于不断优化、精益求精的目的来做的,目标功能明确,与产品契合较好。

目前做过的项目,大致可以归纳为几类:基于时间序列进行预测的,基于线性或非线性进行回归拟合的,基于用户标签的关联分析的。项目需要,期间我重温了超参数调参的库:Optunity,并实现了粒子群算法。

时间序列预测,要注意不管是ARMAARIMA或是其他,都需要输入平稳序列,如果不是则需要做差分运算,将其转换为平稳序列。Python的statsmodels库支持时间序列预测,除此之外,它还支持线性回归预测。

在经典的机器学习算法理论方面,我重温了基本经典书籍,包括李航的《统计学习方法》、周志华的《机器学习》、Peter Harrington的《Machine Learing In Action》,详细论证了经典模型的理论推导,撸了一遍常用模型的实现代码。另外,将吴恩达的机器学习教程及讲义梳理了一遍,还有李宏毅的讲课视频,在youtube上的两个videolist:机器学习深度学习,深刻理解了CNNRNNLSTM的原理。

另外,为了给准备入门机器学习的读者一些帮助,我在Github上开源了一些个人的总结,包括Keras、TensorFlow、sklearn等常见的机器学习框架的基本使用。

干货分享:

一些常用的机器学习算法实现 MachineLearningAlgorithm