00:00
好,那么我们接着给大家看一张图,这张图是基于内容推荐系统的一个高层次结构,有了这张图的话,大家其实就可以对整个推荐系统它的运行,它的整体的架构有一定的理解了,呃,大家可以看一眼啊,我们源头是不是在左下角这个信息源这里,对信息源这就是我们的数据了,数据源大家可以看到,这里边是不是就有很多物品描述信息啊,去做一些内容分析,那内容分析主要是干什么呢?大家可以认为这就是一个数据的预处理,就是先做一些结构化的调整,对吧?把一些数据转变成我们想要想要得到的一些数据,那这一部分其实也可以作为后面要讲到的特征工程的一部分来作为处理,就是提取出想要的特征,呃,然后我们得到的就应该是一个结构化的物品描述。那有了这样的物品描述之后,大家可以想到这其实就是已经有了基本的一些就是模型的输入参数了,对不对,我们的X就有了,对吧?然后接下来我们可以把它输入到一个特征学习器里面去,那么特征学习器主要是干什么的?那就是要构建一个模型,然后收集到我们物品的信息,然后也要对应到用户的一些偏好数据,把它们结合起来,看看什么样的物品对应的这个特征能够。
01:32
匹配到相对应的用户对不对,就是这样的一个过程,所以大家看,如果我们已经有了这样的一个特征学习器,那最后得到的其实就已经可以有物品的特征和用户的特征都可以得到了,对吧?通过我们这个特征学习就可以把物品的内容特征和用户的一些特征匹配起来,匹配起来之后,那得到的这个描述信息我们就可以给到过滤组件,相当于是做这个呃,Filter的对吧,或者说是按照他们在特征空间的那种匹配度,就是你是不是一个文艺青年,我就给你匹配一个文艺片啊,是不是就是这样的一个过程啊,前面我们相当于内容分析得到这个物品信息的时候,然后在做这个特征学习之后,我们就会发现,诶,这个文艺片应该推荐给文艺青年,那么有了这个规则,我们进入到过滤组件就可以得到。
02:32
找一个推荐列表对吧,得到推荐列表之后其实还没有完,对于大家来来讲,可能我们觉得推荐系统嘛,得到这个推荐列表完事了,推出来了,事实上我们是不是还应该有一个反馈,有一个评估啊,所以得到推荐列表之后,再把它推给到当前用户,那么用户是不是应该会有一些行为数据作为反馈啊,所以大家看到这里其实基于内容,他也不是不考虑用户的行为,而是把用户行为是不是作为反馈来来考虑进来啊,所以我们收集到这些用户的行为反馈之后,反过来输入到这个特征学习这一部分模块里边,我们是不是就可以评价之前的模型到底好不好,你学习的到底准不准,对不对?诶是不是我给文艺青年推了一个文艺片,然后他真的就点击真的就观看,还给了个好评,那如果是这样的话,我们这个参数就就没问题,如果不是我们是不是这里应该做一些调整啊模型。
03:32
来做一些改变,所以这就是整个基于内容融的一个高层次结构推荐系统。好,那接下来刚才其实我们已经提到,就是从这个信息源得到特征物品特征的这个过程,其实是要对数据做很多处理的,对吧?因为一开始我们的信息源可能得到的数据并不是直接能用的数据。好,那么我们还是继续看啊,接下来要给大家讲的这一部分是特征工程,特征工程这一部分首先我们看一下,就是一开始拿到的数据是什么,这个大家已经很熟悉了,这就是我们之前给大家举过的机器学习里边的例子啊,一开始拿到的数据是不是就是,哎,这是关于这个房房屋的一些数据,那我们最后想要得到的应该是一个什么东西呢?是不是应该对,应该是他是否可以售出这样一个一个最后的目标,或者说大家认为这是一个标签对不对?所以我们可以把它做一个划分,就是我们把。
04:37
用作训练时候,哎,输入的这些变量X,我们把它当做这个特征,这是我们用作判断的依据,对不对?然后我们把这个输出的变量Y当做我们的目标,或者说我们把它当做一个标签,对吧?有些文章里面会会说这个输出的是一个标签,那这个容易搞混,因为大家可能会认为特征,你如果在某种意义上说这是一个标签,是不是也可以啊,也可以认为特征是一个标签,所以我们这里就是把它明确的说,这个叫特征,这个叫目标,那我们整个的这个,呃,机器学习的过程,其实就是通过输入的特征要得到输出的这个目标,对不对啊,这就提取出来我们真正想要的那个标签了,然后再用标签跟用户的那个特征去做匹配,然后就可以得到这个推荐结果了,那我们现在的这个特征工程,它主要考量的是哪一部分呢?其实主要考量的是我们特征。
05:38
的这一部分内容对不对?呃,如果特征得到目标这一部分,这就是我们前面讲的机器学习那一部分了,所以我们接下来其实要给大家讲的是特征,特征是什么呢?直观的讲,数据里边抽取出来的对预测结果有用的那些信息是不是就是特征啊?所以我们这里边特征往往会提到有多少个特征,那有有几个特征是不是就是这里面有几个X啊,这个X其实就是我们收集到的数据的维度对不对啊?所以这里给出了一个定义,就是说它的个数就是数据的观测维度,那么特征工程主要是干什么的?
06:21
那当然就是跟特征有关系对吧?所以它主要就是要使用一些专门的知识和技巧进行数据的处理,大家可以认为就是相当于是一些前期的处理,对吧?呃,处理完了之后就是我们得到的这个特征,让它能够在机器学习算法里边发挥更好的作用,就能在输入给机器学习算法的时候,它能够发挥更好更好的效用,这是特征工程的一个目的,所以大家可以认为特征工程相当于是在我们模型之前做的一个事情,对不对,相当于他最后得到的这些特征是要输出给我们模型的,所以如果整体来看的话,前面我们用户画像的过程是不是也可以理解成一种特征工程啊,所以就是从大概念来看的话,大家可以认为它是一致的啊,就是我们特征工程这里边是用专门的一些处理手段去把物品的信息,或者说呃,用户的一些信息做一些处理,处理完了之。
07:21
后得到的特征能够直接输出给我们机器学习算法,让它去发挥更好的作用,那么特征工程一般包括什么呢?呃,第一步一般就是特征清洗,那所谓的清洗就是先采样,然后清洗一些异常样本,大家知道这就是呃,我们大数据处理里边往往拿到的数据,第一步要先做一些ETL工作,对不对啊,这个大家应该是已经接触过的,这个比也比较简单,我们就不讲了。然后接下来要做什么呢?要做特征处理和特征选择。呃,所以我们可能重点是给大家讲一讲这个特征处理的一些过程啊,特征选择的话,其实大家也可以想象得到它是要做什么的,特征选择就是我要去先提前先考量一下,因为你那个特征一开始的特征太多了,对不对?往往我们收集到的数据维度特别的多,那么我一开始可能要先考量一下,把那些不重要的,不必要的特征先砍掉,为什么呢?因为大家会想到不必要的特征如果放到我们的机器学习算法里边,是不是就有点类似于噪声一类的东西啊。
08:30
那如果说这些不必要的东西都放进去,我们学出来是不是很容易过拟合,把噪声学了就很容易过拟合,所以我们一开始可能就先去做一个特征处理和特征选择,那特征处理主要就是说大家可能想到的标准化,归一化,把数据做一个处理对不对?那特征选择主要就是说一般是两方面的考量啊,就是首先数据是否发散,那一般就用这个,呃,样本的方差呀,或者是相关系数去做一个考量,为什么呢?呃,但大家可能会想到就是如果说一个特征,所有的数据里边的这个特征取值都差不多,那这个特征有用吗?
09:12
那这个特征其实没多大用,对不对?如果说它都区分不了不同数据它的特点的话,那这个特征就没什么用,这就是我们所说的,假如说呃,每个人都有一个标签,呃说说我,我是一个程序员的话,那程序员就就不值钱了,对吧,所有人都是程序员就不值钱了,那我们的特点,我们的价值就在于我们跟别人不一样,我们会的别人不会,所以这个数据也是这样,特征选取的时候也是这样啊,就是如果说它的这个取值范围特别的集中,都差不多,那这个特征往往我们是选择的时候要把它踢掉的,对吧?呃,另外还有一种选择的主要的这个思路,就是说我们要找它跟目标对象,目标的那个,呃,大家认为那个Y对吧,跟它的关相关性,关联性我去考察一下,如果要是显著相关的,这肯定要保留,对不对?如果是一比对发现根本就没什么关系,那是不是这个就应该淘汰掉啊?呃,在我们前面这个例子里面,大家可以想。
10:12
讲到所在街区,这个本身也是一个输入参数,对不对啊,当然这里边大家可能想到跟是否售出或许也是有一些关系的,但是它其实是不是这个街区对他的影响不是特别大,每个区肯定都能都能卖出去,对吧?更关键的数据可能是后面这些数据,所以啊,这个是大家需要考量的一个东西,特征选择的话,我们就先给大家,只是简单这么一说,我们就不去详细展开讲了,那我们这里主要讲一下特征处理,特征处理。这就又需要去细分,我们可能要针对不同的数据去做不同的处理,对不对?那么我们针对哪些数据做处理呢?比方说数值型,那数值型所谓的就是一个应该是一个连续的数值,对吧?我们得到的特征它取值是连续的,这个时候怎么去处理?
11:06
另外还有就是类别型,类别型是不是相当于取值是离散的呀,这个时候又怎么去处理,然后下面还有一些特殊的时间类型怎么处理?时间类型其实非常的常见,特别是我们在收集这个用户的,比方说上下文信息,什么时间登录对吧?呃,它那个登录了多长时间,这个是经常能拿到的一个数据。另外还有就是统计类型,这些都是我们经常能够见到的一些数据类型,大家看一看我们做预处理的时候,特征处理怎么样去做。首先连续值,这就是数值,数值类型对吧?我们一般对它做什么处理呢?主要的做法就是归一化和离散化,那首先我们先来看一下归一化啊,归一化有时候又叫做幅度调整,这个其实比较好理解,大家应该想到特征和特征之间,他们是不是应该是平等的,如果他们要是有有不平等的话,我们是不是应该在模型里边,比方说给一个不同的系数来调整它们的这个差别对不对?本身输入数据的时候,他们是不是应该是一,就是完全平等的啊,你不应该说我这个特征它就特别的重要,另外一个特征就没有意义,所以我们是希望它的区别是体现在特征内部的,而不要针对一开始它的这个取值就导致它们有不同的重要程度,对吧,比方说像我们之前的这个例子。
12:37
房子价格和面积,他们同样都是一个连续的取值,对不对,但是它取值的范围完全不同,比方说这个取值的价格,价格这个是不是就都是几百万啊,至少对于我们北京的这个房子来讲啊,至少都是一个几百万这么大的一个数字,那对于面积呢,一般情况就是一个几十平到100多平,对不对啊,这里是到300平,一般也不会有那么大的豪宅,一般就是到100多而已,那大家可能会想到。
13:06
明明是两个平等的特征,那你输入的时候本身它是不是就已经有了很大差别啊,你这个特征取值就很大,这个这个取值就比较小,我们是不是一开始应该避免这样的问题啊,我们就做一个幅度调整,怎么做幅度调整呢?对,大家看这个公式啊,这个公式尽管看起来有点奇怪,但是很好理解,对吧?Feature代表特征对不对?特征old是代表之前它的那个特征对不对啊?我们现在要想得到一个新的特征,怎么得到呢?用之前的特征除以一个值。除什么呢?除它原先特征里边的最大值和最,呃,这这里这个应该是小写的对吧?MNM最大值减去最小值它们的那个幅度差,那大家想到这个减完了之后就会得到一个什么结果,大家看一下根据这种方法,房屋价格我们是不是最大,最贵的应该是700万的这个房子对吧,最便宜的昌平的这个500万的房子,那这个差值是不是200万啊,所以我就每一个数据都直接除以这个200万。
14:20
那得到的是不是就变成了一个3.532.53.25这样一个数据数据啊。然后住房面积也可以用同样的方式来做,最大的是150平的这个房子,最小的是100平的房子,差值是不是50,我就每一个都除以50,得到的是不是也是二点几三点几的这样的一个数据啊,哎,所以大家看这样处理之后,是不是相对来讲他们就比较平等了,这个取值不会受到幅度范围内影响了,这其实就是归一化的一个过程,很好理解啊。好,然后接下来我们再,呃,这是得到的结果,接下来我们再来说一下离散化,大家会可能会想到,诶,你本来是一个连续值,这不是很好的事情吗?连续值它取值更加的多,更加的细,细分对吧?那为什么我们还要想要把它离散化呢?这是出于一个什么考量,这其实就是要看具体的应用的场景了,对吧?你要考虑什么样的问题,比方说这里我们给大家提一个问题啊,假如说我们考量这个问题是要训练一个模型,输入一个人的相关的一些信息,输入一些特征,我们想要判断出来这个人应不应该在公交车上给他让座,那大家可能想到啊,这可能涉及到的给什么样的人让座呢?呃,老老弱病残运对吧,就是这些特征应该输入对不对,我们取里边的一个最明显的特征,比方说老是不是要把年龄作为一个数据输入啊,那大家想。
15:52
哦,年龄正常来讲,呃,假如大家不考虑这个就是整数的这个取值的话,其实它是一个离呃连续的取值对吧,应该是你取多少都可以,但是我们如果要是说想要去训练这个让座的这个模型的话,他他是不是并不需要。
16:13
把每一个年龄具体到非常精确的那个数值啊,我我们需要的是什么,是不是只要一个年龄段就可以了,我们正常来讲的话,应该就是年龄很大的,哎,需要敬老,那去让一个座,年纪很小的小孩子,那爱幼也应该去让一个座,对不对?所以在这种情况下,我们其实是想要把它分,相当于按照它的这个取值要分成几类的,对吧?这个时候就连续值相当于是变成了一个分类问题,那大家直接的想法的话,那连续值做分类,我们是不是之前讲过一个C格贸易的函数啊,诶,它其实就是标准的可以做一个二分类,对不对?但是我们这个让座问题里面又不一样,它是不是不是简单的二分类啊,它是最大的那部分和最小的那部分取同样的值,都取一对吧,然后中。
17:14
N的这一部分都取零,这个状态就就会有点特别了,那我们怎么去做处理呢?其实非常简单,就是把我们对应的这个年龄直接把它转换成一个离散的数据,怎么转换呢?好,大家来看一下,我是不是可以用一定的阈值把年龄分段啊,分段之后,那本身我们的这个年龄A它一个字段,它这是一个特征,对吧?分段之后是不是可以把它离散成多个特征啊,这个时候相当于我们就有了这么多个特征,比方说一到十岁一个特征,11~20岁一个特征,假如说来了一个25岁的人,他应该属于是不是这个21~30 20多岁这个区间对不对?所以我们就这个特征取一,别的特征都取例。
18:11
呃,大家能能想到这个做法对吧?那那就相当于我们相当于把这个特征做了一个展开,然后我只把它属于的那一部分给了一个离散的趋势,那同样如果是60岁的话,我们后面是不是有一个50~100岁以上的老人,这是不是都应该让座啊,啊大家可能会想到我前面这个一到十岁可能应该让座,这个50~100都应该让座,这两个如果是一的话,他就应该让座。所以我们可以基于这个数据去做一个学习,对吧?啊,这就是这个离散化的一个处理,那具体到推荐场景里边有什么意义呢?它不是让座了,大家会想到比方说电商,电商里边什么东西它比较比较明显有这样的特点,就是价格,对大家会想到价格的话,一般每个人是不是对价格喜好的区间都不一样啊,有有可能啊,我们可能觉得哎呀没钱,那我们可能就是直接一排序,是从低到高,价格越便宜越好,对吧,但是更多的人,当然也有一些土豪,他是直接从高到低,我我不不买对的,只选贵的,对吧,这个也是有可能的,但其实大家会看到日常生活中这样都是少数,我们一般是什么呢?哎,对,综合考虑对不对啊,一般我是想选取一个,就是最好是物美价廉,那当然了,就是说你如果要是质量还不错,还过得去的话,一般价格也不可能。
19:38
是最便宜的那一类对不对?所以我们往往喜欢的就是一个区间段的价格,那么大家看这个是不是就跟我们的让座问题是一样的啊,只不过我们选的不是最大和最小那一部分,而是中间某个区间段,对吧?那所以我们可以根据这个作为一个特征来把这个商品给上标签,好呃,那么这里就遇到大家可以看到这个这个问题啊,就是我们前面这里这个年龄问题里边,我们是不是可以比方说十怎么划分这个就有讲究了,对吧?你既然要离散化,那怎么划分就有讲究了,我们是不是可以十岁一档直接这样去划分啊,十岁一档的划分这种方式我们有一个叫法叫等不长离散化,那大家可以想到它这个划分是不是非常简单,你就预设好就行了,对吧,那如果作为这个价格划分的话,那就是比方说1000块钱一档,假如说买买电脑的话,对吧。
20:38
1000块钱一档就就直接就把它分到这里就可以了,但是它不一定有效,大家能想到为什么吗?为为什么这个等不长的这种划分不一定有效啊,因为我们比方说这个商品是不是它有可能。非常便宜的是少数,非常贵的也是少数,大部分应该集中在中间那个区间段啊,或者说我们让座这个模型也是,哎,就是让座这个模型,就是我们对中间这个年龄段可能并不太关心,我们更关心的是年龄比较小的和年龄比较大的这两个区间段对不对?哎,所以大家会想到在这种状态下,我们不应该直接等步长,那可以怎么去做呢?比方说我们还有另外一种方式可以去等平离散化,什么叫等平离散化呢?
21:33
大家看这个25%,75%,这是不是就是我们前面讲到的那个什么样的分位数,对不对,这就是那个四分位的分位数,当然中间还可以有一个50%,那就是中位数对不对?所以我们不是考虑哎1000块钱画一档这样的价格区间,而是考虑诶你如果这个区间。本身商品比较少的话,那我这个价格区间就画大一点,对不对?这个商品比较这个区间段商品比较密集比较多的话,大家选择的这个范围也比较比较多的话,那可能我就把它再细化一些,我可能就变成五百一档,甚至有可能一百一档,那什么是标准的,就是根据有百分之多少的商品来划分,对吧?那所以这其实是等平的这样一种处理,那其实大家可以想到它有什么样的区别啊,从精准度程度上来讲,是不是等平应该会精准一些啊,但是等平有问题。
22:32
等平是不是你要选取不同价格区间,是要按照有多少个商品去选取的话,这个是不是价格有可能不停在变动啊,啊,特别是电商啊,这个价格有可能它随时都会调整,所以如果说它变动比较频繁的话,那你每一次统计这个数据是不是就得重新统计一遍呀,要这个数据的时候得重新做一遍计算,所以呃,大家会发现,就是我们想要去避免这个现场计算,想要实时性做得更好的话,那可能我们要用固定的这个等步长啊,要用要用它去做一个离散化处理对不对?所以实际在工业上实际应用当中,两者都是有应用的,就是实时性等不长比较固定,它比较简单,那从精度上来讲,等平是不是会更精精确啊啊,这就是大家可以去考量的一部分,我们后面做推荐的时候,也会涉及到实时和离线对不对,它其实也会有这样的一些考量。
23:32
好,那接下来我们再给大家讲一下这个类别型。类别型其实。大家会想到类别型是不是本身就是一个离散取值啊,离散取值的话。大家会想到,其实本身他们之间就是本身这个类别它有关系吗?比方说我们之前这个说这个是否是学区,这是不是就是一个类别型,是和否啊,当然是和否的话,大家可以一般认为是,是就取一啊,否就取零对吧?啊,可以认为它数值上还是可以认为有一些关系的,那如果要是说,比方说我们是一个颜色的类别的一个特征是颜色,那红黄蓝绿它们这些互相之间哪个颜色大,哪个颜色小,应该有区别吗?其实是不是没有区别啊,所以我们在处理的时候尽量要把它们区分开,而且不应该让它们有预设的大小关系。
24:33
呃,所以这就涉及到另外的一个处理方式,其实前面我们在做这个年龄的这种处理的时候,已经用到了类似的这种方式做什么呢?就是叫做弯号的编码,或者叫亚变量这样的一种处理方式啊,它就是把一个类别数据平行展开,展开之后整个特征空间就会膨胀,具体怎么做,大家看一眼红航蓝三个数据,大家如果要是说呃,作为一个特征的话,那可能我们会去定义一下,红是零,黄是一,蓝是二,可能就这样去定义它的取值对不对,但是我们不想让它本身有这种大小的区分,因为他们都是完全平等的,那我们怎么办?对,很简单,那就展开定义三个特征,那如果它是红色,就只有color red这个特征是一,别的都是零,同样蓝和黄也是一样,对不对,哎,所以这样就把我们的特征做了一个展开处理好,那么大家对应。
25:34
我们前面的例子是不是像这个格局也可以用这种方式来处理啊,啊,当然大家可能会觉得格局的话,一室两室、三室,它本身还是有大小关系的,所以这个就看我们怎么样去选取,最后是不是要看效果到底哪个更好啊啊,这个就是大家怎么去处理都是很灵活的啊,那么用这种方式处理完之后,大家看是不是这个格局和学区都可以把它划分开开来啊,所以我们整个的特征空间就会膨胀,那如果我们处理到这种程度,这是不是就可以直接输入到我们的机器学习模型里边去做预测了啊,当然后面还应该有一步特征选择,我们可能考虑一下哪个没什么关系,比方说我们考虑到这个所在街区,如果没什么关系,我选择的时候可能就把它给摘掉了,对吧?啊,可能我只要后面的这几个特征,这就是特征工程里面的一些方式,下面我们再来说一下时间类型的特征,时间的话大家想想它是离散还是。
26:34
连续呢?这就得看是什么时间了,对吧?好,它既可,我们这里说它既可以是连续值,又可以是离散值,那连续值什么是连续值呢?比方说我们在一个网页上停留了多长时间,持续的这个时间,这是不是就是一个连续值啊,或者说我从上一次登录到下一次登录的这个时间间隔时间是不是也是一个连续值啊,啊,这种时间都是连续值,离散值的话就更容易理解,比方说我们是不是可以选取,哎,你登录时间是一天当中的哪个时间段,上午、下午、晚上是不是可以定义一个。
27:14
当然了,大家可以知道,我们收集起来的时候,这个数据可能还是一个离连续值,是你登录的那个具体的时刻时间,对吧?那我们是不是可以把这个时间再用前面的离散化的方法归到几类里边啊,那是不是就变成一个离散数据了啊,这是一样的啊,然后一周中的星期几,这个是不是也也是一个离散值啊,当然我们更多的可能并不关心一周中的星期几,我们关心的可能是他是工作日还是周末,这个是不是行为差别会比较大啊,当然就是说相对于我们而言,大家周四的这个行为数据可能会跟平常不一样,对不对?所以大家会看到就是你通过这些行为数据的分析,其实是能分析出一个人他平常的这个状态的好,那么当然还有就是一年当中的哪个月,哪个星期,或者说哪个季节,这些其实都是一些离散的时间数据。
28:07
最后还有一类是统计数据,统计数据其实就是大家会想到,比方说有什么呢?加减平均,就是我本身这个商品是不是有一个价格,这是它的一个特征,但我最后要考量的是不是有,可能并不是它本身到底有,到底有多贵,而是要考察诶,它比这个价格的平均值贵多少,这是不是也是一个特征啊?呃,代表了它离平均的这个偏差对吧,所以这是一个加减平均啊,或者说还有这个分配线数,那就是属于这个它到底百分之多少的这个价格参数对吧?还有次序排到第几,或者说比例,比方说评价好,好评中评差评比例是多少啊,这些都是属于统计型的特征处理。
我来说两句