深入浅出推荐系统(七):水源木本--特征工程

在介绍排序算法之前,我们先来谈一谈召回与排序模型的通用基础建设–特征工程。早期如LR、树模型等排序算法,对于特征十分依赖,尽管现在深度学习所谓端到端的训练大行其道,但特征仍然有着独特的作用:特征的选取,特征的处理方式,组合方式,依然会深刻影响到模型的性能,特征工程可谓是模型训练的水之源、木之本,任何一个好的模型,一定是建构在丰富而显著的特征之上。

特征工程简介

什么是特征工程

特征工程的定义,借用维基百科上的说法:

Feature engineering or feature extraction or feature discovery is the process of using domain knowledge to extract features (characteristics, properties, attributes) from raw data. The motivation is to use these extra features to improve the quality of results from a machine learning process, compared with supplying only the raw data to the machine learning process.

笔者的理解:特征工程就是使用领域知识对原始数据进行处理,将其加工成特征,使得机器学习的结果得到质量上的提升。

特征工程是技术中的艺术,如果把机器学习比作做饭,原始数据就好像原始食材,没法直接放锅里去煮,特征工程就是备菜的过程。清洗、加工、切菜、腌制等操作决定了做出的菜是否美味。而这个加工的过程,是切段还是切丝,是盐卤还是酱腌,就看厨师心中之丘壑了。

特征工程的意义

美国计算机科学家,来自Google的Peter Norvig说过两句名言:我们不是算法很牛,我们只是数据超多;超多的数据可以打败优秀的算法,但是好的数据会更胜过超多的数据。这两句话分别说明了海量数据与特征工程的重要性。

好特征的优点在于:使用简单的模型,也能取得非常好的性能。简单的模型意味着易于理解和维护,且线上响应速度也更快。某些业务(如风控)要求模型具有可解释性,这种情况下,好特征在整个模型中所起到的作用是举足轻重的。可以说模型是否表现优异,基本取决于特征的区分能力。

即使对于深度学习盛行的推荐系统,如果认为可以不关注特征,只是把模型当做一个黑盒,胡乱塞入大量特征,不知道效果为什么好或为什么坏,那么最后就会让人经常怀疑人生。实际上,无论使用传统机器学习还是深度学习,数据敏感度都是非常重要的,对于数据要有充分的理解,重视case分析,明白使用的数据是否适合,才能够更好地构建模型。

特征工程的子领域

特征工程的整个流程包含了几个部分:特征处理、特征选择、降维等。我们来分别看一看。

特征处理

