王子子的成长之路

王子子


  • 首页

  • 历程

  • 学习

  • 随笔

  • 关于
王子子的成长之路

天池赛IJCAI-17 口碑商家客流量预测 解题思路

发表于 2017-03-22 | 分类于 历程

赛题与数据
代码

基本数据创建

result:每家店铺每日交易成功数量
view:每家店铺每日浏览量

参数分解

shop_info

shop_id city_name location_id per_pay score comment_cnt shop_level cate_name..
商家id 城市名 所在位置编号 人均消费 评分 评论数 商铺等级 分类

shop_id:主键,索引
city_name:获取气温、消费能力、消费习惯
location_id:聚类算法,估计功效太低没什么意义,pass
per_pay:检测与result负相关,与view负相关。
socre:检测与result正相关,与view正相关。
comment_cnt:检测与result正相关,与view正相关。
shop_level:检测与result正相关,与view正相关。
cate_name:分类太细,考虑只保留使用“超市”和“美食”进行区分。

检测per_pay、score、comment_cnt、shop——level与view、result的关联度。
score有很大的问题:这个值是处于变动的。

user_pay

user_id shop_id time_stamp
付费用户id 商家id 消费时间

time_stamp:分解出日期day和时间time列。

user_view

user_id shop_id time_stamp
浏览用户id 商家id 浏览时间

time_stamp:分解出日期day和时间time列。

特征工程

1.考虑到口碑是2015年6月23日开始发布,必然遭遇冷启动和虚假数据问题,那么时间序列中,体现趋势的指标应该是7日移动平均线ma,影响最大的特征因子应该是最近一次的ma_7。
2.城市天气逻辑体现非常重要,主要划分了三级(晴,小雨/小雪/,大雨/雪),但划分后的效果并不很好。
3.当日是否为工作日,次日是否为工作日比较重要。
4.16年情人节到过年的那周视为噪音。
5.GDP作为特征果然没效果,删了。

感受

1.以不同可索引对象制造的模型再融合有巨大威力,第一次瞎配的权重都带来了最好的提升。
2.solo的问题不在于想法…判断出哪个想法提升最多是最重要的,当然这需要经验。
3.xgboost因为bug跑不起来,没时间走ARIMA,也没时间再上prophet,凄苦…水平不够时候有队友提升会比较快。
4.合理利用每日评分确定正确方向是非常有必要的,相信前几的差距已经是谁对趋势判断更敏锐了。
5.全身心的投入大约勉强能进前200,看wepon大神的blog,对底层的理解还是很重要,今后要加强学习和训练。

王子子的成长之路

最近在做测试

发表于 2017-03-17 | 分类于 历程

最近一直在忙测试相关工作,记录下测试工作心得:
1.重要的不仅只是懂业务流程,也要把思路抽离在流程之外。因为产品在设计时,往往会先定下大的方向,再逐渐寻找最优路线,在不停的修改中,也许已经偏离“可用”的轨道,此时测试应该代入的是用户的思路,对测试时找到的BUG,提出期望结果;对不合适的流程,也要提出优化期望。
2.细化的测试用例很重要,一方面可用于自动化测试的架构,另一方面,越细的测试用例,在写的时候就能发现非常多的问题。
3.如果作为懂技术的测试人员,对于测出的问题,应该做到比写这个功能的开发了解的更透彻,这也是一个测试人员平庸和杰出的分水岭。
4.测试人员是产品和开发扯皮中的重要第三方,沟通非常重要。
5.同上,测试“可信任”也是非常重要的,对能复现的问题,一定要通过复现从而找出问题;对不能复现的问题,记录下相关操作以便将来找出原因,直觉是知识、感官的积累,对于难以找到原因的问题,直觉非常重要。
6.最好的用例就是文档,文档即用例。

王子子的成长之路

Paxos算法简易理解

发表于 2017-02-24 | 分类于 学习

简介

