Duncan's Blog


  • menu.主页

  • menu.分类

  • menu.关于

  • menu.归档

  • menu.标签
Duncan's Blog

超参的搜索方法整理

Veröffentlicht am 2019-08-17 | in MachineLearning

1.网格搜索

网格搜索通过查找搜索范围内的所有的点,来确定最优值。它返回目标函数的最大值或损失函数的最小值。给出较大的搜索范围,以及较小的步长,网格搜索是一定可以找到全局最大值或最小值的。

当人们实际使用网格搜索来找到最佳超参数集的时候,一般会先使用较广的搜索范围,以及较大的步长,来找到全局最大值或者最小值可能的位置。然后,人们会缩小搜索范围和步长,来达到更精确的最值。

2.随机搜索

随机搜索的思想和网格搜索比较相似,只是不再测试上界和下界之间的所有值,只是在搜索范围中随机取样本点。它的理论依据是,如果随即样本点集足够大,那么也可以找到全局的最大或最小值,或它们的近似值。

通过对搜索范围的随机取样,随机搜索一般会比网格搜索要快一些。但是和网格搜索的快速版(非自动版)相似,结果也是没法保证的。

3.基于梯度的优化

4.贝叶斯优化

贝叶斯优化寻找使全局达到最值的参数时,使用了和网格搜索、随机搜索完全不同的方法。网格搜索和随机搜索在测试一个新的点时,会忽略前一个点的信息。而贝叶斯优化充分利用了这个信息。贝叶斯优化的工作方式是通过对目标函数形状的学习,找到使结果向全局最大值提升的参数。它学习目标函数形状的方法是,根据先验分布,假设一个搜集函数。在每一次使用新的采样点来测试目标函数时,它使用这个信息来更新目标函数的先验分布。然后,算法测试由后验分布给出的,全局最值最可能出现的位置的点。

补充:

PSI

Duncan's Blog

Hive SQL 学习

Veröffentlicht am 2019-08-17 | in SQL

partition by

partition by关键字是分析性函数的一部分,它和聚合函数不同的地方在于它能返回一个分组中的多条记录,而聚合函数一般只有一条反映统计值的记录,partition by用于给结果集分组,如果没有指定那么它把整个结果集作为一个分组

example: 一个班有学生id,成绩,班级,现在将学生根据班级按照成绩排名。(partition by)

1
select *,row_number() over(partition by Grade order by Score desc) as Sequence from Student

lateral view

explode / posexplode

explode 拆分一行称多行,而posexplode是根据多行匹配行号进行拆分多行。

窗口函数

a. first_value

​ 取分组内排序后,截止到当前行,第一个值

b.last_value

​ 取分组内排序后,截止到当前行,最后一个值

c.lead(col,n,default)

​ 用于统计窗口内往下第n行值。第一个参数为列名,第二个参数为往下第n行(可选,默认为1),第三个参数为默认值(当往下第n行为NULL时候,取默认值,如不指定,则为NULL)

d.lag(col,n,default)

​ 与lead相反,用于统计窗口内往上第n行值。第一个参数为列名,第二个参数为往上第n行(可选,默认为1),第三个参数为默认值(当往上第n行为NULL时候,取默认值,如不指定,则为NULL)

