A machine learning package built for humans.
aerosolve
面向人类的机器学习库。
它是什么?
aerosolve是一款从零开始设计的、注重人性化的机器学习库。与其他机器学习库相比,它的不同之处在于:
- 基于Thrift的特征表示法,支持对偶排名损失和单上下文多物品表示。
该库适用于稀疏、可解释的特征,如在搜索(关键词、过滤器)或定价(房间数量、位置、价格)中常见的特征。对于具有非常密集且不易于人理解的特征的问题,如原始像素或音频样本,它不太适用。
关注可解释性的原因包括:
- 当你的语料库是新的并且未完全定义时,你需要更多地了解你的数据集。
- 拥有可解释的模型让你能快速迭代。找出模型最不同意的地方,并洞察需要哪种新特征。
- 调试嘈杂的特征。通过绘制特征权重图,你可以发现错误的特征,或者拟合样条来发现出乎意料复杂度的特征(通常表明过拟合)。
- 你可以发现不同变量与目标预测之间的关系。例如,在Airbnb需求模型中,绘制评论数和3星评论的图表比许多嵌套的if-then-else规则更易于理解。

如何开始?
aerosolve的工件托管在bintray上。如果你使用Maven、SBT或Gradle,只需将bintray指向仓库即可自动获取工件。
查看图像印象主义演示,学习如何教算法以点彩画风作画。 图像印象主义演示。
还有一个基于流行机器学习基准的收入预测演示。 收入预测演示。
特征表示法
这一部分深入探讨了基于Thrift的特征表示法。
特征被组织到逻辑组中,称为特征家族。这样做的原因是允许一次性表达对整个特征家族的转换,或将两个不同的特征家族相互作用以创建新的特征家族。
每个FeatureVector包含以下三种类型的特征:
- stringFeatures - 这是从特征家族映射到二进制特征字符串的映射。例如 "GEO" -> { "San Francisco", "CA", "USA" }
- floatFeatures - 这是从特征家族映射到特征名称及其值的映射。例如 "LOC" -> { "Latitude" : 37.75, "Longitude" : -122.43 }
- denseFeatures - 这是从特征家族映射到浮点数数组的映射。主要用于图像内容分析代码。
示例表示法
示例是创建训练数据和评分的基本单位。 一个单一的示例由以下组成:
- 上下文 - 这是一个仅出现一次的
FeatureVector,可能是代表搜索会话的特征。例如 "Keyword" -> "Free parking"- 示例(0..N) - 这是一系列表示要评分的项目的
FeatureVector列表。这些可以对应于搜索会话中的文档。例如 "LISTING CITY" -> "San Francisco"
- 示例(0..N) - 这是一系列表示要评分的项目的
采用这种结构的原因包括:
- 对数百个项目只有一个上下文可以在RPC期间甚至在磁盘上节省大量空间。
- 只需计算一次上下文的转换,然后将转换后的上下文与每个项目一起重复应用。
- 具有一列项允许使用基于列表的损失函数,如对偶排名损失、支配损失等,其中我们同时评估多个项目。
特征转换语言
这部分深入讨论了特征转换语言。
特征转换是在独立的转换器模块上执行的,与模型解耦。这使用户能够分解转换,或在评分之前预先转换数据。例如,在应用程序中,可能预先转换语料库中的项目并存储,而上下文直到运行时才为人所知。然后在运行时,可以转换上下文并与每个转换的项目相结合,得到最终的特征向量,然后输入模型。
特征转换允许我们在运行时修改FeatureVector。这使工程师能够快速迭代特征工程,以一种受控的方式进行。
以下是一些常用的特征转换示例:
- 列表转换。元转换,指定其他转换应用。
请参阅相应的单元测试,了解这些转换的作用、它们操作的特征类型以及它们期望的配置。
模型
本节介绍的是可调试模型,它们位于Airbnb的aerosolve项目中。
尽管模型目录中包含多个模型,但只有两个主要的可调试模型。其余的要么是实验性的,要么是为可解释模型创建转换的子模型。
线性模型:
支持间隔损失、逻辑回归、ε不敏感回归和排名损失函数。
只操作字符串特征。
任务标签存储在一个特殊的特征族中,由配置中的rank_key指定。
请参考线性模型单元测试来了解如何设置模型。
需要注意的是,结合量化和交叉运算,“线性”模型可以实现极高的复杂度,并非普通的线性模型,而是更为复杂的结构,可以想象为一棵具有数百万分支的广叉、非常宽的决策树。
样条模型:
一个通用的加性分段线性样条模型。
训练在由特征范围的最小值和最大值之间设定的较高分辨率num_buckets下完成。
每轮迭代结束后,我们尝试将线性分段样条投影到低维度的函数,如带有Diracδ端点的多项式样条。
如果投影的均方根误差(RMSE)超过阈值,则保留高分辨率的分段线性模式不变。
这使得我们可以对存在错误或者异常复杂(例如,当我们期望平滑时出现跳跃)的特征进行样条模型的调试。
- 增强型树桩模型:小型紧凑模型,不太易于解释,但在小规模情况下可用于特征选择。
- 决策树模型:仅在内存中使用,主要用于生成线性或样条模型的转换。
- 最大激活神经网络模型:实验性质,主要用作比较基准。
集成开发环境(IDE)
如果你使用IntelliJ,首先尝试构建项目,以便可用Thrift类,并解决IntelliJ内部的Spark编译错误。在IntelliJ中,按command+;然后点击“依赖”,将相关文件从“test”更改为“compile”,如org.apache.spark和org.apache.hadoop:hadoop-common。
我们将Gradle配置保留在“testCompile”,以减小程序jar文件大小。
支持
实际应用
使用aerosolve的组织和项目可以在此处列出自己的信息。