Paxos算法简单来说就是一个在异步分布式系统里用以保证一致性的投票算法,严格来说,Paxos并不是一个算法,而是一个经过严谨逻辑推导出的投票方式。该算法由莱斯利·兰伯特于1990年提出,只由一些必须要被满足的基本条件推导得出,因此Paxos是在所有分布式算法中最简单,同时也是最稳定的算法。

Paxos应用于“基于消息传递且要求具有高度容错特性”的场景,在“共享内存”的分布式场景中并不适用,另外,虽然有许多基于Paxos的一致性算法,但都没有paxos稳定。

谷歌在其分布式锁服务(Chubby lock)中应用了Paxos算法。Yahoo!开源的ZooKeeper是一个开源的类Paxos实现,而hadoop也支持ZooKeeper协议。

这个世界上只有一种一致性算法,那就是Paxos,其它的算法都是残次品 – Mike Burrows

算法假设

1.不存在拜占庭将军问题(一条消息可能被传递两次,但在传递中不会出错) 2.只要等待足够的时间,消息就会被传到(信息必定到达) 3.每个节点对于信息,接收到信息即以为赞同,同时只有接受和忽略,没有反对。(只可根据赞成数来确定结果) 4.信息不一定会被成功传递,也无法确定传递时间。(包容传递失败,并确定在此条件下也能保持一致性) ##算法定义 在一个分布式系统中,每个节点会有最少1种,最多3种身份,分别是proposers(提案者)、acceptors(批准者)、learners(接受者),他们在节点中相互传递信息被称为value(决议)。 1.决议只能被提案者提出,同时随决议附有一个编号,编号是递增且唯一的; 2.任何两个提案编号之间构成偏序(意味着提案者的编号大小是有意义的;同一次提案,提案者的权限是有等级分别的); 3.在一次算法执行中,每个批准者一次只批准一条决议,并且只与最新的决议形成交互(意味着可能存在信息队列); 4.收到超过半数的表态,即视为通过决议,并向所有人广播; 5.接受者只能获得最终被批准的决议。 需要注意的是,节点可以同时拥有三种身份,当节点既是提案者,又是批准者时,他必定会为自己提出的决议投出一票。

实例

东方网准备开一场主题为“智橙生活未来发展方向”的会议,与会人员分别是董事长何XX、副董事长徐XX、纪委书记金X、副总裁高X、技术总监老王。与会人员都可以提案和赞同,一人一票。其他未与会人员例如开发、产品、数据分析师等,只能接受讨论结果(定义5)。

第一天:董事长提案智橙生活应该主打“上海市民离不开的产品”,其他4人纷纷表示“赞同”,董事长收到其他4人的表态,开心的表示全票通过,向所有人广播“产品基调定好,新的提案不得再讨论本问题”,全场统一。

第二天:董事长提案智橙生活应该添加“为民办事”功能,老王不能装作听不见,只好表示“赞同”(假设3),副总裁和纪委书记睡着了,无法表态,董事长等了半天只等到了两个表态,表示少两人老子照样干,加上自己一票通过了决议(定义4),向所有人广播“功能确定,新的提案不得再讨论本问题”,全场统一。

第三天:副总裁和纪委书记睡醒了,发现了董事长的提案,但同时(或更早)收到了提案结果的广播,于是他们不必再对此提案表态,全场统一。

第四天:轮到老王提案,他提出了“打磨产品,塑造核心功能点”的主旨,这时其他4位领导都睡着了,老王未获得任何表态。决议失败,不能向任何人广播。只能重新提案,全场统一。

第五天:4位领导终于都醒了,这时董事长提出了“尽可能多的造功能,我们要做一款万能APP”的主旨,老王再次提出昨天的提案,其他三位领导先听见了董事长的训示,纷纷表态支持,这时才反应过来老王有一份同样的提案,这时有两种情况:

老王职级低:其他领导表态后收到了老王的提案并发现是相同的提案(定义3),但老王的职级比他们的低,因此会忽略老王的提案,全场统一。