c.聚集函数 + over + (partition by col1 [order by col (rows | range) between (UNBOUNDED | [num]) preceding and (num FOLLOWING | current ROW))

d.ROW_NUMBER()

​ 从1开始,按照顺序,生成分组内记录的序列

e.RANK()

​ 生成数据项在分组中的排名,排名相等会在名次中留下空位

f.DENSE_RANK()

​ 生成数据项在分组中的排名,排名相等会在名次中不会留下空位

g.CUME_DIST()

​ 小于等于当前值的行数/分组内总行数

h.PERCENT_RANK ()

​ 分组内当前行的RANK值-1/分组内总行数-1

i.NTILE(n)

​ 用于将分组数据按照顺序切分成n片,返回当前切片值,如果切片不均匀,默认增加第一个切片的分布

Note:

  • From子句:执行顺序自上而下,从左到右,从后往前,所以数据量少的表尽量放后
  • where子句:执行顺序自下而上,从右到左,可以过滤掉大量记录的条件写在where子句的末尾
  • group by子句:通过将不需要的记录在group by之前过滤掉,避免使用having来过滤
  • having子句:尽量少用
  • select子句:尽量少用*,取字段名称
  • order by子句:执行顺序为从左到右排序
  • join:尽量把数据量大的表放在最右边来进行关联
Duncan's Blog

pyspark记录

Veröffentlicht am 2019-08-17 | in Learning

Spark DataFrame学习

1. 文件的读取

1.1 spark.read.json() / spark.read.parquet() 或者 spark.read.load(path,format=”parquet/json”)

1.2 和数据库的交互 spark.sql(“”)

2.函数使用

  • 2.1 printSchema() - 显示表结构

  • 2.2 df.select(col) - 查找某一列的值

  • 2.3 df.show([int n]) - 显示[某几行的]的值

  • 2.4 df.filter(condition) - 过滤出符合条件的行

  • 2.5 df.groupby(col).count()

    df.groupby(col).agg(col,func.min(),func.max(),func.sum()) - 聚合函数

  • 2.6 spark.createDataFrame([(),(),(),()…,()],(col1,col2,col3,…,coln))

  • 2.7 自定义udf函数

1
2
3
@pandas_udf("col1 type,col2 type,...,coln type",PandasUDFType.GROUPD_MAP)
def f(pdf):
pass

df.groupby(col).apply(f).show()

Duncan's Blog

模型记录

Veröffentlicht am 2019-08-17 | in Data Mining

实战模型记录

1.GBDT(Gradient Boosting Decision Tree)

  • GBDT中的树是回归树(不是分类树),GBDT用来做回归预测,调整后也可以用来分类。
  • 回归树:回归树总体流程类似于分类树,区别在于,回归树的每一个节点都会得到一个预测值,以年龄为例,该预测值等于属于这个节点的所有人年龄的平均值。分枝时穷举每个feature的每个阈值找最好的分割点,但衡量标准不再是最大熵,而是最小平方误差。分枝终止条件为属性值唯一或者预设的终止条件(叶子个数上限)
  • 提升树算法:提升树是迭代多棵回归树来共同决策。当采用平方误差损失函数时,每一个棵回归树学习的是之前所有树的结论和残差,拟合得到一个当前的残差回归树。
  • 梯度提升决策树:当损失函数是平方损失和指数损失函数时,每一步的优化很简单,如平方损失函数学习残差回归树。但对于一般的损失函数,往往每一步优化没那么容易(如绝对值损失函数和Huber损失函数),所以有梯度下降方法。

2.XGBoost(eXtreme Gradient Boosting)

和gbdt对比:

  • 1.GBDT以CART作为基分类器,xgboost还支持线性分类器。
  • 2.GBDT在优化函数中只用到一阶导数信息,xgboost则对代价函数进行了二阶泰勒展开,同时用到了一阶和二阶导数。
  • 3.xgboost在代价函数中加入了正则项,控制了模型的复杂度。正则项包含两部分:叶子节点数和叶子结点输出分数。
  • 4.划分点的查找:贪心算法和近似算法
  • 5.支持并行,在特征粒度上并行,预先对数据进行排序,保存为block结构,在节点分裂时计算每个特征的信息增益,各个特征的信息增益就是多个线程进行。

3.LightGBM

优化点

  • 1.Histogram算法:先把连续的浮点特征值离散化成k个整数,同事构造一个宽度为k的直方图。遍历数据时,根据离散化后的值作为索引在直方图中累计统计量,当遍历一次数据后,直方图累积了需要的统计量,然后根据直方图的离散值,遍历寻找最优的分割点。
  • 2.带深度限制的Leaf-wise的叶子生长策略:每次从当前所有叶子中,找到分裂增益最大的一个叶子,然后分裂,如此循环。因此同Level-wise相比,在分裂次数相同的情况下,Leaf-wise可以降低更多的误差,得到更好的精度。

4.RandomForest

用bootstrap自助法生成m个训练集,对每个训练集构造一颗决策树,在节点找特征进行分裂的时候,并不是对所有特征找到使得指标(如信息增益)最大的,而是在特征中随机抽取一部分特征,在抽取到的特征中找到最优解,进行分裂。模型预测阶段就是bagging策略,分类投票,回归取均值。

Duncan's Blog

天池-半导体质量预测

Veröffentlicht am 2019-08-17 | in Competition

天池-半导体质量预测

最近跟着做天池的比赛,将比赛过程中遇到的问题记录如下:

1.特征的选择?

特征选择的方法: 1) 嵌入式 2) 过滤式 3) 封装式

