少年游

欲买桂花同载酒,终不似,少年游。

0%

安装

  • 安装与启动
  • 下载 Windows 客户端(内置 Linux 子系统,提供原生 Linux 开发体验)这个版本
  • 下载完之后可以直接安装
  • 启动BML CodeLab(如果安装完可以直接打开则跳过后续步骤)
    如果报错wsl则先配置wsl2, 如果报错docker则需要安装 docker镜像

wsl2配置

  1. 管理员身份打开 powershell,输入下面指令。
    1
    $$ Enable-WindowsOptionalFeature -Online -FeatureName VirtualMachinePlatform
  2. 在 PowerShell 中运行下面指令以将 WS L转变为 WSL2 。

    1
    $$ wsl --set-default-version 2
  3. 查看当前子系统列表

    1
    2
    3
    4
    $$ wsl -l -v
    NAME STATE VERSION
    * Ubuntu-20.04 Running 1
    bml-codelab Running 2

    如果有 bml-codelab 则子系统存在,而且是 wsl2 分发版

启动 bml-codelab

1
$$ wsl -d bml-codelab

如果报错Failed to set version to docker-desktop: exit code: -1
需要:NoLsp.exe 下载地址

cmd管理员下执行

1
2
$$ NoLsp.exe c:\windows\system32\wsl.exe
Success!

docker安装镜像

1
2
3
4
5
6
7
8
9
10
11
12
$$ docker load --input codelab_cpu.0.3.2.tar.gz
762d8e1a6054: Loading layer [==================================================>] 91.39MB/91.39MB e45cfbc98a50: Loading layer [==================================================>] 15.87kB/15.87kB d60e01b37e74: Loading layer [==================================================>] 12.29kB/12.29kB b57c79f4a9f3: Loading layer [==================================================>] 3.072kB/3.072kB 4b7de42b7ca3: Loading layer [==================================================>] 870.1MB/870.1MB 5e86736c169f: Loading layer [==================================================>] 805.9kB/805.9kB 8a6ada0c0934: Loading layer [==================================================>] 2.327MB/2.327MB d5a0861e1d8c: Loading layer [==================================================>] 1.295GB/1.295GB 3f9d86b3f7a5: Loading layer [==================================================>] 3.072kB/3.072kB 7c4f5dae3140: Loading layer [==================================================>] 11.4MB/11.4MB 4dea97a4c622: Loading layer [==================================================>] 12.8kB/12.8kB bdc626aed6fe: Loading layer [==================================================>] 40.33MB/40.33MB aa5f0d69148a: Loading layer [==================================================>] 6.144kB/6.144kB 159f6dd6ce7b: Loading layer [==================================================>] 3.584kB/3.584kB f2d43b4d5a6f: Loading layer [==================================================>] 2.56kB/2.56kB 9da1e585de35: Loading layer [==================================================>] 16.9kB/16.9kB b25860c4d9f8: Loading layer [==================================================>] 17.41kB/17.41kB 9acba5ef0eb3: Loading layer [==================================================>] 32.26kB/32.26kB b20dad55177e: Loading layer [==================================================>] 13.31kB/13.31kB d9f4e5d74149: Loading layer [==================================================>] 3.808MB/3.808MB fddb2663004d: Loading layer [==================================================>] 6.144kB/6.144kB 0ee6855b88fd: Loading layer [==================================================>] 42.5kB/42.5kB 824cee98dd03: Loading layer [==================================================>] 3.072kB/3.072kB d69f4ef5eae2: Loading layer [==================================================>] 630MB/630MB 57082fc6ece1: Loading layer [==================================================>] 4.608kB/4.608kB

$$ docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
hub.baidubce.com/jarvis2/codelab cpu2021-01-11 4bbbf92b2eaa 6 weeks ago 2.83GB

# 如果当前机器无GPU卡,启动命令为:
$$ docker run -d -p {本地启动的端口, 可以是8552}:8670 -v /home/work/codelab:/home/work/mnt --privileged {镜像的名称或镜像的ID, 上面对应是4bbbf92b2eaa}

如果当前机器有GPU卡,启动命令为:
docker run -d -p {本地启动的端口, 可以是8552}:8670 -v /home/work/codelab:/home/work/mnt -–gpus all --privileged

win10桌面启动BML CodeLab

成功!

这个问题超有趣,推荐系统里有类似的场景,即只有用户点击浏览购买的正样本,却没有显性负样本,这样该如何学习呢? 我们假设下面几种方案:对于一个用户,用他所有没有过行为的数据作为负样本对于一个用户,从他没有过行为的负样本中均匀采样出一些作为负样本对于一个用户,从他没有过行为的负样本中均匀采样出一些作为负样本, 且保证正负样本比为1:1对于一个用户,从他没有过行为的负样本中均匀采样出一些作为负样本,但采样时,偏重采样那些热门却没有点击的样本。对于第一种方法,缺点太明显,在实际样本中,负样本数量远远超过正样本,正负样本比例太悬殊,效果最差。而第三种方法好于第二种,因为第三种样本比例比较平衡。最有趣的莫过于第四种方案了,在2011年举办的KDD cup的Yahoo!music推荐比赛中,大家发现选取热门却没有行为的样本进行负采样效果最好!因为热门物品大概率曝光过,而用户没有点,说明用户不感兴趣;而冷门物品,用户压根就没见到过,根本谈不上是否感兴趣。一个看似简单的办法,背后却是对用户及数据逻辑深刻的洞察,这才是机器学习最有魅力的地方。