老王职级高:其他领导表态后收到了老王的提案并发现是相同的提案(定义3),他们会向老王回复之前已经通过了的提案及其内容并忽略投票,这样老王会知道自己的提案无望,全场统一。

第六天:董事长和老王同时说出对一件事的提案,并且获得邻座(近邻节点)的迅速反馈,此时老王邻座的副总裁和纪委书记先向老王表态“赞同”,当董事长的提案到来时,他们会再次表示“赞同”。而副董事长先向董事长的提案表示“赞同”后,收到了老王的提案,此时他将向老王表示“已有大人物关注此事,你不要插手”(定义2)。当信息传递结束,高权限必定获得更高的“赞同”,提案通过,全场统一。

第七天:老王总结出了深刻的人生哲理:在异步的任何情况下,即使某一节点出于某些原因无法接受信息,也绝不影响该节点以及总体对于一致性的检测,并且为了保证异步一致,权限相对较低的节点在提案和投票中处于较不利的位置。

王子子的成长之路

使用sklearn进行数据预处理 —— 归一化/标准化/正则化

发表于 2017-02-18 | 分类于 学习

本文主要是对照scikit-learn的preprocessing章节结合代码简单的回顾下预处理技术的几种方法,主要包括标准化、数据最大最小缩放处理、正则化、特征二值化和数据缺失值处理。内容比较简单,仅供参考!

首先来回顾一下下面要用到的基本知识。 ## 一、知识回顾 均值公式: \[\bar{x}=\frac{1}{n}\sum_{i=1}^{n}x_{i}\] 方差公式: \[s^{2}=\frac{1}{n}\sum_{i=1}^{n}(x_{i}-\bar{x})^{2}\] 0-范数,向量中非零元素的个数。 1-范数: \[||X||=\sum_{i=1}^{n}|x_{i}|\] 2-范数: \[||X||_{2}=(\sum_{i=1}^{n}x_{i}^{2})^{\frac{1}{2}}\] p-范数的计算公式: \[||X||_{p}=(\sum_{i=1}^{n}x_{i}^{p})^{\frac{1}{p}}\]


数据标准化:当单个特征的样本取值相差甚大或明显不遵从高斯正态分布时,标准化表现的效果较差。实际操作中,经常忽略特征数据的分布形状,移除每个特征均值,划分离散特征的标准差,从而等级化,进而实现数据中心化。

二、标准化(Standardization),或者去除均值和方差进行缩放

公式为:(X-X_mean)/X_std 计算时对每个属性/每列分别进行.

将数据按其属性(按列进行)减去其均值,然后除以其方差。最后得到的结果是,对每个属性/每列来说所有数据都聚集在0附近,方差值为1。

首先说明下sklearn中preprocessing库里面的scale函数使用方法:

1
sklearn.preprocessing.scale(X, axis=0, with_mean=True, with_std=True, copy=True)

根据参数的不同,可以沿任意轴标准化数据集。 参数解释:

  • X:数组或者矩阵
  • axis:int类型,初始值为0,axis用来计算均值 means 和标准方差 standard + deviations. 如果是0,则单独的标准化每个特征(列),如果是1,则标准化每个观测样本(行)。
  • with_mean: boolean类型,默认为True,表示将数据均值规范到0
  • with_std: boolean类型,默认为True,表示将数据方差规范到1

一个简单的例子

假设现在我构造一个数据集X,然后想要将其标准化。下面使用不同的方法来标准化X:

方法一:使用sklearn.preprocessing.scale()函数

方法说明:

  • X.mean(axis=0)用来计算数据X每个特征的均值;
  • X.std(axis=0)用来计算数据X每个特征的方差;
  • preprocessing.scale(X)直接标准化数据X。

将代码整理到一个文件中:

1
2
3
4
5
6
7
8
9
10
11
12
13
from sklearn import preprocessing
import numpy as np
X = np.array([[ 1., -1., 2.],
[ 2., 0., 0.],
[ 0., 1., -1.]])
# calculate mean
X_mean = X.mean(axis=0)
# calculate variance
X_std = X.std(axis=0)
# standardize X
X1 = (X-X_mean)/X_std
# use function preprocessing.scale to standardize X
X_scale = preprocessing.scale(X)

最后X_scale的值和X1的值是一样的,前面是单独的使用数学公式来计算,主要是为了形成一个对比,能够更好的理解scale()方法。

方法2:sklearn.preprocessing.StandardScaler类

该方法也可以对数据X进行标准化处理,实例如下:

1
2
3
4
5
6
7
from sklearn import preprocessing
import numpy as np
X = np.array([[ 1., -1., 2.],
[ 2., 0., 0.],
[ 0., 1., -1.]])
scaler = preprocessing.StandardScaler()
X_scaled = scaler.fit_transform(X)

这两个方法得到最后的结果都是一样的。

三、将特征的取值缩小到一个范围(如0到1)

除了上述介绍的方法之外,另一种常用的方法是将属性缩放到一个指定的最大值和最小值(通常是1-0)之间,这可以通过preprocessing.MinMaxScaler类来实现。

使用这种方法的目的包括:

  • 1、对于方差非常小的属性可以增强其稳定性;
  • 2、维持稀疏矩阵中为0的条目。

下面将数据缩至0-1之间,采用MinMaxScaler函数

1
2
3
4
5
6
7
from sklearn import preprocessing
import numpy as np
X = np.array([[ 1., -1., 2.],
[ 2., 0., 0.],
[ 0., 1., -1.]])
min_max_scaler = preprocessing.MinMaxScaler()
X_minMax = min_max_scaler.fit_transform(X)

最后输出:

1
2
3
array([[ 0.5 , 0. , 1. ],
[ 1. , 0.5 , 0.33333333],
[ 0. , 1. , 0. ]])

测试用例:

1
2
3
4
X_test = np.array([[ -3., -1., 4.]])
X_test_minmax = min_max_scaler.transform(X_test)
X_test_minmax
array([[-1.5 , 0. , 1.66666667]])

注意:这些变换都是对列进行处理。

当然,在构造类对象的时候也可以直接指定最大最小值的范围:feature_range=(min, max),此时应用的公式变为:

1
2
X_std=(X-X.min(axis=0))/(X.max(axis=0)-X.min(axis=0))
X_minmax=X_std/(X.max(axis=0)-X.min(axis=0))+X.min(axis=0))

四、正则化(Normalization)

正则化的过程是将每个样本缩放到单位范数(每个样本的范数为1),如果要使用如二次型(点积)或者其它核方法计算两个样本之间的相似性这个方法会很有用。

该方法是文本分类和聚类分析中经常使用的向量空间模型(Vector Space Model)的基础.

Normalization主要思想是对每个样本计算其p-范数,然后对该样本中每个元素除以该范数,这样处理的结果是使得每个处理后样本的p-范数(l1-norm,l2-norm)等于1。

方法1:使用sklearn.preprocessing.normalize()函数

1
2
3
4
5
6
7
8
>>> X = [[ 1., -1., 2.],
... [ 2., 0., 0.],
... [ 0., 1., -1.]]
>>> X_normalized = preprocessing.normalize(X, norm='l2')
>>> X_normalized
array([[ 0.40..., -0.40..., 0.81...],
[ 1. ..., 0. ..., 0. ...],
[ 0. ..., 0.70..., -0.70...]])

方法2:sklearn.preprocessing.StandardScaler类

1
2
3
>>> normalizer = preprocessing.Normalizer().fit(X) # fit does nothing
>>> normalizer
Normalizer(copy=True, norm='l2')

然后使用正则化实例来转换样本向量:

1
2
3
4
5
6
>>> normalizer.transform(X)
array([[ 0.40..., -0.40..., 0.81...],
[ 1. ..., 0. ..., 0. ...],
[ 0. ..., 0.70..., -0.70...]])
>>> normalizer.transform([[-1., 1., 0.]])
array([[-0.70..., 0.70..., 0. ...]])