1)数据清洗:

  • 1.筛选掉重复的列
  • 2.对于类别类型特征,利用sklearn编码(one-hot, Label Encoder等)
  • 3.使用平均值填充完后再去除冗余列(方差为0,列重复)

清洗过后,特征从原来的8000多维降到了3400多维.

  • 4.特征中存在全为NaN值的,也去掉这些列

总结:数据清洗过后,总的特征维数维3342维;随机森林MSE为:0.03612

2)特征选择:

  • 嵌入式: 根据模型来分析特征的重要性,最常见的方式为正则化来做特征选择.
  • 过滤式: 评估单个特征和结果之间的相关程度,排序留下Top相关的特征部分.(缺点:没有考虑到特征之间的关联作用,可能把有用的关联特征误踢掉)
  • 封装式: 把特征选择看作一个特征子集搜索问题,筛选各种特征子集,用模型评估效果.

处理方法:

  • 过滤式:使用单个随机森林得到的featureimportances排序后保留了44个特征,为
    [‘310X207’, ‘210X158’, ‘311X7’, ‘330X1132’, ‘220X13’, ‘310X149’, ‘750X883’, ‘210X207’, ‘312X144’, ‘210X192’, ‘312X61’, ‘312X66’, ‘440AX77’, ‘220X197’, ‘310X153’, ‘330X1190’, ‘344X252’, ‘310X33’, ‘210X174’, ‘440AX95’, ‘312X777’, ‘330X102’, ‘440AX187’, ‘340X161’, ‘312X55’, ‘330X590’, ‘210X89’, ‘330X1129’, ‘210X164’, ‘210X188’, ‘330X1146’, ‘310X119’, ‘360X1049’, ‘440AX182’, ‘750X640’, ‘440AX65’, ‘312X789’, ‘311X154’, ‘310X43’, ‘312X782’, ‘312X555’, ‘420X4’, ‘312X785’, ‘210X229’]
  • 包裹式:利用随机森林的性能作为评价指标筛选出200个特征
    set([‘440AX98’, ‘310X207’, ‘210X158’, ‘261X641’, ‘261X269’, ‘312X61’, ‘312X66’, ‘220X197’, ‘520X317’, ‘400X151’, ‘400X150’, ‘400X153’, ‘330X594’, ‘330X590’, ‘210X164’, ‘210X8’, ‘420X4’, ‘330X1223’, ‘310X117’, ‘261X524’, ‘310X119’, ‘261X607’, ‘750X640’, ‘210X126’, ‘311X154’, ‘312X555’, ‘261X689’, ‘520X245’, ‘261X477’, ‘750X883’, ‘330X589’, ‘261X590’, ‘300X8’, ‘261X591’, ‘261X468’, ‘440AX77’, ‘300X3’, ‘220X179’, ‘330X1190’, ‘220X177’, ‘220X176’, ‘220X175’, ‘220X174’, ‘220X173’, ‘220X172’, ‘220X171’, ‘220X170’, ‘261X464’, ‘TOOL (#2)’, ‘330X351’, ‘330X102’, ‘330X355’, ‘330X354’, ‘330X1049’, ‘330X1042’, ‘312X57’, ‘312X55’, ‘210X89’, ‘330X1040’, ‘330X1043’, ‘330X1129’, ‘261X460’, ‘330X1044’, ‘261X462’, ‘330X1046’, ‘210X188’, ‘330X353’, ‘360X1049’, ‘440AX66’, ‘440AX67’, ‘440AX64’, ‘440AX65’, ‘330X135’, ‘330X134’, ‘312X144’, ‘330X133’, ‘330X132’, ‘330X139’, ‘312X782’, ‘210X174’, ‘312X785’, ‘312X789’, ‘261X608’, ‘261X609’, ‘520X312’, ‘520X313’, ‘520X314’, ‘330X1228’, ‘420X33’, ‘330X1132’, ‘261X600’, ‘261X601’, ‘330X641’, ‘330X1226’, ‘330X1221’, ‘330X1220’, ‘210X206’, ‘210X207’, ‘261X598’, ‘261X599’, ‘340X105’, ‘340X107’, ‘210X190’, ‘210X191’, ‘210X192’, ‘261X593’, ‘261X594’, ‘261X596’, ‘261X597’, ‘220X557’, ‘220X551’, ‘310X37’, ‘310X36’, ‘310X34’, ‘310X33’, ‘261X268’, ‘310X31’, ‘310X30’, ‘440AX95’, ‘210X3’, ‘210X4’, ‘210X5’, ‘210X6’, ‘210X7’, ‘312X777’, ‘210X9’, ‘261X260’, ‘261X261’, ‘261X266’, ‘261X267’, ‘261X264’, ‘261X265’, ‘520X246’, ‘520X247’, ‘261X736’, ‘261X737’, ‘520X242’, ‘520X243’, ‘310X153’, ‘344X252’, ‘440AX90’, ‘261X262’, ‘330X1146’, ‘440AX182’, ‘440AX187’, ‘261X687’, ‘261X688’, ‘310X43’, ‘330X157’, ‘330X404’, ‘261X512’, ‘261X513’, ‘330X401’, ‘520X55’, ‘330X403’, ‘261X517’, ‘261X518’, ‘261X519’, ‘311X7’, ‘330X409’, ‘330X159’, ‘330X158’, ‘330X461’, ‘520X333’, ‘220X13’, ‘310X149’, ‘520X244’, ‘261X338’, ‘330X1249’, ‘330X1248’, ‘300X7’, ‘261X330’, ‘261X331’, ‘340X161’, ‘261X333’, ‘330X1247’, ‘344X121’, ‘261X336’, ‘330X1244’, ‘520X240’, ‘330X1230’, ‘520X241’, ‘330X1241’, ‘261X335’, ‘220X535’, ‘210X129’, ‘210X128’, ‘220X531’, ‘220X530’, ‘210X125’, ‘210X124’, ‘210X127’, ‘261X526’, ‘210X121’, ‘210X120’, ‘210X123’, ‘261X230’, ‘261X592’, ‘440AX123’, ‘261X742’, ‘440AX99’, ‘311X83’, ‘220X178’, ‘330X535’, ‘210X229’]

1) 提取特征后,xgboost的mse为0.0325341683406
2) 单个随机森林的5折交叉验证的平均mse为0.0288353227614
(max_depth=None,n_estimators=160,min_samples_leaf=2,max_features=n_features)

使用模型的featuresimportances选择的特征和rfe做交集得到的特征为:
[‘210X158’, ‘330X1228’, ‘330X1132’, ‘220X13’, ‘310X149’, ‘750X883’, ‘330X589’, ‘210X207’, ‘440AX77’, ‘312X66’, ‘210X192’, ‘330X1190’, ‘310X33’, ‘312X555’, ‘310X31’, ‘310X30’, ‘440AX95’, ‘210X6’, ‘210X8’, ‘330X102’, ‘340X161’, ‘312X57’, ‘310X153’, ‘330X590’, ‘210X89’, ‘330X1129’, ‘210X164’, ‘312X777’, ‘210X188’, ‘330X1146’, ‘310X119’, ‘750X640’, ‘311X7’, ‘312X144’, ‘310X43’, ‘312X782’, ‘210X174’, ‘420X4’, ‘210X229’, ‘312X785’, ‘312X789’]

2.缺失值的处理?

  • 使用任意数值填充
  • 使用平均值填充

3.维数降维?

4.模型的选择?

  1. Random Forest
  2. GBDT(Gradient Boosting Decision Tree)

    这里记录下GBDT的发展过程: Regression Decision Tree -> Boosting Decision Tree -> Gradient Boosting Decision Tree,GBDT利用加法模型和前向分步法实现学习的优化过程.GBDT是一个基于迭代累加的决策树算法,它通过构造一组弱的学习器(树),并把多颗决策树的结果累加起来作为最终的预测输出。 缺点:1) 计算复杂度高 2) 不适合高维稀疏特征