特征处理包含缺失值处理、无量纲化、特征编码、统计变换等方面。

  1. 缺失值处理:在实践场景中,存在由于权限或其他原因无法获取某些数据,或数据在处理过程中发生丢失的情况,因此,数据中经常会含有缺失值。如果缺失值超过80%,则应舍弃该特征。一般情况下,缺失值通常使用“NaN”来表示,由于该值不是数值,在对数据进行整体处理时(如加和或者取平均),会遭遇很多不便。一般常用“0”、平均值、众数或中位数来填充缺失值。但后三者意味着改变了数据分布,当计算新生成的数据的平均值时,新的平均值与原平均值会发生较大差异。对缺失值的填充方法,要基于对业务数据的理解进行。
  2. 数据无量纲化:对于连续型数值,不同的数据规格不同,如常见年龄在10-80之间分布,而某商品的浏览次数可能在0-10000之间分布,特征的量纲不统一,就无法放到一起比较,除了树模型,大部分模型不能很好地处理量纲不同的数据,因此需要对数据进行无量纲化处理。无量纲化的方式包括:
    1. 归一化:其公式为 x ′ = x − m i n ( x ) m a x ( x ) − m i n ( x ) x' = \frac{x - min(x)}{max(x) - min(x)} x=max(x)min(x)xmin(x),它将原数值缩放到[0,1]之间。归一化的稳定性不够好,因为最大值最小值不稳定,还可能是异常点,从而使得归一化后的数据分布在一个狭窄的区间内。

    2. 标准化:通常假设数据符合高斯分布,采用z-score公式对数据进行标准化: z i ~ = x i − x ˉ σ \tilde{z_i} = \frac{x_i - \bar x}{\sigma} zi~=σxixˉ,即x减去均值除以标准差。标准化后数据表示的是距离均值差距几个标准差。

      归一化是将数据转化到[0,1]之间,而标准化则是将数据转化进同一分布中来表达。不同的场景需要考虑不同的无量纲化方法:如果对输出数据范围有要求,则使用归一化(标准化不保证数据的最大最小值);如果数据噪音和异常点较多,则使用标准化;数据表现稳定的话,则两者皆可。

      对于不同的模型:一般来说,神经网络会使用标准化,虽然神经网络并不在意量纲是否统一,但标准化后的特征有利于各特征值上梯度均匀下降,从而加快网络训练;对于逻辑回归,则需要关注业务场景和模型处理方式,在风控这种需要可解释性的领域,特征需要归一化。而应用逻辑回归的其他场景中,需要考虑是否使用了正则(有正则则需要标准化,无正则则是否标准化都没有影响:因为有正则的情况下,参数大小与损失值有关,所以必须要先统一量纲,以保证参数均匀分布)。

  3. 特征编码:类别特征在模型中无法处理,因此需要数值化的编码。编码的方式有很多,像序数编码、one-hot编码、特征哈希、基于统计的编码、基于目标target的编码等等。实践中较为常用的是one-hot编码,也称独热编码。它以类别的个数为基数,将特征值展开成0、1表达:如天气有三种取值:晴天、雨天、阴天,则可以用001表示晴天、010表示雨天、100表示阴天。one-hot的好处是天然对特征进行了数值化表达,且进行了无量纲化处理,同时拓展了模型的非线性能力(如天气特征需要有三个权重);但其缺点也很明显,就是空间过大(一般会进行降维处理,详见下文),且无法表达特征之间的交互关系。不过,如果不知道使用什么编码方式,一般都采用one-hot的编码。另外,WOE也是一种常见编码方式,它将特征分割成若干个空间,每个空间中,目标值的好坏比都有明显不同,从而使得编码后的特征值具有良好区分度,该编码方式通常应用在风控领域中。
  4. 统计变换:正态化的分布则有利于模型训练,使得梯度能够均匀下降从而加快训练速度。有些数据呈现长尾分布的状态,与正态分布相去甚远,在无量纲化之前,可以先进行单调的统计变换,其目的是减轻数据倾斜的影响,使原本密集的数据尽量分散,而过于分散的数据则能尽量聚合。实践中常见变换有log变换,box-cox变换等,前者尽量缩小极值引发的大方差,后者则对非正态分布进行改善,优化其对称性和方差,使其分布趋于正态化,在python中可以直接调取相关的api进行处理(scipy.stats.boxcox)。

特征选择

特征选择是根据一些指标对特征进行筛选。虽然深度学习可以将特征一股脑塞进模型,但实践上来说,使用经过挑选的特征,可以减少模型的计算成本,使模型表现出更优越的性能,且能减少模型过拟合的风险。

特征选择主要考察特征的几个特性:1、覆盖率:要保证特征覆盖率足够高,如果有大量缺失值则不适合采用;2、特征发散程度:如果特征不发散,即方差接近0,说明特征变化较小,区分力不够;3、特征与样本的相关性:即考察特征对样本的区分能力。