实践

直播推荐ctr预估,时长样本优化:

* 用户点击推荐流,但是没曝光或者很短的时间就退出,可以考虑为真实负样本。如果只考虑曝光和点击样本,则会将一些封面主播推出,ctr虽高,实际观看效果不好。
* 用户的推荐列表中有英雄联盟,dota。用户经常看英雄联盟,没有一次点击 dota 或者 dota 累计观看时长小于k=10分钟。可以考虑删除这些样本,或者采样作为负样本。
* 推荐列表所在的session,如果用户只点击了英雄联盟,可以只考虑英雄联盟类别或者当前session时效下点击的样本为正样本,未点击的为负样本。

互动交友推荐:
用户点击曝光列表多,但是基本没有回应,可以删除这些用户的样本,可能是骗子。
用户有点击曝光列表,但是从未发送过消息。可以删除这些用户的样本,可能不是真实用户。
用户有点击曝光列表,但是发送过消息。则是大概率是真实用户,也需采样用户发送的条目数(骗子用户可能一天发送很多用户),全部作为样本训练问题较大。

参考

[1]. 只有正样本和未标签数据的机器学习怎么做?
[2]. 加权随机抽样算法
[3]. 加权随机采样 (Weighted Random Sampling)

FALCONN的索引构建过程非常快,百万量级的数据,维度如果是128维,其构建索引时间大概2-3min的样子,实时搜索可以做到几毫秒的响应时间。总之,这是小白菜见过的构建索引时间最短查询响应时间也极快的ANN工具库。

另外谈一下数据规模问题。对于小数据集和中型规模的数据集(几个million-几十个million), FALCONN和 NMSLIB 是一个非常不错的选择,如果对于大型规模数据集(几百个million以上),基于矢量量化的 Faiss 是一个明智的选择。关于这方面的讨论,可以参阅小白菜参阅的讨论 benchmark。

参考

[1]. 图像检索:再叙ANN Search
[2]. KD树和LSH局部敏感哈希
[3]. 浅谈KNN算法与KD树
[4]. Nmslib高维空间最近邻逼近搜索算法介绍
[5]. nmslib github

CART回归树原理

  • 回归树将特征值大于切分点值的数据划分为左子树。
  • 回归树将特征值小于等于切分点值的数据划分为右子树。

如何寻找切分点值,最优切分点

  • 切分指标:平方误差
    分别是划分样本中回归目标的均值。

CART回归树例子

面积/平米 价格/万
20 40.1
21 40.3
35 70.4
36 70.2
  1. 按照面积=20切分, 均值是 (40.3 + 70.4 + 70) / 3 = 60.3, $y_2$均值是40.1

  2. 按照面积=21切分, $y_1$均值是(70.4 + 70.2) / 2 = 70.3, 均值是 (40.1 + 40.3) / 2 = 40.2

  3. 按照面积=35, $y_1$均值是70.2, 均值是 (40.1 + 40.3 + 70.4) / 3 = 50.27

由此可见面积=21是当前最优切分。

  • 切分结果
面积/平米 价格/万
20 40.1
21 40.3
- -
35 70.4
36 70.2

面积>21: 面积>35: 价格=70.2, 面积<=32: 价格=70.4
面积<=21: 面积>20: 价格=40.1,面积<=20: 价格=40.3

参考

[1]. 机器学习系列之手把手教你实现一个分类回归树
[2]. 残差预测

CART分类树原理

二分思想:

* 将特征值等于切分点值的数据划分为左子树。
* 将特征值不等于切分点值的数据划分为右子树。

如此循环构造二叉分类树。

如何寻找切分点值,最优切分点

切分指标:

* 基尼指数
  • 假设有N个类别,样本属于第n类的概率为$P_n$, 则基尼系数为:

  • 若数据集按特征值A取值是否等于切分点D1和D2两部分,则在特征A下,集合D的基尼指数为:

那么,对于数据集D,存在特征A,B,C三个,我们就需要选取最优切分点。计算出Gini(D,A), Gini(D,B), Gini(D,C)。如此以来,我们就可以选取最大或者最小作为切分依据。
那到底是最大还是最小呢?请看基尼指数定义。

CART树分类例子

  • 给定数据集D, 含有两个个特征A, B。分类标签是label
A B label
1 1 1
1 0 0
0 1 0
0 0 0
1 0 0
  • 选择最优特征
  1. 分界点A=1, 参考公式
  1. 分界点B=1, 参考公式由此可见,Gini(D, B=1)数值更小,应当以特征B划分第一个节点。