3.Xgboost

xgboost是boosting Tree的一个很牛的实现:

  • 显示地把树模型复杂度作为正则项加到优化目标中
  • 公式推导中用到了二阶导数,用了二阶泰勒展开
  • 实现了分裂点寻找近似算法
  • 利用了特征的稀疏性
  • 并行计算

xgboost的训练速度远远快于传统的GBDT,10倍量级.

总结:重新选用xgboost模型,参数如下,mse为0.0320532717482

1
2
3
4
5
6
7
8
9
10
11
12
params={'booster':'gbtree',
'objective': 'reg:linear',
'eval_metric': 'rmse',
'max_depth':4,
'lambda':6,
'subsample':0.75,
'colsample_bytree':1,
'min_child_weight':1,
'eta': 0.04,
'seed':0,
'nthread':8,
'silent':0}

5.实践过程

1.特征选择过程:去除全为Nan的列,去除Nan值个数大于200的列,去除object列,去除重复的列,选择Pearson相关系数>0.2的列,最后共得到5600多维特征.
这一步很粗糙,改进:

  • 1) 加入object的列
  • 2)特征维数继续筛减:可以试一下PCA降维
  • 3)时间列属性的加入

2.模型的选择:单模型线性回归线下mse:0.0388左右,而线上为0.0446.之前用随机森林回归预测,线下0.0297,而线上0.0493.从这个现象结合线下数据只有500条是否可以得出线下和线上数据并不是分布相同,或者说差异较大,而且线下训练可能存在过拟合.2017.12.24将三种回归模型加权平均融合提交结果.