在一些算法比赛中,由于追求模型的极致性能,对特征的选择也会力臻完美。特征选择方法可以分为3大类:filter方法、Wrapper方法、Embedded方法。

  1. filter:过滤法,运用统计指标来为每个特征打分并筛选特征。其优点是计算快,不依赖于具体的模型,缺点是选择的统计指标不是为特定模型定制的,因而对模型的加成可能不高,且验证的是单变量特征,没有考虑特征间的相互关系。filter方法有很多:

    1. 方差选择法,它检查变量内部的变化情况,尽量选择方差大的特征(这种方法不考虑目标,无法验证变量对于目标的区分力);

    2. 相关系数法,计算Pearson相关系数,通常用于连续变量,值越高说明特征与目标相关性越高;Pearson相关系数公式为:
      C O R ( X , Y ) = ∑ i = 1 n ( X i − X ‾ ) ( Y i − Y ‾ ) ∑ i = 1 n ( X i − X ‾ ) 2 ∑ i = 1 n ( Y i − Y ‾ ) 2 COR(X,Y) = \frac{\sum_{i = 1}^{n}(X_i - \overline{X})(Y_i - \overline{Y})}{\sqrt{\sum_{i = 1}^{n}(X_i - \overline{X})^2\sum_{i = 1}^{n}(Y_i - \overline{Y})^2}} COR(X,Y)=i=1n(XiX)2i=1n(YiY)2 i=1n(XiX)(YiY)
      皮尔逊相关系数实际是两个分布的协方差的变形,对其进行了无量纲化处理。其值在[-1,1]之间分布,0到1表示X与Y正相关,1表示两者完全线性相关,可以在二维坐标系上使用直线描绘出来;-1到0表示X与Y负相关,-1表示两者完全负相关。

    3. 卡方检验法:卡方检验的实质是计算自变量与因变量的相关性,通常用于离散型特征。卡方检验属于统计学内容,只讲理论不太好理解,我们举例看看它是如何计算的:假设目标是时尚类文章看过后是否点赞,特征为用户性别。有如下统计信息:

      是否点赞\性别合计
      100600700
      200100300
      合计3007001000

      该特征与变量的独立性检验假设如下:
      零假设 ( H 0 H_0 H0):时尚类文章被点赞与用户性别独立
      备选假设 ( H 1 H_1 H1) :时尚类文章被点赞与用户性别不独立
      如果零假设成立,则时尚类文章被点赞的概率A和用户性别概率B互相独立,根据贝叶斯原理,有P(A,B) = P(A)*P(B),计算独立假设下每个格子发生的频数,如左上角第一个格子(男性点赞),得到 N ∗ P ( A ) ∗ P ( B ) = 1000 ∗ 700 1000 ∗ 300 1000 = 210 N * P(A) * P(B) = 1000 * \frac{700}{1000} * \frac{300}{1000} = 210 NP(A)P(B)=100010007001000300=210,其他格子的计算依次类推,得到期望频数如下:

      是否点赞\性别合计
      210490700
      90210300
      合计3007001000

      有了这两个列表后,就可以计算检验统计量 χ 2 \chi^2 χ2 ( χ 2 \chi^2 χ2表示卡方值) , χ 2 \chi^2 χ2越大,表示观测值和期望值相差越大,当 χ 2 \chi^2 χ2大于某一个临界值时,就能获得统计显著性的结论:
      χ 2 = ∑ ( 观测频数 − 期望频数 ) 2 期望频数 = ∑ i = 1 r ∑ j = 1 c ( O i , j − E i , j ) 2 E i , j = 274.38 \chi^2 = \sum{\frac{(观测频数-期望频数)^2}{期望频数}}=\sum_{i=1}^{r}\sum_{j=1}^{c}{\frac{(O_{i,j} - E_{i,j})^2}{E_{i,j}}}=274.38 χ2=期望频数(观测频数期望频数)2=i=1rj=1cEi,j(Oi,jEi,j)2=274.38
      其中 O i , j O_{i,j} Oi,j 为观测频数, E i , j E_{i,j} Ei,j为期望频数,r为行数,c为列数,自由度df = (r-1) * (c-1) = 1,Font metrics not found for font: .服从卡方分布,查卡方分布表:

      df0.10.050.0250.010.005
      12.7063.8415.0246.6357.879
      24.6055.9917.3789.2110.597

      得到 𝑃 ( χ 2 > 7.879 ) < 0.005 𝑃(\chi^2>7.879)<0.005 P(χ2>7.879)<0.005,意味着原假设 H 0 H_0 H0成立概率小于0.005,因此拒绝原假设。即特征于样本目标不独立。该特征可以看作有效特征。
      当然实践过程中不需要如此费力地计算卡方值,直接调用python中的sklearn.feature_selection.chi2包即可。卡方检验在风控领域里也颇为常用。一般用于检验分段后的特征值与目标值的相关情况,也可进一步用于分段后的值再次合并(如某些相邻值合并后有较大卡方值,则可以合并,这样可以增加特征的鲁棒性,降低过拟合的风险)。

    4. 互信息法,互信息考察的是特征对于帮助样本进行分类所能贡献的额外信息量,其公式如下:
      I ( Y ; X ) = ∑ y i ∈ Y ∑ x i ∈ X P ( X = x i , Y = y i ) l o g 2 P ( X = x i , Y = y i ) P ( X = x i ) P ( Y = y i ) I(Y;X)=\sum_{y_{i}\in Y}\sum_{x_{i} \in X} {P(X=x_{i}, Y=y_{i})log_{2}\frac{P(X=x_{i}, Y=y_{i})}{P(X=x_{i}) P(Y=y_{i})}} I(Y;X)=yiYxiXP(X=xi,Y=yi)log2P(X=xi)P(Y=yi)P(X=xi,Y=yi)
      如果x和y是两个独立变量,则P(x,y) = P(x)P(y),该公式结果为0,因此若I(Y;X)越大,则表示两个变量相关性越大,于是可以用互信息来筛选特征。

    互信息通常用于离散变量的筛选,如果是连续型变量,则需要对特征进行离散化。事实上,决策树在分裂过程中的特征选择,正是使用了互信息的方式(决策树中称为信息增益)。

    对于互信息法来说,变量取值越多,对数据划分越细,划分能力越强,提供的信息增益也就越多,因此越容易被互信息法选取到;而卡方检验则正相反,会倾向于给较少值的特征以较高分数。在实践中,对离散特征选择时,互信息法更为常用一些。

  2. Wrapper:包裹法。与过滤法不同,包裹法是与模型相关的。它以最终模型为基准,来测试不同的特征是否能够为模型带来增益。

    包裹法的常见实现是递归特征消除法(Recursive Feature Elimation,简称RFE)。经过基线模型每轮训练后,会消除若干重要程度低的特征,再基于新的特征集进行下一轮训练。在特征集合上不断的重复递归这个步骤,直到最终达到所需要的特征数量为止。

    从模型效果来看,包裹法显然要优于过滤法。但是该方法计算开销过大,对于深度学习来说,几乎是不可接受的。即使对于一般模型,也要设置停止条件控制参数。

  3. Embedded:嵌入法。嵌入法的意思是将特征选择嵌入到算法中去,由模型自行选择特征。常见的嵌入法有以下方法:

    1. 在逻辑回归(LR)中,使用L1正则来进行自动化的特征选择,L1正则通过惩罚绝对值过大的权重,从而让所有特征系数趋向0,有一些特征会先变成0,则这些特征可以剔除。调用python中的sklearn相关包可以实现L1正则筛选特征。
      from sklearn.linear_model import LogisticRegression as LR
      from sklearn.feature_selection import SelectFromModel
      lr = LR(penalty="l1", solver="liblinear", C=0.5, max_iter=1000)
      model = SelectFromModel(lr, prefit=True)
      X_new = model.transform(X)
      
    2. 基于树模型的特征选择:常见的方法有决策树、随机森林、GBDT等,其本质也是通过信息增益的方式来选择相关性高的特征。同样可以使用上面的SelectFromModel来选择重要特征。
      from sklearn.ensemble import RandomForestClassifier as RFC
      from sklearn.feature_selection import SelectFromModel
      rfc = RFC(n_estimators = 10,random_state = 0)
      rfc = rfc.fit(X, y)
      rfc.feature_importances_  
      model = SelectFromModel(rfc, prefit=True)
      X_new = model.transform(X)
      

    可以看出,相较于过滤法,嵌入法与模型高度相关,效果更好,相较于包裹法,其速度更快。这些方法可以联合使用,实践上来讲,当数据量很大的时候,考虑运行速度,一般会先采用过滤法进行过滤,接着使用另外两种方法进一步筛选。使用逻辑回归或树模型时,优先使用嵌入法。模型计算量不大(如支持向量机)的情况下,可以考虑使用包裹法。事实上,由于推荐系统特征量多,数据量大,一般使用spark或hive来处理数据,工程实践中,过滤法是最为常用的方式。