A B label
1 1 1
0 1 0
- - -
1 0 0
0 0 0
1 0 0

划分后,由于只剩下一个特征,其实是不用计算的,直接划分
那么决策树为:{“B=0”: “label=0”, “B=1”: {“A=1”: “label=1”, “B=0”: “label=0”}} }

* 教育观

素质教育观的定义和内涵

①素质教育以提高国民素质为根本宗旨
②素质教育是面向全体学生的教育
③素质教育是促进学生全面发展的教育
④素质教育是促进学生个性发展的教育
⑤素质教育是以培养学生的创新精神和实践能力为重点的教育
口诀:“提素”“个性”“创”“两全”

新课改的教学观

①教学从“教育者为中心”转向“学习者为中心”
②教学从“教会学生知识”转向“教会学生学习”
③教学从“重结论轻过程”转向“重结论的同时更重过程”
④教学从“关注学科”转向“关注人”
口诀:四个转向

我国教育目的的基本精神

①要培养的人是社会主义事业的建设者和接班人
②要求学生在德智体美劳等方面全面发展
③适应时代要求,强调学生个性的发展
口诀:全面建设个性接班人

阅读全文 »

hive创建空map

  • 众所周知,hive默认的空类型的map对应的类型是map<string, string>
    1
    2
    3
    4
    5
    6
    7
    beeline> select map() as empty_map;
    +------------+
    | empty_map |
    +------------+
    | {} |
    +------------+
    1 row selected (0.583 seconds)

如何才能创建各种类型的map呢? 比如map<string, bigint>, map<string, boolean>, map<string, array<string>>

阅读全文 »

环境

  • spark 2.3.2

单机测试

  1. mongo version >= 3.2

    1
    spark-shell --packages org.mongodb.spark:mongo-spark-connector_2.11:2.3.2 
  2. mongo version < 3.2

  • 当 mongo 版本低于 3.2 会报错。
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    ERROR partitioner.DefaultMongoPartitioner:
    ----------------------------------------
    WARNING: MongoDB version < 3.2 detected.
    ----------------------------------------
    With legacy MongoDB installations you will need to explicitly configure the Spark Connector with a partitioner.
    This can be done by:
    * Setting a "spark.mongodb.input.partitioner" in SparkConf.
    * Setting in the "partitioner" parameter in ReadConfig.
    * Passing the "partitioner" option to the DataFrameReader.
    The following Partitioners are available:
    * MongoShardedPartitioner - for sharded clusters, requires read access to the config database.
    * MongoSplitVectorPartitioner - for single nodes or replicaSets. Utilises the SplitVector command on the primary.
    * MongoPaginateByCountPartitioner - creates a specific number of partitions. Slow as requires a query for every partition.
    * MongoPaginateBySizePartitioner - creates partitions based on data size. Slow as requires a query for every partition.
    阅读全文 »

spark.yarn.executor.memoryOverhead

ExecutorLostFailure (executor 52 exited caused by one of the running tasks) Reason: Container killed by YARN for exceeding memory limits. 11.0 GB of 11 GB physical memory used. Consider boosting spark.yarn.executor.memoryOverhead.

emoryOverhead是JVM进程中除Java堆以外占用的空间大小,包括方法区(永久代)、Java虚拟机栈、本地方法栈、JVM进程本身所用的内存、直接内存(Direct Memory)等。 通过spark.yarn.executor.memoryOverhead设置,单位MB。如果Java堆或者永久代的内存不足,则会产生各种OOM异常,executor会被结束。 在Java堆以外的JVM进程内存占用较多的情况下,应该将MemoryOverhead设置为一个足够大的值,以防JVM进程因实际占用的内存超标而被kill。

  • spark-submit --conf spark.yarn.executor.memoryOverhead=10G
  • spark里面设置 `spark.conf.set("spark.yarn.executor.memoryOverhead", "10G")

spark.sql.caseSensitive

spark在读取json时候spark.read.json(dataPath).toDF()会自动inferschema(推断类型),可能有些json的key写的不标准,比如同时存在Uid和uid就会解析错误。

  • 在spark程序里面设置 spark.conf.set(“spark.sql.caseSensitive”, “true”)

spark.sql.shuffle.partitions

数据倾斜的时候,通过设置distribute by task numer, 重新shuffle数据均衡

  • spark.conf.set(“spark.sql.shuffle.partitions”, 800)
  • spark.conf.set(“spark.default.parallelism”, 800)

spark.sql.parquet.compression.codec

lzo压缩文件spark自动解压

  • spark.conf.set(“spark.sql.parquet.compression.codec”, “lzo”)

设置spark.driver.extraJavaOptions -Dhdp.version

Exception in thread “main” java.lang.IllegalStateException: hdp.version is not set while running Spark under HDP

  • spark.conf.set(“spark.driver.extraJavaOptions -Dhdp.version”, “3.1.0.0-78”)
  • spark.conf.set(“spark.yarn.am.extraJavaOptions -Dhdp.version”, “3.1.0.0-78”)
    以上均可以通过--conf设置