Duncan's Blog

社交网络中抽取有代表性的用户

Veröffentlicht am 2019-08-17 | in Paper

1.为什么要做这个问题

1.1 从社会应用角度

  • 在HCI(人机交互)中,实施调查和去获得用户的反馈都是主要针对有代表性的用户.
  • 代表性人物的行为习惯和关注点可以折射出整体用户的兴趣偏向和关注点,对于广告投放,物品推荐是有助的.
  • 对于目前日益增长的社交网络用户,从大量的社交网络用户中抽取一个具有代表性的子集才是Human-readable的,有益于数据分析,相当于一个数据摘要.

1.2 从科研方法的角度

  • 从大量模型或数据点中抽取一个保留了原数据集的特征是机器学习/计算机视觉领域数据分析和推荐系统领域都是一个重要的问题.
  • 机器学习领域,找原型子集来辅助分类算法.

2.怎样定义代表性

Note:和在社交网络中寻找影响力最大化的问题不同,找出具有代表性的用户的目的是抽取一些”平均”的用户,他们能够在统计上代表原来所有用户的特征.

2.1 代表性用户具备的条件:

版本一.

  • 1.从属性特征角度上,他们很好的代表了原数据集用户的属性特征(行为习惯/性格特征/领域情况等等),即,与原数据集用户具有较少的特征损耗
  • 2.从分布特征角度,代表性子集应尽可能拟合原数据集的样本分布,即,与原数据集具有较少的分布损耗(类似于原数据集中每个领域的人物分布,代表性子集能够拟合原数据集每个领域的人物分布)
  • 3.从差异性角度上,代表性子集需要能够作为每个领域的典型人物,所以代表性子集内部各领域之间的人物需要保持一定的差异性,即,代表性子集内部需要较大的差异性或较小的相似性

版本二.

  • 1.从特征角度上,他们很好的代表了原数据集用户的属性特征(行为习惯/性格特征/领域情况等等),即,与原数据集用户具有较少的特征损耗
  • 2.从分布角度,代表性子集在满足(1)条件下应尽可能的分散或稀疏,使得子集可以尽可能地还原原数据集的分布,即,P具有具有稀疏性;
    -note:如果仅仅要求特征损耗最小,可能会导致代表性子集都聚集在人数较多较相似的团体中,以致于原数据集的分布丢失.

目前倾向于版本一.

2.2 问题定义:

在原数据集人物集合中寻找这样的代表性子集P

  • a)P能够满足以上代表性的定义
  • b)P是数量最小的那个代表性集合

2.3 Novel之处或者contibution:

  • 1.代表性人物包含了两种情况的综合考虑,之前论文中大多考虑单一方面
  • 2.代表性人物的大小不需要先验设定.

将用户以各个属性构建向量,以向量之间的距离来定义人物之间的代表性.
以Twitter社交拓扑为例,当A用户关注了B用户,将会有A指向B的一条有向边,

3.如何具体评价子集的代表性

4.方法

Duncan's Blog

推荐算法

Veröffentlicht am 2019-08-17 | in Recommendation

算法分类

1.基于内容 / 用户的推荐

更多依赖相似性计算然后推荐

  • 基于用户信息进行推荐
  • 基于内容 、物品的信息进行推荐

2.协同过滤

需要通过用户行为来计算用户或物品见的相关性

  • 基于用户的协同推荐: 以人为本

    | 小张 | 产品经理、Google、增长 |
    | —— | ———————————— |
    | 小明 | 产品经理、Google、比特币 |
    | 小吴 | 比特币、区块链、以太币 |

    这是一个用户关注内容的列表,显然在这个列表中,小张和小明关注的内容更为相似,那么可以给小张推荐比特币。

  • 基于物品的系统推荐

    以物为本建立各商品的相似度矩阵

    | 产品经理 | 小张、小明 |
    | ———— | ————— |
    | Google | 小张、小明 |
    | 比特币 | 小明、小吴 |

    小张和小明都不约而同地看了产品经理和Google,这可以说明产品经理和Google有相似,那么之后有看了Google相关内容的用户就可以给推荐产品经理的相关内容。

3.基于知识的推荐

某一领域的一整套规则和路线进行推荐。参照可汗学院知识树。

补充:(图片来源知乎shawn1943,感谢)

Duncan's Blog

Recommendation方向学习

Veröffentlicht am 2019-08-17 | in Paper

综述

目前推荐上研究的方向有这样几个方向:
1.Temporal Context-Aware Recommendation
2.Spatial Recommendation for Out-of-Town Users
3.Location-based and Real-time Recommendation
4.Efficiency of Online Recommendation

补充学习:

online learning强调的是学习是实时的,流式的,每次训练不用使用全部样本,而是以之前训练好的模型为基础,每来一个样本就更新一次模型,这种方法叫做OGD(online gradient descent)。

batch learning或者叫offline learning强调的是每次训练都需要使用全量的样本,因而可能会面临数据量过大的问题。

传统的推荐系统广泛都使用了协同过滤和基于内容过滤技术

协同过滤分为

基于内存的推荐和基于模型的推荐(矩阵分解)

Context-Aware Recommender Systems(CARS)包含三种范例:contextual pre-filtering,contextual post-filtering and contextual modeling.

Duncan's Blog

python-MPI安装命令

Veröffentlicht am 2019-08-17 | in Note

在Ubuntu下安装MPI环境(python环境)

Step1:安装python环境</br>

Step2:sudo apt-get install openmpi-bin</br>

Step3:sudo apt-get install libopenmpi-dev</br>

Step4:sudo apt-get install python-mpi4py</br>

(第三步不要忽略)

Duncan's Blog

python构建小顶堆

Veröffentlicht am 2019-08-17 | in Note

近日实验中需要用到小顶堆,记录下来,便于日后参考.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
import heapq
# 定义一个小顶堆
class MinHeap(object):
# 允许传入tuple,按照第二个元素比较
def __init__(self, initial=None, key=lambda x:x[1]):
self.key = key
if initial:
self._data = [(key(item), item) for item in initial]
heapq.heapify(self._data)
else:
self._data = []
def push(self, item):
heapq.heappush(self._data, (self.key(item), item))
def pop(self):
return heapq.heappop(self._data)[1]
def size(self):
return len(self._data)

123…7
duncan

duncan

write something useful

70 Artikel
13 Kategorien
18 Tags
RSS
GitHub instagram music zhihu
© 2019 duncan
Erstellt mit Hexo
Theme - NexT.Pisces
| Total visited times