降维

当特征选择完成后,可以直接训练模型了。但是由于特征矩阵过大,仍然会存在计算量大的问题,像前面的onehot编码,对于类别类特征,若类别取值数量巨大,则会导致训练时间过长。因此对特征矩阵进行降维处理,也是必不可少的方法。

除了前面所述,通过特征选择的方法进行降维,其他常见的方法就是主成分分析法(PCA)和线性判别分析(LDA)。注意这里的LDA不同于我们在前面章节《深入浅出推荐系统(二):召回:内容为王》中讲到的LDA,在前面文章中所述LDA为隐含狄利克雷分布,用于文档的主题化分解。

PCA与LDA经常被共同提及,因为两者有颇多相似点,本质都是将数据从高维稀疏向量映射到低维空间的稠密向量。但PCA和LDA的映射方式不一样:PCA是一种无监督的降维方法,目标是让映射后的样本具有最大的发散性;而LDA是一种有监督的降维方法,目标是让映射后的样本有最好的分类性能。两者本质差异在于是内部比较,还是根据外部标准进行训练,可以类比前面我们在特征选择-过滤法中所讲的方差选择法和相关系数法。
在这里插入图片描述

上图是用PCA和LDA分别作投影,相似的两类数据,不同方法选择的投影方向完全不同。PCA和LDA都可以使用sklearn包来完成。以下代码分别是将原始数据通过PCA和LDA降为2维数据。

