Harris Xiao
step think persist

<<Python机器学习及实践>>读书笔记

小结:
这本书对常见的机器学习算法都做了全面的概述,包括有监督学习,无监督学习,涵盖了全面的传统机器学习算法,已经集成学习算法,没有算法进行深入探究,介绍了每种算法的使用场景,已经算法的在skit-learn的使用方法,没有涉及到数学知识,非常适合初学者
特点:
介绍基本机器学习流程,算法全面,适合初学者对整体机器学习学科以及实践有全面的了解

进阶篇:
本章主要介绍了特征的抽取或者筛选,优化模型配置等内容。
一个好的model,常常以泛化能力是否好为衡量好坏的标准,而我们怎么能训练好一个模型呢?
训练数据的特征是不是最好的?模型的参数是否是最好的?
特征抽取:就是逐条将原始数据转化为特征向量的形式
DictVectorizer对以字典数据结构存储对数据,进行特征抽取和向量化,CountVectorizer对字符串进行特征向量化(统计所有字符串中出现词的词频Term Frequency),TfidfVectorizer也是对字符串进行特征向量化(除了使用词频,还是关注这个词汇在训练文本条数的倒数,可以利用它压制常见词汇对分类决策干扰)
停用词(Stop Words):像英文中the、a等
实践经验, 在处理大量文本时,去掉stop words,并使用Tfidf生成特征向量效果最佳
特征筛选:在高维度,已量化的特征向量中选择对指定任务更有效的特征组合
本书给出的结论,良好的数据特征组合不需要太多,就能是model性能表现突出,冗余的特征不会影响model性能,却会使cpu做无用功,而不良的特征会降低模型精度
总体来说就是按比例取出特征维度,分别训练model,使用交叉验证的方法分别验证acc,选择最好的特征比例进行model训练,使用的是sklearn-feature_selection
模型正则化:
model最重要的不是在trainset上的表现结果,而是它的泛化能力(Generalization),而正则化则是为了加强model的泛化能力,避免模型过拟合。
L1范式的结果会让参数向量的许多元素趋向于0,使得大部分特征失去对优化目标的贡献,这种让有效特征变的稀疏(Sparse)的L1正则化模型,通常被成为Lasso;
L2范式的结果会让参数向量中的大部分元素都变得很小,压制了参数之间的差异性,通常被称作Ridge

模型检验:
留一验证:存在不稳定性,因为对验证集合随机采样的不确定性
交叉验证:可以理解为从事了多次留一验证的过程,每次检验所使用的验证集之间是互斥的,并且保证每一条数据都被model验证过。交叉验证的优点是所有数据都被训练和验证的机会,尽最大可能让优化的模型性能表现更好。

超参数搜索:
网格搜索(GirdSearch):通过启发式的搜索方法对超参数组合进行挑优,叫做网格搜索,由于超参数的空间是无尽的,因此超参数的组合配置只能是“更优”解,没有最优解。在使用GirdSearchCV的时候将参数n_job=-1, 代表使用全部cpu,并行搜索

流行库:
NLTK用于自然语言(文本)处理,量化词汇语义相似度的词向量技术Word2Vec,XGBoost,深度学习框架tensorflow
word2vector,是寻找词汇之间的相似度,将词汇的表示向量化,通过计算表示词汇之间向量的相似度。
XGBoost属于集成学习模型,eXtreme Gradient Tree,提高了精度以及速度,可以自动利用cpu的多线程进行并行计算。XGBoost github:https://github.com/dmlc/xgboost
Gradient Tree Boosting,在生成每一颗树的时候采用梯度下降的思想,以之前生成的所有决策树为基础,向着最小化给定目标函数的方向再进一步,但是在合理的参数设置下,往往要生成一定数量的树才能达到满意的准确率,当数据集较大较复杂的时候,模型可能需要上千次的迭代计算。
Tensorflow: 与其他模型不同之处在于,它让使用者自由选取不同的操作,并组织一个学习系统,通过作者自己的对机器学习算法和理论的理解,完整的搭建一套学习系统,强烈建议大家在了解传统机器学习算法理论后使用tensorflow框架,实现一套完成的学习系统代替调包的过程。

Kaggle_mark

@Harris Xiao

The first task

start time: 2017-06-11

task name: Digit recognition

Kaggle: https://www.kaggle.com/c/digit-recognizer#description

end time:

result(accuracy):

===============================================================

@shuchao

The first task

start time:

task name: Digit recognition

Kaggle: https://www.kaggle.com/c/digit-recognizer#description

end time:

result(accuracy):

overcommit_memory详解

cat /proc/sys/vm/overcommit_memory
/etc/sysctl.conf
vm.overcommit_memory=1

overcommit_memory文件指定了内核针对内存分配的策略,其值可以是0、1、2。
0, 表示内核将检查是否有足够的可用内存供应用进程使用;如果有足够的可用内存,内存申请允许;否则,内存申请失败,并把错误返回给应用进程。
1, 表示内核允许分配所有的物理内存,而不管当前的内存状态如何。
2, 表示内核允许分配超过所有物理内存和交换空间总和的内存

http://www.vpsee.com/2013/10/how-to-configure-the-linux-oom-killer/

linux系统maildrop目录问题

/var/spool/postfix/maildrop/目录下产生大量文件,简单来说就是mail没有发送成功的邮件.
具体原理:在linux执行cron时,会将cron执行脚本中的output和warning信息以邮件形式发送给cron的所有者,而由于服务器上的sendmail或postfix没有正常运行,导致邮件发送不成功,全部小文件堆积在了maildrop目录下(注意:如果sendmail或者postfix正常运行,则会在/var/mail目录下产生大量的邮件,也会堆积)

解决方案:

1. 在crontab的第一行加入"MAILTO="""(执行cron时,不发送邮件)
2. 将cron中执行脚本的output重定向到指定文件或者/dev/null中.

MRjob查询提交主机(client or launcher)ip方法

工作中需要查询MRjob是由哪台client机器(launcher)提交的app开始认为AMlog中会打印,但是没有,以为是没有开启debug模式,但是通过查看源码,定位到JobSubmitter 这个类会获取提交机器主机名及ip信息是以configuration到形式存储的,所以可以通过查询app的配置信息找到.

具体如下:

1.  找到需要查询的app页面,点击左侧的Configuration选项;
2.  可直接看到mapreduce.job.submithostaddress这个选项的值,就为提交主机ip.

注:如configuration过多,可在yarn 的页面search即可.

My second blog

不知道什么鬼,用的迷迷糊糊的