两种方法都可以,效果是一样的。

五、二值化(Binarization)

特征的二值化主要是为了将数据特征转变成boolean变量。在sklearn中,sklearn.preprocessing.Binarizer函数可以实现这一功能。实例如下:

1
2
3
4
5
6
7
8
9
10
>>> X = [[ 1., -1., 2.],
... [ 2., 0., 0.],
... [ 0., 1., -1.]]
>>> binarizer = preprocessing.Binarizer().fit(X) # fit does nothing
>>> binarizer
Binarizer(copy=True, threshold=0.0)
>>> binarizer.transform(X)
array([[ 1., 0., 1.],
[ 1., 0., 0.],
[ 0., 1., 0.]])

Binarizer函数也可以设定一个阈值,结果数据值大于阈值的为1,小于阈值的为0,实例代码如下:

1
2
3
4
5
>>> binarizer = preprocessing.Binarizer(threshold=1.1)
>>> binarizer.transform(X)
array([[ 0., 0., 1.],
[ 1., 0., 0.],
[ 0., 0., 0.]])

六、缺失值处理

由于不同的原因,许多现实中的数据集都包含有缺失值,要么是空白的,要么使用NaNs或者其它的符号替代。这些数据无法直接使用scikit-learn分类器直接训练,所以需要进行处理。幸运地是,sklearn中的Imputer类提供了一些基本的方法来处理缺失值,如使用均值、中位值或者缺失值所在列中频繁出现的值来替换。

下面是使用均值来处理的实例:

1
2
3
4
5
6
7
8
9
10
>>> import numpy as np
>>> from sklearn.preprocessing import Imputer
>>> imp = Imputer(missing_values='NaN', strategy='mean', axis=0)
>>> imp.fit([[1, 2], [np.nan, 3], [7, 6]])
Imputer(axis=0, copy=True, missing_values='NaN', strategy='mean', verbose=0)
>>> X = [[np.nan, 2], [6, np.nan], [7, 6]]
>>> print(imp.transform(X))
[[ 4. 2. ]
[ 6. 3.666...]
[ 7. 6. ]]

Imputer类同样支持稀疏矩阵:

1
2
3
4
5
6
7
8
9
10
>>> import scipy.sparse as sp
>>> X = sp.csc_matrix([[1, 2], [0, 3], [7, 6]])
>>> imp = Imputer(missing_values=0, strategy='mean', axis=0)
>>> imp.fit(X)
Imputer(axis=0, copy=True, missing_values=0, strategy='mean', verbose=0)
>>> X_test = sp.csc_matrix([[0, 2], [6, 0], [7, 6]])
>>> print(imp.transform(X_test))
[[ 4. 2. ]
[ 6. 3.666...]
[ 7. 6. ]]

sklearn相关英文版本:Preprocessing data 中文版本:数据预处理

本文提取自:http://blog.csdn.net/dream_angel_z/article/details/49406573

王子子的成长之路

windows 10 github page + hexo + pandoc + next 搭建博客

发表于 2017-02-13 | 分类于 历程

之前根据crossin的编程教室一系列教程使用githubpage + hexo + yilia成功搭建了博客,但是知其然不知其所以然,在尝试转变风格为next的时候花了不少功夫,痛定思痛之后决定把这些记录下来,以备将来再次安装使用。

简单的教程很多就不再赘述,直接粘贴当时看的教程。 用 GitHub + Hexo 建立你的第一个博客 部署博客及更新博文 安装自己喜欢的主题

更换markdown渲染引擎

hexo默认只支持最基础的markdown渲染,为了实现现代化的功能(囧),改用pandoc来进行渲染。 首先前往pandoc官网下载并安装pandoc,安装成功后测试pandoc --help命令以确定安装成功。 之后安装pandoc作为hexo的渲染引擎,进入hexo目录后,输入以下命令:

npm uninstall hexo-renderer-marked --save
npm install hexo-renderer-pandoc --save

pandoc和基础markdown语法有细微不同,具体细节可以去官网查阅。

支持LATEX数学公式

hexo目录中,输入以下命令:

npm install hexo-math --save
hexo math install

并且在网站配置的_config.yml文件中添加:

plugins:
- hexo-math

最后有一点许多教程都没有提到的,记得去正在使用的主题配置_config.yml中,将MathJex相关支持设定为true。

更换主题为next

依然在hexo目录中,安装next主题

git clone https://github.com/iissnan/hexo-theme-next themes/next

打开站点配置文件_config.yml修改主题为next

theme: next

相关建议设置next官网有清楚的描述。

使用Hexo的内建归档categories

作者:碎瞳Artin 链接:https://www.zhihu.com/question/33324071/answer/58775540 来源:知乎 著作权归作者所有,转载请联系作者获得授权。

1.第一步:生成post(文章)时默认生成categories配置项:在根目录下scaffolds/post.md中,添加一行categories:。同理可应用在page.md和photo.md,示例如下:

title: {{ title }}
date: {{ date }}
tags:
categories:
 # 此处为添加内容
---

2.第二步:在实际写作时,在开头进行categories配置。例如:

title: Hello,World!你好,世界!
date: 2014-01-21 23:33:02
tags: 写作 
categories: 随笔 # 配置categories

这样在文章发布时,在git中使用hexo g命令,hexo会在根目录/public/categrises下自动生成归档文件夹,如图:

image_1b8php9vm1tb71u91170v1kusmrqg.png-26kB

image_1b8php9vm1tb71u91170v1kusmrqg.png-26kB

3.第三步:配置博客首页归档展示样式。在主题配置文件themes/_config.yml中添加以下代码(#号后为注释内容):

menu:
  home: /
  essay: /categories/随笔     # 博客首页展示文本/访问路径/自定义归档名称
  write: /categories/写作     
  read: /categories/阅读       
  study: /categories/学习
  code: /categories/编程

4.补充说明:如果发现博客首页展示文本为英文,需要改为中文显示,需要修改先博客根目录下的_config.yml文件的language配置,示例如下:

# Site
title: My Blog
subtitle: 
description: 
author: 
language: zh-CN # 修改此处,一般默认为default.yml,原生英文显示
timezone:

然后为实现文章归档名称显示为中文,接着再修改主题配置文件下language/zh-CN.yml即可,示例如下:

title:
  archive: 归档
  category: 分类
  tag: 标签
menu:
  home: 首页
  archives: 归档
  categories: 分类
  tags: 标签
  about: 关于
  essay: 随笔  # 编辑代码时注意语法规范如缩进、空格等
  read: 阅读   # Hexo采用yml语法,具体可自行搜索
  write: 写作

5.最终展示效果(图中红框作强调用):

image_1b8phsloq155m1dbv9f9cgd6g4t.png-41.6kB

image_1b8phsloq155m1dbv9f9cgd6g4t.png-41.6kB

6.点进某一归档分类如“阅读”,博客文章会依照归档配置,排序显示如下:

image_1b8pht2l6ifh1neh1k4i3hgsg21a.png-27.1kB

image_1b8pht2l6ifh1neh1k4i3hgsg21a.png-27.1kB

**注:目前下载安装的hexo貌似都没有zh-CN.yml,而以zh-Hans代替,第四步修改对应文件即可。

上传博客常用命令

hexo目录下:

# 清理缓存
hexo clean
# 生成静态文件
hexo generate
# 本地预览(在4000端口)
hexo s
# 提交至网站
hexo deploy

文件前的title各标签视主题而有所不同。

1234
王子子

王子子

天生极客

18 日志
4 分类
GitHub 知乎
Friends
  • andrewwang
© 2017 王子子
由 Hexo 强力驱动
主题 - NexT.Pisces