from sklearn.decomposition import PCA
from sklearn.datasets import load_iris
 
#导入IRIS数据集
iris = load_iris()
newX = PCA(n_components=2).fit_transform(iris.data)
from sklearn.lda import LDA
newX = LDA(n_components=2).fit_transform(iris.data, iris.target)

除了PCA和LDA,深度学习中,对原始数据进行embedding,是颇为常见的一种降维方式。与PCA和LDA不同,Embedding可以参与整个模型的训练。初始化时对原始onehot编码进行低维映射,并在神经网络的反向传播中对其进行训练。

衍生特征

上一节所述的各类特征处理选择方法是一般特征工程常见手段,实践中,还包含特征的衍生操作。

常见衍生特征为数学变换操作。比如对于两个特征X,Y,可以衍生出许多组合:X与Y的加减乘除;按Y分组衍生出count(X),sum(X), avg(X),median(X),uniqueN(X),most(X)(众数),min(X),max(X),以及以上各类计算的加减乘除;反过来以X分组亦可如此衍生。这些衍生特征可以通过特征选择方法进行选择,去除无用特征,留下有区分力的特征。

基于业务理解构造出来的人工特征往往具有较好的区分能力。一般先思考业务逻辑,探查基础数据,在此基础上进行合理想象,构造出合适的人工特征。这类特征可解释性强,且具有较好的模型拟合能力和泛化能力。举个例子:笔者之前做过风控系统,由于金融业务是嵌入在应用APP中(APP主营业务非金融),一般用户在使用APP的时候会偶然发现贷款申请模块而进行申请,欺诈或黑产等非正常用户在平时很少使用该APP,但为了申请贷款会反复访问,因此如果能判断用户是近期频繁访问、还是均匀访问该APP,可能是个很重要的特征,笔者基于这样的思考,构建出一个特征:最近一段时间内用户访问日期的中位数距离申请时点的天数,其iv值在许多弱特征中脱颖而出。

基于业务理解构造出的特征有诸多好处,但也存在需要大量人力参与,且容易遗漏强特征的缺点,需要与其他特征衍生方法结合使用。

特征交叉也是常见特征衍生的一种方式,特征交叉也叫特征组合。通过特征的交叉组合,可以挖掘出特征的非线性关系。特征交叉的思想很简单,通过将单独的特征进行组合(相乘或求笛卡尔积)而形成的合成特征。比如属性X有四个特征,属性Y有三个特征,笛卡尔积后就有十二个组合特征,然后用one hot或其他embedding方式给新的特征编码。最典型的如:性别和年龄的交叉、经度和纬度的交叉、时间和城市的交叉,等等。之前笔者在做广告系统中,考虑到不同业务类型在平日与周末的浏览点击水平大不相同,因此构造出时间与业务品类的交叉特征,对模型提升帮助很大。但是暴力特征交叉可能会出现特征稀疏的问题。FM、FMM等模型可以解决这类问题,这个我们在稍后的排序模型中再进行详细讲解。

特征获取

讲完了特征工程的子领域,我们来从特征的获取、监控等角度来聊一聊。

