@Macux
2018-01-18T02:27:18.000000Z
字数 15130
阅读 2001
Interview
Minimize your error while Regularizing your parameters.
不仅要最小化误差(模型的预测要足够精准),而且要规则化参数(模型没那么复杂);
- 将用户的每一个行为,视为一条记录,事先做好 label。因变量是“是否点击”,用 Logistic Regression 做二分类学习。(根据用户过去的行为,预测他对其它视频是否点击?)
- 一开始,先加 L2 正则做调参,就会有参数权重出来,对权重大的变量,继续做细化。(当然也可以用 RandomForest)
- 继续做细化的方式,可以为:比如把时间细化成,每周的第几天、每月的第几周、是否是节假日、早中晚等等。
- 回到模型训练,如果过拟合了就从其他权重高的变量下手继续做细化。也可以用 L1 做正则,删除不重要的变量(这是最后一招,一开始不建议使用。)
连续型数据
对于连续性特征,线上因为有庞大的服务器,建议进行分桶处理(先离散化,再进行 one-hot 处理)。
- 分桶处理,本身作为映射,目的是为了升维。基于 Cover 定理,可以知道在高维空间下,问题更可能变为线性可分。
- 分桶处理,可以帮助我们发现一些隐藏的重要连续变量,比如年龄等。
关于分桶处理,这里面蕴含大学(nan)问(dian):分多少桶、怎么分桶
- 关于分多少桶,暂时没有一个放之四海皆可用的规律,大多数情况,都是先根据业务经验,选择一个值。
- 重点放在怎么分桶上。这里介绍两种侧重点完全不同,但用起来都非常棒的分桶算法。(都需要给定一个初始桶数目)
(1)、卡方分桶。特点是:分桶的侧重点在于判断当前桶和 label 之间的关系是否足够大,将不大的桶进行合并。
(2)、V-Optimal 分桶。特点是:聚焦于特征的取值分布(各个取值的频率),保证各桶的方差之和最小。
(3)以上两种方法叫做“细致化分桶”,虽然分桶的效果比较好,但是比较耗计算资源。
(4)粗暴一点,就是将所有特征都用等距分桶的方法,分 10、100、1000、10000 桶,然后用 RandomForest 或 L1 删除不重要的特征;- 评价分桶的好坏:
(1)跑单独 slot 模型,然后观察 AUC。比如 10 分桶的 A 特征跑一个模型,100 分桶的 B 特征跑一个模型,按照跑出来的 AUC 作为特征重要性。
(2)此时有两种做法:
(a)如果有较少桶的 AUC 很低,则可以考虑将它们删除;
(b)如果有较多桶的 AUC 很低,则考虑减少预设的初始桶数目;
连续的特征喂给树模型,one-hot 的特征喂给线性模型。这是因为 one-hot 对树模型非常不友好,原因如下:
基分类器的分裂准则不根据特征值的大小而定,而是特征值的分布,而 one-hot 特征里,大多都是 0,只有少数是 1。等价于做了 one-hot,就破坏了特征的本身分布。
离散型数据
首先,进行一次 one-hot 处理。
- If there are categorical attributes, we first have to convert them into numeric data. We recommend using m numbers to represent an m-category attribute. Only one of them numbers is one, and others are zero. For example, a three-category attribute such as {red, green, blue} can be represented as (0,0,1), (0,1,0), and (1,0,0).
然后,和连续特征聚合 + 交叉(这是 2 种 Trick),这种聚合交叉也是一种主动升维,同样是为了增强 LR 的非线形的分类能力。
(聚合交叉,更多的是基于业务经验进行,而不是做穷举。)
- “聚合”是针对连续性特征,在做 one-hot 之前,通过新增特征的相关统计值(比如均值、标准差等)实现升维效果。聚合是通过直接加新的特征(往往是统计特征)来升维
- “交叉”是针对离散型特征(本身离散或已经做了 one-hot),对离散型特征进行交叉组合来升维。
- 一句话概括:聚合特征 for 连续的,交叉特征 for one-hot 的。
特殊特征的特殊处理
位置特征
(1)、模型最终可能输出一个很长的推荐列表,比如用户可能喜欢的 100 个(甚至更大)视频。
(2)、但是,手机或者电脑的屏幕长度是有限的,不可能把推荐的结果一次性全部展示出来。而且就算全部展示出来,用户也不可能把推荐结果全部都看一次。
(3)、所以,在特征集中加入“位置”特征,可以很好的解决这一问题。
新加入的视频
用视频的被创建时间 - 现在的时间作为时间差,当作权重加到 Loss Function 中。
在一定程度上细化特征的作用;
- 某个特征不做 one-hot,那它只有一个权重。
- 而做了 one-hot,每个取值都有了权重,就相当于加入了非线性的分类能力。
更有利于模型的计算。
- 在回归、分类以及聚类等机器学习算法中,都需要计算特征之间距离或者特征之间的相似度。
- 而绝大多数对距离或相似度的计算,都是在欧式空间的相似度计算。
- 将离散特征通过 one-hot 编码映射到欧式空间,离散特征的某个取值就对应欧式空间的某个点,这样就更有利于模型的计算。
在计算特征之间的距离和相似度时,会更加合理。
- 比如,有一个离散型特征,代表工作类型,该离散型特征,共有 3 个取值,不使用 one-hot 编码,其表示分别是 x_1 = (1), x_2 = (2), x_3 = (3)。两个工作之间的距离是,d(x_1, x_2) = 1, d(x_2, x_3) = 1, d(x_1, x_3) = 2。This shows that distance between job type 1 and job type 2 is smaller than job type 1 and job type 3. Does this make sense? Apparently, it isn't fair to assume that all categorical features are equally far away from each other!
- 但如果使用 one-hot 编码,则得到 x_1 = (1, 0, 0), x_2 = (0, 1, 0), x_3 = (0, 0, 1),那么两个工作之间的距离就都是 sqrt(2)。So, essentially, when we binarize the input by means of one-hot, we implicitly state that all values of the categorical features are equally away from each other.
进行 one-hot 处理和特征的取值范围没关系
- Note that our reason for why binarize the categorical features is independent of the number of the values the categorical features take, so yes, even if the categorical feature takes 1000 values, we still would prefer to do binarization.
- 意译过来就是:即使某个 feature 有很多种取值,哪怕有 1000 种取值,我们仍会因为上面两条理由,对 dataSet 进行 one-hot 处理。
小结:
连续性数据离散化,离散型数据 one-hot 化。
为什么选择 Logistic Regression 作为模型
- 为了让结果有更好的解释性,而不是一个黑箱子操作 like SVM;
为什么要做上述的数据预处理
- Logistic Regression 本身属于偏向线性的分类算法,对于非线性问题并不擅长。
- 但是基于 Cover 定理,我们知道:升维可以让低维空间的非线性问题在高维空间变得线性可分。
- “分桶处理”和“聚合交叉”就类似于 SVM 的核函数,是为了给数据集做升维处理,让低维空间的非线性问题,在高维空间变得线性可分。
![]()
- 一句话总结
在用 Logistic Regression 之前,做上述繁琐的数据预处理和特征工程工作,是为了在获得模型解释能力和减少计算复杂度的 benifit 的同时,人工堆特征增加模型非线性分类能力。
- 前期,使用 L2 跑模型,也许某些特征因为其粒度不是那么细,导致它对 label 的贡献没那么大,所以暂时不删掉它。比如视频的点击次数不做交叉,直接拿来做预测也没什么贡献的。
- 后期,使用 L1 跑模型,因为特征已经交叉了很多次了,特征维度本身已经很高,比如几万,这时候就可以从拟合角度用 L1 删除不重要的特征。
- 相当于,如果特征粒度是粗的,没怎么交叉过,都先留着,如果特征粒度是很细了,还没贡献,就删掉。
L0 范数
- L0 范数是指向量中非 0 的元素的个数。
- 如果我们用 L0 范数来规则化一个参数矩阵 W 的话,就是希望 W 的大部分元素都是 0。
- 只能说 L0 的正则化方式,太粗暴了!~ - -
L1 范数和 L2 范数的区别
- 如果数据损失项使用 L1 Norm,很明显,L1 Norm 对 Outlier 没有 L2 Norm 那么敏感;
- 如果正则化损失项使用 L1 的话,那么使学习到的参数倾向于稀疏,使用 L2 Norm 则没有这种倾向。
- L1 是蓝色的线,L2 是红色的线,很明显,L1 的分布对极端值更能容忍。
- 根据 Quaro 的 data scientist Xavier Amatriain 的经验:实际应用过程中,L1 nrom 几乎没有比 L2 norm 表现好的时候,优先使用 L2 norm 是比较好的选择。
联想到了 AIC 和 BIC
- L1 和 L2 在模型训练的过程中通过加约束来达到生成更好的模型的目的。
- AIC 和 BIC 是在已经训练好的不同模型里面筛选出相对最好的那个模型。
对评估指标 AUC 的理解
- The AUC value is equivalent to the probability that a randomly chosen positive example is ranked higher than a randomly chosen negative example.
- 首先 AUC 值是一个概率值,当你随机挑选一个正样本以及一个负样本,当前的分类算法根据计算得到的 Score 值(这里的 Scroe 值,其实也可能是一种概率,是该样本属于正例的概率)将这个正样本排在负样本前面的概率就是 AUC 值。
- AUC 值越大,表明当前的分类算法越有可能将正样本排在负样本前面,即能够更好的分类。
- 使用 AUC 的好处:AUC 不受样本不均衡影响,直接衡量的是模型的表现能力
使用 A/B Test 评估当前推荐模型相较之前的,是否有改进?
(1)、用户要随机分成数量相同的组,可以是两组或更多组;
(2)、每个组在测试期间,使用不同的算法;
(3)、评估推荐算法效果的时候,看的是用户行为的改变。比如,豆瓣看的是有没有更多的人收听,更多的人点了红心。电子商务看的是有没有更多的人购买商品。
如何提升模型的 AUC
没什么特别的方法,要么重新做特征工程,要么调参。- -
- 获取数据(爬虫)
- 数据预处理(去重、去噪、分词、去除停止词)
- 生成词向量(word2vec)
- 聚类(k-means)
- 使用 DBI 指标(计算类内距离之和与类外距离之比,值越小,聚类效果越好)优化 k 值的选取
- 输出用户关注点
数据去重
- 在原始语料中,不可避免地会存在大量重复的用户评论,这些重复数据不仅会占据无谓的存储空间容量,影响算法效率,而且对于算法分析的结果也无积极帮助。
- 因此,在进行后续研究前,先要对删除数据集中的冗余数据。
- 使用 Python 的 set func 或者 pandas 的 unque() 进行去重。
数据去噪
- 将评论中的表情符号、英文字符、标点符号等非文本信息定义为噪声数据,并且将它删除掉。
- 使用正则表达式,过滤掉表情符号、数字符号等;
分词
- 使用 jieba 分词 + 对应品类的人工词典作为分词依据;
- 其中,人工词典中的词,设置更高的权重;
- 分词算法选用基于汉字成词能力的 HMM 模型(隐式马尔科夫模型)的 Viterbi 算法
- 选择它的原因:对一些特殊词的分法更棒,比如“满减活动”会分成“满减” & “活动”。
# 添加自定义的人工词典,file_name 为文件类对象或自定义词典的路径
jieba.load_userdict(file_name)
# 使用 HMM 的 Viterbi 算法进行分词
'/'.join(jieba.cut('如果放到post中将出错。', HMM = True))
使用基于 TF-IDF 算法 + 自定义停止词来去除停用词,进行关键词提取。
参数详解
- cbow 0表示不使用 cbow 模型,默认为 Skip-Gram 模型;
- size 表示词向量维数,经验是不超过 1000,超过 1000 基本都没有效果,推荐取 sqrt(dict_size)/2 ;
- window 上下文窗口,是训练词向量的时候,取上下文的大小,感觉这个一般都是 5 比较好;
- sample 表示采样参数,是一个经验忽视掉频率过高的词的参数,一般也用默认的就行;
- sampe 指的是采样的阈值,如果一个词语在训练样本中出现的频率越大,那么就越会被采样;
- negative 表示负采样参数,每有一个正样本,选择几个负样本的参数,一般也是用默认的;
- binary为 1 指的是结果二进制存储,为0以文本形式进行存储;
- hs 做不做层次的 softmax;
./word2vec -train test.txt -output vectors.bin -cbow 0 -size 200 -window 5 -negative 0 -hs 1 -sample 1e-3 -threads 12 -binary 1
参数调优经验
- hs:设为 1 的时候,效果比较好,但是训练会慢一点。
- skip-gram(慢、对罕见字有利)vs CBOW(快)
- 训练算法:分层 softmax(对罕见字有利)vs 负采样(对常见词和低维向量有利)
- 文本(window)大小:skip-gram 通常在 10 附近,CBOW 通常在 5 附近
- 向量维数设为 sqrt(dict_size) / 2 比较好
算法架构介绍
CBOW 模型
- (Continuous Bag-of-Words Model),在训练过程中会用到上下文已经训练得到的结果来计算当前词的词向量。
- 在 CBOW 模型中,非线性的隐藏层会被删除掉,取而代之的投影层会被共享给语料中的所有词汇,也就是说,所有词都会被投射到相同的位置,这就保证了训练得到的词向量是平均值,更能代表每个词在向量空间中的相对位置。
skip-gram 模型
- 区别于CBOW模型会根据上下文窗口对当前词做出预测,Skip-gram
模型则是根据中心词预测周围词的词向量,每个词向量表征了上下文词汇的分布情况。- 上下文窗口设定的越大,预测出的词向量质量越高,但同时也会带来计算复杂度的提升,导致训练时间的增加。
- 对于在所设定窗口内的词,Skip-gram模型都会两两计算概率,即使两词之间隔着一些词。这样做的好处是会使“红色苹果”和“红色的苹果”很容易被识别为相同的短语。
建表时,善用索引。
(1)最适合做索引的列,是那些最有可能出现在 where 语句和 group by 或 order by 语句中的列;
(2) 字段的维度越高,越适合做索引。(这里的“维度”,是指字段所容纳的非重复值。)
(3)对于经常需要范围查询的字段,构建聚集索引(聚合索引)。
(a). 在 SQL Server 中,数据的存放方式并不是以行(Row)为单位,而是以页为单位。因此,在查找数据时,SQL Server 查找的最小单位实际上是页。也就是说即使你只查找一行很小的数据,SQL Server 也会将整个页查找出来,放到缓冲池中。
(b). 当表没有聚集索引时,表中的数据页是以堆(Heap)进行存放的,在页的基础上,SQL Server 通过一个额外的行号来唯一确定每一行,这也就是传说中的 RID。
(c). RID 不仅仅是 SQL Server 唯一确定每一行的依据,也是存放行的存放位置。
(d). 而当表上建立聚集索引时,SQL Server 寻找行不再是按 RID 进行查找,转而使用了关键字,也就是聚集索引的列作为关键字进行查找。
在HQL中避免使用count(distinct xx),在MySQL中则无所谓
用下列方式替代count(distinct xx):
SELECT COUNT(id) FROM (SELECT id FROM TABLE_NAME group by id ) t
或者
SELECT COUNT(id) FROM (SELECT distinct id FROM TABLE_NAME) t
- 我的志向是做“数据挖掘”。具体而言,是通过我的工作,产出很棒的算法模型。这个很棒的模型,可以从一堆错综复杂的数据中挖掘出一些有用的 finding 或 learning,从而为业务部门做出正确的 descision 提供帮助。我认为,这个过程是很 charming 的。
- 而我目前所在的企业,给予我的工作任务,80% 都 focus 在爬虫上。
- 不可否认,爬虫是整个 Data Mining 过程中非常重要的一环。但客观的讲,它仅仅是 DM 过程中的 beginning。它和我真正想要做的 Data Mining 是有出入的,匹配度大约只有 30% 左右。
- PS:如果时机得当,可以抛出自己对工作岗位的认识:
(1)无论做什么工作,无论这个工作岗位的 title 是什么,我们都只是围绕着这个 title 在做事,而不会 100% 地只做自己理想中的那部分工作。
(2)企业招我们进来,是想我们帮助企业解决最迫切的问题。
- 我制定的职业规划,时间跨度是三年,以滚动计划的方式来迭代更新;
- 职业规划是基于两个维度来设计:目前想做什么 & 将来适合做什么。
目前想做什么
(1)、在算法研究上,能更进一步。将深度学习、增强学习等比较厉害的算法纳入自己的武器库;
(2)、在工程实现上,能更进一步。玩熟 Spark,并且能用 Scala 从底层玩转 Spark,而不是像现在的用 Python 通过接口调用的方式。
(3)、在同一个行业里不断沉淀自己,积累业务知识,为更好的理解数据需求,产出更好的数据挖掘做积累。毕竟,一切脱离业务背景的数据挖掘,都是“耍流氓”。
将来适合做什么
毕竟写代码,搞算法,是一个相对更适合年轻人的职业。随着年龄的增大,会考虑转型做具有技术标签的管理者,比如数据挖掘经理、架构师等等。
备注
以上的职业规划,都是基于目前有限的信息来制定的。考虑到当前制定计划时,信息的不完整性。所以在每年的年初,会按照滚动计划的方法,做一次更新迭代。
今年的计划
- 搞定 Spark、Scala 和深度学习三个比较大的技能弱点。
- 目前的完成度为 40% - 50%左右,具体而言:
(1)、能够从宏观上把握 Spark 的技术原理、技术细节和性能调优技巧;
(2)、能够使用 Python 在 Spark 架构中写分布式的脚本;
(3)、弄懂了 Scala 基础语法;
(4)、深度学习的进度,暂时是零。
宏观阐述:
- 背景是以前 offer 排序和 channel 排序是基于规则实现,而规则的
制定依赖于人的主观判断,存在偏差,且排序效果不稳定,流量优化的效果很有限。- 有一个offer池和channel池,当offer池中有offer_i需要投放时:
- 首先基于业务规则,对channle池进行初筛,生成候选集。比如这个offer只针对中国大陆地区的游戏用户。
- 基于模型,预测offer和候选集中的channel组合的CXR得分。降序排列后,生成TOP N的列表。
特征初步情况:
- offer侧
- offer_id
- 广告主_id
- 价格
- 包体大小
- 历史平滑CTR情况
- 历史平滑CTR的在不同时间窗口内的变化情况
- 等等
- channel侧
- 国家
- 异常设备总占比
- 异常IP总占比(代理+黑名单)
- 近一个月异常设备占比
- 近一个月异常IP占比(代理+黑名单)
- 历史平滑CTR
- 历史平滑CTR在不同时间窗口内的变化情况
- 等等
- 更新侧(反馈侧)
- 过往时间窗口,offer反馈平滑CTR
- 过往时间窗口,channel反馈平滑CTR
- channel异常设备变化的统计分布
- channel异常IP变化的统计分布
- 等等
数据预处理
- 异常值处理:
- 违反业务逻辑、错误数据,直接删除;(业务逻辑的异常值)
- 数学逻辑的异常值:稳健马氏距离、3西格玛原则等等
- 设置新的一个特征标识异常;
- 也许异常值可能是一个新的业务点或者生意点。
- 缺失值处理:删除 or 单独构建特征标识缺失情况,取决于整个数据集在这个特征上的缺失分布情况
- 如果数据偏度大,可以使用类似 x**(1/3) 做 transform。
- 计算连续性特征的统计值,添加到特征空间;
- 连续性特征的归一化:
- 符合或近似符合高斯分布,做高斯归一化;
- 明显不符合高斯分布,做sigmod归一化:
- 先做最大最小归一化;
- 然后利用(x-0.5)*16,将特征的值缩放到[-8, 8];
- 然后使用sigmod函数,进行sigmod归一化;
- 数据集的划分:
- 基于时间维度划分,而不做抽样划分。
- 这么做的目的是:保证训练集和测试集是一个连续的数据分布,避免产出有偏的数据集。
特征工程:
- 使用统计值查看特征分布,将数据倾斜严重的特征删除;(自己造轮子,避免人工一个一个看。)
- 连续性特征:分桶+one-hot,产生离散型的特征
- 卡方分桶:考虑特征对Label的贡献
- V-optimal分桶:最小化桶内的方差,最大化桶之间的方差
- 离散型特征:
- 基于业务逻辑和经验(比如时间),做特征间的交叉处理。
- 用GBDT构建特征组合的方法:
1、先用少量数据训练好一个GBDT模型;
2、然后传给LR的数据集的每一个样本,都会遍历这个训练好的GBDT;
3、遍历后做one-hot处理,喂给LR;
4、对于CTR预估的问题,id类的特征和非id类的特征单独构建GBDT;每一条样本进来都会遍历两个GBDT的前N棵树。非id类取前20棵,id类取前10棵;- 对于有序的离散变量,直接做one-hot就行。原因如下:
- LR的训练是参数估计,估计出来的参数含义是这个变量对label的影响,不和特征向量的距离有什么关系。
- 离散化特征的好处:
- 稀疏向量内积乘法运算速度快;
- 离散化产生更多的特征,更多的特征对应更多的权重,那么之前单一连续特征对模型的影响力就被分散弱化了,从而降低了过拟合的风险和异常值对模型的影响。
- 离散化的特征,增加了模型的表达能力,比如特征间的组合等价于引入了非线性的表达能力。
- 特征选择:
- 卡方;
- 卡方值越大,说明对原假设的偏离越大,越要拒绝原假设。
- 原假设是什么?当前feature和label没有关系。
- 为什么可以?
- 标准互信息;
- 互信息的直观意义为知道其中一个变量提供的另一个的信息量(即不确定度的减少量)
- 互信息越大,特征越重要。
- L1/L2正则;
- 单独跑LR,看AUC。怎么看:
- 将所有特征的AUC,画成分布;
- 细化AUC值较高的特征;
- 删除AUC值较低的特征;
- 不直接设置阈值,是因为并不知道多高的AUC叫高。
- 树模型,输出权重值;
- 皮尔逊系数
- 输入到模型的特征包括:
- 原始特征;
- 人工指定的交叉特征;
- GBDT输出的特征组合;
- 反馈特征;
模型评价的标准:
- AUC:关注排序;
- Logloss:关注吻合程度
只有当预测正负例和实际的正负例完全温和,logLoss=0,为item为正例的概率。
PS: Logistic Regression的loss function 就是 logLoss 加上正则项。
模型验证:
- A/B Test验证通过后,才能上线。
- 评价标准:转化升高、ROI升高,点击升高、用户体验等等。
- 存在一种情况是:新算法可以带来更好的点击和转化,但是提升度不明显,比如只有万分之一,但收入却减少了较多。基于此,还是会选择原方案。
模型输出的结果怎么用?
- 模型输出的排序,只是单从数学寻求的最优解。
- 而模型是为生意服务的,最后流量优化的决策需要从业务上考虑ROI,选择的是对公司收益最大的组合。
玩法和流量优化项目差不多,不同点在于:
- 存在E&E的问题:
- 有新的item怎么办?
有新的user怎么办?
- 有新的user,先判断是不是白纸型user,即什么信息都没有。
- 白纸型的user:
- 基于Thompson sampling算法,找出TOP N的类;
- 从TOP N的类里,基于UCB算法,找出TOP N的item进行推荐;
- 基于用户反馈收缩Thompson sampling算法和UCB算法的范围;
- 当产生了少量用户行为时,结合userBased-CV,推荐与其相似的用户喜好。
- 非白纸型的user:
- 可以先结合userBased-CV,找出TOP N的相似用户;
- 从TOP N 的相似用户中,找出类的交集;
- 如果没有交集,返回到白纸型的user处理;
- 如果有交集,基于UCB找出TOP N的item;
- 基于用户反馈收缩Thompson sampling算法和UCB算法的范围;
- 有新的item,首先制定Exploration的最大尝试代价,超过这个代价时,放弃对该item的Explore。
- 基于Thompson sampling算法,解决item侧的冷启动:
- 用分类或者Topic来表示每个用户兴趣,我们可以通过几次试验,来刻画出新用户心目中对每个topic的感兴趣概率。
- 如果用户对某个topic感兴趣,就表示我们得到了win,如果推给了它不感兴趣的topic,推荐系统就表示lose了。
- 当一个用户来了,针对这个用户,我们用Thompson算法为每一个topic采样一个随机数,排序后,输出采样值top N 的推荐item。注意,这里略有改动,原始多臂问题每次只摇一个臂,我们这里一次摇N个臂。
- 获取用户的反馈,比如点击。没有反馈则更新对应topic的lose值,点击了则更新对应topic的wins值。
- 基于UCB算法,解决item侧的冷启动:
- 先对每一个item都试N遍(N为可接受的成本投入);
- 选择均值越大,标准差越小的item;
- 随着实验次数的增多,item的置信区间很窄,这是算法保守稳妥的部分。试验次数少,item置信区间很宽,这是算法冒险的部分。
最后的推荐视频展示结果,除了参考模型的输出外,还应加入一些规则:
一定要抹掉下面这些薄弱环节,让自己更优秀。无法忍受软弱的自己!!!!!
将“流量迭代优化”和“流量反作弊迭代优化”写入简历中。
- 详细介绍A/B Test
- 一些可能有用的资料:
- 具体的做法:
- 制定一个A/B Test的评价指标,应该是一个靠近业务的指标。比如ROI等
- 可以切量的,那么对流量按照比例进行切分,分别喂给对照组和实验组的模型。
- 不可以切量的,就按照时间顺序分别上线。
- A/B Test最有效的评价标准是ROI
- 有序离散变量如何处理?一般的离散变量直接
- 对于Logistic Regression而言,离散化有序变量没有影响。
- 因为Logistic Regression本质上是在估计特征对label的权重。这个过程并不考虑特征之间的大小顺序。
python Spark和Scala Spark在内存优化上的区别。
- vim的常用操作
缩进快捷键:
:1,10 > # 1到10行批量缩进
:1,10 < # 1到10行批量撤回缩进
如何对特征进行可视化,这部分的坑也要填了,不可能只是对着一堆纯数字的嘛
#!/usr/bin/env python
#coding:utf8
from pyspark import SparkConf, SparkContext, StorageLevel
from pyspark.mllib.classification import LogisticRegressionWithLBFGS
from pyspark.mllib.evaluation import BinaryClassificationMetrics
from pyspark.mllib.util import MLUtils
"""
Logistic Regression run in Spark
"""
conf = SparkConf().setAppName("Just A Game")
sc = SparkContext(conf=conf)
# 读入数据
data = MLUtils.loadLibSVMFile(sc,'s3://mob-emr-test/fanpeng/atf/isolationForest/deviceOfferOutput_31Days/sample_libsvm_data.txt')
training, test = data.randomSplit([0.6, 0.4], seed=11)
# Run training algorithm to build the model
model = LogisticRegressionWithLBFGS.train(training)
# Compute raw scores on the test set
predictionAndLabels = test.map(lambda x: (float(model.predict(x.features)), x.label))
# Instantiate metrics object
metrics = BinaryClassificationMetrics(predictionAndLabels)
# Area under precision-recall curve
print ("Area under PR = %s" % metrics.areaUnderPR)
# Area under ROC curve <=> AUC
print ("Area under ROC = %s" % metrics.areaUnderROC)
- Spark用LBFGS求解LR的原因
Spark Shuffle的过程。(看自己之前的笔记就好)
- 统计方法和机器学习的区别,重在理解和个人总结。
- 自己的理解:
- 统计学在给出一个问题的答案时,一是要有足够的理论基础(经得起推敲),二是要稳定性(不能今天work,明天就不行了)。
- 机器学习相对是一个重视结果,甚至是当下即时满足的结果,比如上一个模型就要马上对广告的CTR提升多少多少。至于为什么能提示这么多,features是怎么影响CTR的,blabla,甚至这个月上的模型,下个月就不行了,都没关系。模型不行就再调(调参数整特征工程),只要能短暂比之前好,能产出价值,就行了。
- 统计学家更关心模型的可解释性,而机器学习专家更关心模型的预测能力。
- 一位知友的回答,感觉很棒。传送门
- 关于R Square
- R square称为方程的确定系数,0~1之间,越接近1,表明方程的变量对y的解释能力越强。(更多的是指线性解释能力。)
- 在数据的关系存在非线性可能情况下:
- 不一定R square越大拟合越好,因为R square只是回归平方和占总平方和的比例。R square越大,回归方程拟合数据越好,线性关系越强。
- 当自变量个数增加时,尽管有的自变量与y的线性关系不显著,R square也会增大。R square受自变量个数与样本规模影响。对于这点,采用Adjusted R square进行调整。
- 修正R square就是相当于给变量的个数加惩罚项。
换句话说,如果两个模型,样本数一样,R square一样,那么从修正R square的角度看,使用变量个数少的那个模型更优。- 修正R square属于一种奥卡姆剃刀的实例。
![]()
- n 为数据样本中的点数。
- p 为独立回归数,即模型中的变量数,不包括常数。
- 为什么不使用xgboost去建模和构建特征工程
- 以一种小步快跑的方式进行算法开发,会优先尝试自己比较熟悉比较有把握的算法。
- 当时项目比较急,并没有那么多时间做。
- 也许一开始用xgboost会比较好,但如果上这个模型需要更多的开发时间,就不符合互联网企业小步快跑的工作要求了。在企业,需要的是能够在一个较短的时间里看到预期的产出,通过对产出的不断评估,调整未来的开发方向,进而朝着最优解方向前进。类似梯度下降的过程。
- 后来自己用少量数据去做了实验,AUC有提升,但提升的程度比较小,不到0.5%。(提升的原因是因为xgboost在分裂时是直接朝着最小化残差,而不是残差的梯度来做。)
- 这样的提升不足以让我换模型、
- k-means的损失函数
- 其中表示第k个簇,表示第k个簇的中心点,是第k个簇的损失函数,表示整体的 。
- 算法的停止迭代条件是:均值向量不变。
各簇的均值向量是各特征在各簇内的样本的算术平均值构成的向量。
参见《机器学习》P203
- k-means(聚类算法)的评价指标
- 欧式距离和余弦距离的区别和应用场景
- 欧氏距离能够体现个体数值特征的绝对差异,而余弦距离更多的是从方向上区分差异;
- 欧式距离多的用于需要从维度的数值大小中体现差异的分析,如使用用户行为指标分析用户价值的相似度或差异。而余弦距离对绝对的数值不敏感,更多的用于使用用户对内容评分来区分用户兴趣的相似度和差异。
- 归一化后,计算欧氏距离,等价于余弦值啊证明:
两个向量x,y, 夹角为A,经过归一化,他们的欧氏距离,- 余弦距离更适合稀疏性比较强的数据集,比如文本。如果对文本这类稀疏性比较强的数据集使用欧氏距离,那么算出来的相似度会是
- 举个例子:
用户对内容评分,5分制,X和Y两个用户对两个内容的评分分别为(1,2)和(4,5),使用余弦相似度得出的结果是0.98(分子是两个向量的积1*4+2*5=14,分母是向量模的乘积),两者极为相似,但从评分上看X似乎不喜欢这2个内容,而Y比较喜欢,余弦相似度对数值的不敏感导致了结果的误差,需要修正这种不合理性,就出现了调整余弦相似度,即所有维度上的数值都减去一个均值,比如X和Y的评分均值都是3,那么调整后为(-2,-1)和(1,2),再用余弦相似度计算,得到-0.8,相似度为负值并且差异不小,但显然更加符合现实。
粒子群优化算法
- xgboost和GBDT的区别:
马尔科夫的原理和它在机器学习的应用
- 介绍自己的学历;
- 介绍自己的简洁版工作经验;
- 介绍自己为什么要换工作:因为自己的ambition是让广州能有一家公司的推荐系统是超过今日头条的。 放眼广州企业,这家企业大概率会是网易游戏。