特征往往是依赖于基础数据而存在,特征的获取来自于底层数据,推荐系统特征获取,从数据角度考虑主要有三个方向:用户注册时填写的内容信息,平台中内容上报时填写的属性信息,用户在平台内产生的各种行为信息。业务上说,可以从人、货、场三个方向去思考,“人”是指用户,主要包含用户注册信息、用户交互行为;货是指物品,为平台中内容上报的属性信息,以及用户操作的行为集合;场是指人与货交互时的上下文环境,通常由平台上报打点获取。

一些特殊数据还可能涉及跨部门调取,甚至是第三方购买。笔者之前做过O2O的广告推送,使用天气数据,就采用了跨部门的调取方案。因为其他部门对天气较为关注,因而专门存储了天气数据和相关服务,相对可靠,直接拿来使用,省去了获取和维护的精力。

特征的数据获取上,离线模型通常使用存储在HDFS上的数据来获取相应特征,使用MapReduce,Spark等处理工具来处理海量的数据;模型线上预测时,比较注重获取数据的延时,这时不能再使用hdfs来获取特征。这种情况下一般将特征存储在如redis、tair、mysql等分布式的数据库中,供线上加载。具体使用哪种数据库,需要考虑业务体量、响应速度、数据库本身稳定性以及公司的技术栈等。

特征监控

特征的稳定性对于模型预测有显著影响。如果线上特征出现缺失、滞后等问题,导致模型预测不准,在问题出现时较难排查。因此对于特征进行监控很有必要。在大公司里,通常有专门的平台进行数据监控,可以将特征监控纳入其中。而小型公司中,可以考虑使用开源的数据监控系统,如Grafana或美团点评的CAT等。

特征监控主要监控如下指标:

  • 覆盖率:当由于上游数据变动(如打点升级、版本更新等)导致特征发生覆盖异常,能够及时监控到特征的变化。通常实时订阅特征覆盖样本的比例,以保证能探查到覆盖突然变化的情况;
  • 异常值:特征中如果出现异常值,可能会干扰模型预测结果,需要对异常值进行监控以便进行实时分析。
  • 时效性:特征的时效性对于模型预测具有重要意义,如果特征延迟过久,导致特征到达时已超过一定时间,往往回对模型预估的精度产生负向影响。如用户的瞬时兴趣可能会经常变化,晚十几分钟的兴趣捕获,可能带来的效果完全不同。笔者早期做用户搜索关键词相关的广告投放,当时使用spark streaming来处理用户实时搜索行为,由于资源较少,计算任务堆积,导致实际灌入Redis的用户兴趣已经过去很久,解决了资源问题后,模型效果产生了一定的提升。

除了基本指标的监控,如有必要,也可以对特征与模型的相关性进行监控。分析指标包括但不限于:特征与模型label的交叉熵、信息增益、KL散度、互信息、特征的Shapley值等。不过一般推荐系统里这类监控并不常见,此处不再展开介绍,有兴趣的同学可以深入了解这几些指标。

特征一致性

特征一致性并不算是特征工程的领域知识,这里单独拉出一节介绍,是因为在实践过程中,经常会遇到这类问题:模型在线下运行良好,有很高的AUC,但是上线后的ABtest却并不尽如人意。通常情况下,有经验的工程师会首先排查报表打点是否有异、模型上线加载是否成功等,其次就会排查特征在线上线下的一致性。

特征一致性的保证通常包括几个方面:

  1. 特征处理方式的一致性:针对同样的特征输入,离线训练和在线预估的处理方式并不相同。抽取方法的差异会导致特征的不同。解决方法一般是离线和在线共用同一套特征抽取框架(比如将处理方式封装成jar包,离线在线共用一套)。更细致的要求下,在模型上线前,生成一批一致性样本,使用离线和在线模型分别打分,当分数差小于一定阈值,则算一致性通过。
  2. 特征一致性检查:模型上线后,为保证特征一致性,一般会对线上获取的特征进行抽样并通过实时流落下来,最后存储在hdfs上,与当天的离线特征进行对比校验。这样可以保证出现问题后,能够快速检查特征是否存在一致性问题。
  3. 线上监控体系的搭建:特征处理的一致性确认后,还要保证线上特征来源无故障。线上特征可能来自于多个地方,redis、实时请求、rpc服务等,不像离线特征那样集中,其中任何一个环节出问题,都有可能导致特征取不到而影响模型准确性。因此需要对线上服务的每个特征都建立起相关监控,包括特征特征空值率、获取时延、取值分布等,模型预估出问题时,可以快速排查特征问题。
  4. 特征更新的时效性:特征按照时效级别,有长期、天级、小时级和实时特征。实时特征一般是线上请求时直接获取,而小时级别特征通常是由实时任务计算获取灌入相关的kv存储,如果灌入不及时,也会导致模型计算出现偏差。笔者之前在创业公司做推荐系统,曾遇到过类似问题,模型在某天效果突然下降,经排查发现是离线spark任务调度失败,导致用户特征两天没有灌入redis,由于当时没有监控系统,所以并没有及时发现。这种情况,一般可抽取样本来观察灌入数据时效性是否符合需求。
  5. 模型线上效果与线下评估不一致,还有可能是模型服务的问题。在检查特征一致性问题时,也需要关注模型服务的情况。比如模型服务的超时情况、模型可用性以及模型更新的时效等。笔者之前在做广告系统粗排的时候,刚刚上线观察实验效果奇差,通过监控平台发现服务响应的95线已被严重拉长,紧急下线后推测是模型计算开销太大导致,后来经过多轮优化,加入各种缓存,保证计算的性能开销在可承受范围内,再次上线后模型效果回复正向。

总之,特征一致性虽然在特征工程理论及一般模型比赛中很少被提及,但是在实践过程中却是影响模型线上效果的非常重要的一部分,因此在线上测试时需要给予特别关注。

总结一下,本文对特征工程进行了梳理,阐明了特征工程为何如此重要,并介绍了对特征进行处理的常见方法、特征选择的常见方法、特征的获取与监控、以及特征一致性该如何做,等相关内容。囿于笔者有限的经验,可能对某些知识的介绍有错误疏漏之处,请读者们不吝提出,也欢迎对这个领域有兴趣的同学留言进一步探讨。

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
本教程为官方授权出品伴随着大数据时代的到来,作为发掘数据规律的重要手段,机器学习已经受到了越来越多的关注。而作为机器学习算法在大数据上的典型应用,推荐系统已成为各行业互联网公司营销体系中不可或缺的一部分,而且已经带来了真实可见的收益。目前,推荐系统和机器学习已经成为各大公司的发力重点,众多知名公司(如亚马逊、netflix、facebook、阿里巴巴、京东、腾讯、新浪、头条等)都在着眼于将蕴含在庞大数据中的宝藏发掘出来,懂机器学习算法的大数据工程师也成为了新时代最紧缺的人才。精心打造出了机器学习与推荐系统课程,将机器学习理论与推荐系统项目实战并重,对机器学习和推荐系统基础知识做了系统的梳理和阐述,并通过电影推荐网站的具体项目进行了实战演练,为有志于增加大数据项目经验、扩展机器学习发展方向的工程师提供更好的学习平台。本课程主要分为两部分,机器学习和推荐系统基础,与电影推荐系统项目实战。第一部分主要是机器学习和推荐系统基础理论的讲解,涉及到各种重要概念和基础算法,并对一些算法用Python做了实现;第二部分以电影网站作为业务应用场景,介绍推荐系统的开发实战。其中包括了如统计推荐、基于LFM的离线推荐、基于模型的实时推荐、基于内容的推荐等多个模块的代码实现,并与各种工具进行整合互接,构成完整的项目应用。通过理论和实际的紧密结合,可以使学员对推荐系统这一大数据应用有充分的认识和理解,在项目实战中对大数据的相关工具和知识做系统的回顾,并且可以掌握基本算法,入门机器学习这一前沿领域,为未来发展提供更多的选择,打开通向算法工程师的大门。谁适合学:1. 有一定的 Java、Scala 基础,希望了解大数据应用方向的编程人员2. 有 Java、Scala 开发经验,了解大数据相关知识,希望增加项目经验的开发人员3. 有较好的数学基础,希望学习机器学习和推荐系统相关算法的求职人员

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值