00:00
因为我们今天要给大家讲的是,呃,大家看啊,就是首先我们会说一下冷启动问题,这个比较简单,我们带过就可以,之后是基于内容的推荐。那这一部分大家其实知道,我们之前讲的时候,这是另外一大类,对不对,我们当时按照数据源是不是分了三大类啊,一类是呃,如果基础的数据源是用户基本信息的话。我们把那个叫基于人口统计学,或者说然后发展出来之后,标签化之后就叫用户画像,对不对啊,那一部分可能我们这里边没有设计,因为我们这个项目数据里边用户的信息特别少,对吧?啊,我们可能能够收集到的就是一开始是不是可以给一个这个页面,让你去选一个初始的兴趣标签啊。这一部分收集起来,大家想这是不是就有点类似于用户标签,这可以说就是一个用户画像,对不对?当然这个有点太简陋啊,那么大家会想到我们一开始冷启动的时候,没有任何的行为数据,没有任何的历史评分,这个时候我们前面的整个这套系统是不是都没有用了,我们前面的所有讲的东西是不是都是基于行为数据,都是基于评分的呀?呃,所以前面这一部分我们的基础其实就是协同过滤,是基于行为数据来的,那协同过滤有一个很大的问题就是。
01:24
如果来了一个新用户,来了一个新物品的话,是不是没有办法做出准确的推荐,因为它基于历史数据,我现在来了一个新物品,没有历史数据,那你怎么推呢?啊,就是我们那个初始的稀疏矩阵,它就不是稀疏了,是全零,你怎么推啊?所以大家会想到一开始我们会遇到一个冷启动问题,实际项目当中怎么处理这个问题呢?其实也很简单,那就是用户登录的时候,我们先询问一下它本身对于各种各样类别的一个偏好。他勾选之后,我们相当于就给他贴上了一个对应的标签,呃,那家想这个电影类别的话,其实是不是跟我们后边讲到就是数据里边电影信息的类别是相相同相或者说相近的呀,那我们这里边就是如果他勾选的这个类别刚好也是电影的类别,是不是就应该给他做出推荐,所以这个就非常简单,其实就是一个字段,这个类型字段匹配,匹配上我们就给他推出来,那其实这部分是不是不用我们再写scla代码啊,大家能想到啊,我们只要把这个做出来,其实业务系统直接就可以查出来给用户做推荐了啊,这是这个冷启动问题,当然可能我们定义一些规则,就是说冷启动的时候,根据这一个,呃兴趣标签,我们到底给它推什么对吧?各个类别怎么样去推,按照这个评分高低还是按照热门,这些都是我们可以去自定义的,嗯,然后大家会想到我们除了这一部分内容之外。
02:57
大家可以想到这一部分可以说是结合了,呃,用户标签和物品的电影的类别标签做的一个推荐,对不对啊,这是一个简单的能启动问题的应用,另外我们除了基于行为数据,大家大家想我们还可以基于用户基本信息和电影基本信息对不对?用户基本信息我们前面已经说了,你不能上来之后这个收集就开始调查问卷,这个户口调查对不对,把用户的很多信息都获取到,这个体验极差,所以我们这个项目里边就没有办法做这部分内容了,在实际的项目实战当中,大家应该还是有概念的,就是说怎么样去做用户画像对不对,我们可能要收集用户各种各样的信息,如果我们不能上来给他做很多的调查问卷的话,那我们就要收集他的一些行为数据了,或者说我们收集他浏览器的上下文信息,对不对,我们通过这些信息。
03:57
呃,收集起来之后再去应用机器学习算法去给它啊,可能做一些特征提取啊,然后打上一些标签,这是不是相当于就是一个用户画像啊,所以基于这个是可以去做相对应的推荐的啊,比方说这个电影里边,可能大家能够想到的就是说我收集一些数据之后,给他贴上一个,比方说文艺青年啊,或者说对吧,科学青年啊这样的一个标签,这是比较明显的,但是实际提取过程当中,大家可能觉得不太好跟对应的指标联系起来,对吧?在电商里边这个指标其实就有时候比较明显,比如说电商,真实的这个电商项目里边,他会给用户什么样的标签呢?
04:40
比方说他有可能会收集用户的行为数据,然后大家会想到这个,比方说用户的购买数据,假如说经常就会出现这种就是毫无规律,然后突然一下子就是买很多很多不相关的东西,而且那个有可能就是它的那个价格还都比较昂贵,大家会想到这个用户是不是就经常就属于我们的这个剁手党一类,对不对,经常就会出现非理性消费的这种行为,所以如果我们电商的网站收集到足够多数据的时候,可能就会发现,诶,这一类数据,这一类用户就可以给他提取出一个标签啊,这个标签有可能就是剁手党对吧?呃,那么那么大家就会想到,如果要是有一个剁手党标签的用户给他推的内容,有可能我们那个内容的关联度,或者说对他以前买过的东西,关联的这个程度可能就可以尽量小一点,对不对,因为他剁手嘛。
05:40
有可能你给他推什么,他都他都愿意买,所以说呃,肯定会相对应的这个指标会做调整,对吧?啊,那另外就是我知道的啊,就是有有这个具体的电商项目里边,它会给用户做画像的时候,给一个什么标签,什么参数呢?那这个就不是简单的标签了,它是一个连续的特征值,呃它给用户定义一个败家指数,呃,那大家就会想到就这种指数相当于就是要考察你的这个消费行为到底理性不理性对不对,呃,那败家指数有可能就是说这个指数高的话,这个他可能经常买的就是那种价格特别高,然后呃,可能一般买的人不是那么多,而且评价都不是特别高的那种,对不对,他喜欢买这种,那如果他有这个特性的话,往往给他推荐的,我们就是啊,尽量要推贵一点的,对不对啊,他他喜好这口啊,所以说你可能得迎合他的这个偏好,呃,所以大家可以想象到在实际的。
06:40
在我们推荐当中,那这个这个就更多的是用自己的这个,呃,一方面是经验,另外一方面我们是不是应该应用大量的机器学习算法,从原已有的数据里边去找规律啊,对吧?啊,本身假如说像我们这个,呃,看电影啊,如果要是说我们收集到的这个数据,它总是在夜里边一两点之后看电影,那大家有可能就会想到给一个标签,有可能他是一个夜猫子,对不对?那如果说我们分析了大量的数据之后,发现有夜猫子标签的这个用户,哎,他大部分都喜欢看恐怖片,那我们其实就就会发现啊,你既然是夜猫子,我就给你推恐怖片了,对不对,就是即使他之前没看过恐怖片,也有可能他喜欢,对不对?哎,这就是我们之前讲的用户画像,他其实也是基于这个编号数据和,诶,比方说我们就是跟他相似的人,有相同标签的人,喜欢过什么就可以给他推什么了,对吧?啊这其实就是之前给大家讲过的。
07:40
这种推荐当然在这个项目里面我们没有那么多数据,还是受限于数据对吧?没有那么多数据的话,我们就是大家有这个概念就可以了,那我们另外一大类是基于什么呢?是不是基于物品的信息来做推荐啊,在这个项目里面我们有物品的信息吗?我们的物品是电影对不对?诶电影的信息大家会想到在一开始我们的数据里边是不是还是算还算比较比较多了,对吧?跟跟这个用户的信息比起来的话,我们这个本身movie这个数据里边,大家之前想到是不是有很多个数据啊,当然大家会想到这里边跟这个推荐相关的,我们应该能找到哪些数据呢?
08:29
大家会看到这里边尽管收集到的电影数据很多,但是其实能够拿出来作为电影特征的,就是跟用户推荐相关的,其实并不是很多,对吧?所以大家会看到我们拿到它的原始数据之后,第一步其实是不是应该先做。一个特征工程的处理啊,相当于先选取特征对不对,一开始当然最初一开始我们应该先做特征的采样和清洗,对吧?以TL相关的一些工作,这里我们基本上都是现成的一些数据了,都是字符串,然后我们是不是应该,诶就是给大家讲到的特征处理,我们是不是该离散化的离散化该这个呃,把它这个归一化处理的时候,归一化处理对不对,最后我们是不是还要有一个特征选择啊,在这个里边我们就。
09:22
不给不给大家讲,这个就是具体调库或者说应用算法的这种特征选择了,我们就直接肉眼看一眼吧,因为大家知道就是我们基于什么来做特征选择呢?是不是就是看一方面我们当时说可能要看它本身取值的那个方差对不对,就是它如果要是绝大多数我们的样本点取值都一样,根本就没有区分,那这个特征是不是就没什么意义啊,那所有人比方说我们要考察的数据就是我们班所有的同学,然后贴上一个标签,所有的人都是大数据工程师,那这个对于大家来讲都有这个特征,这个特征是不是针对不是大数据工程师的人才叫特征啊,如果我就是我们自己内部看的话,这其实就不叫特征了,对不对?诶,所以这是一个特征选择的基本的一个想法,然后另外还有一个想法是什么呢?是不是就应该考察跟我们目标相关的特征啊。
10:21
那现在我们的目标是不是要看,诶,就是用户对哪种电影感兴趣,有什么样特征的电影感兴趣,对不对,那大家想一下,在这些标签在在这些就是基本的数据里边啊,哪些是跟用户的特征会感兴趣的呢?跟我们目标相关的特征的,大家可以想到这个ID肯定没关系,对不对,哎,这个肯定就是我们一个编号嘛,电影名称大家可能想到可能会有关系,但是这个关系呃,就是可能不是很大对吧,因为大家想到这个名称一定是就是每一个电影都不一样,那我们提取的时候,是不是相当于得去做一些分词的这种关键词提取这样的分析啊,对吧?那么如果要做关键词分析的话,它是不是显然就不如详情描述和后边的什么和类型,对不对对。
11:21
这一个电影内容的描述会更加全面一些,所以这两部分大家其实想到这是跟电影内容非常相关的,呃,这个特征啊,因为大家想到这个时长和发行时间有关系吗?可能有关系,因为大家想到有些人他可能就喜欢这个,诶你时间不要太长的对不对?或者有些人我就喜欢那个一一看看,两个半小时,三个小时的,但这种大家会想到跟一般人的喜好可能关联不太大,对吧?所以如果我们要做特征选择的话,如果我们不考虑,那么详细这一部分可能就不考虑了,或者说考虑上它是不是应该权重也比较小啊,啊,然后我们继续来想,那发行时间,拍摄时间,那这相当于是一个电影的年代了,对不对?哎,可能有些人也是,哎比较怀旧,喜欢看以前的片儿,或者说有些人就喜欢看最近拍的片儿,但这个好像也不是特别的明显,对吧,那用户可能他更加明显。
12:21
语言的话就更不明显了,对不对啊,当然有些人可能就喜欢看某个国家的,呃,某种语言的这个类型,但是我们看到的大多数都是翻译过来的,对吧?所以说这个也不是特别的明显,那大家可以想到其实最重要的特征是电影的详情描述类型,然后大家可以想到是不是导演跟演员应该也还是比较重要啊,对吧,有些人可能他只看某个导演的,只看某个演员的,所以这几个数据其实相对来讲就是比较重要的特征信息。那如果我们选取这几个作为,呃,就是做了特征选择之后的特征的话,是不是我们可以建立一个模型用,或者说我们就不见模型,直接去考察这四个维度的特征,跟我们想要的那个目标,就是是否值得推荐有什么关系,对不对啊,大家可以找到这样的一个关系,那这是就就可以应用我们之前学过的这个分机器学习的分类算法就可以做了,对不对,看看哪些是诶值得推荐的,哪些是不值得推荐,这是一种方式,另外一种方式大家会想到我是不是可以相当于跟我们之前说的这个item,呃,当然不是item CF,但是我们是基于物品内容去做一个相似度类比啊。
13:45
大家可以想到,我既然提取出了它的所有的特征,那我是不是就不需要直接用机器学习算法算出这个特征,它到底应不应该推荐对吧?我是不是看假如我们实时那种想法的话,是不是你喜欢了一个电影,我是不是就把跟他相似的这个都给你推出来就可以了,这是不是也是一个一个一个想法啊?那怎么样去选取相似呢?是不是我已经有的特征是不是相当于是一个向量啊,我们按照向量的那个计算方法,你去算一个欧式距离,或者算一个余弦相似度,是不是又可以把它的相似度相似性那个平分算出来,算出来之后按照高低排序最相似的推荐出来,是不是就可以啊?
14:30
哎,所以在这里我们就给大家做一个最简单的实现,就是说我们直接把特征算出来之后,只要提取出特征向量,然后我们算一下相似度,那之后是不是就可以根据我们之前的这个实时推荐的这个算法,直接你喜欢的一个什么,我给你推出来就可以了啊,所以这一部分内容我们其实原理上还是很复杂,就是可以可以做的事情还是很多的,我们从代码实现来讲,就给大家提取特征,算到相似度矩阵,然后我们就结束了啊,大家后面的内容大家知道跟我们实时系统接起来都是一样的,对不对啊,当然这里面的特征选择大家会看到啊,就是导演和演员这两部分呢,因为这个大家会想到这个人名字是不是维度特别特别多啊,对这个处理起来可能就会比较比较复杂,呃,而且就是说我处理过之后发现这个其实效果不是特别的明显。
15:30
那大家会想到应该是哪种特征,它对于我们推荐的效果更加明显的,那其实想到是不是这个像这种类型和详情描述提取出来的特征应该更加明显呀,这是它更加深刻的内容信息,对不对,像这个类型是不是就相当于是详情描述的一个关键词啊,啊对,所以大家看到就是那详情描述,我们可能这更更相近的是一个文本处理,一个自然语言分析,自然语言处理的一个问题了,那这个可能相对又复杂一点,所以我们这里就以这个类型信息里边提取特征,我们以这个作为例子,给大家把这个简单的做一个实现啊,让大家去对基于内容的推荐有一个基本的了解,那大家如果要是想想做扩展,或者说大家可以想到,在实际项目当中,我是不是你能够想到的信息都可以提取出来,提取出来作为我们的特征。
16:30
啊,然后后面我们的做做法都一样,对不对,要不你直接根据相似度,诶按照特征算一个相似度,直接去做推荐,要不是不是根据你的特征去训练一个模型,或者说应用一个机器学习算法,看它是否值得推荐啊,哎,这就是我们接下来要做的事情,好,那呃在这部分内容里边,大家看我们怎么去做这个基于内容推荐呢?我们其实就是基于它里边的类型信息,主要就用这个,然后这个信息大家会看到它其实是不是已经有的一些特征标签啊,这些特征标签那大家会想到,呃,那这个很简单吧,我是不是直接给这个特征标签,我们之前是不是讲过这个一个类型的这个呃特征我们它相它是不是相当于是一个离散取值的特征啊,我们前面是不是讲过,它可以做这个亚变量处理,直接把它平铺。
17:30
展开对不对?我们不应该说,特别是在这里,大家看到它还可以属于同时属于好几个类,那如果我们要按照这个去划分的话,这个你就不好定义了,对不对?不同类型的组合你都得给一个特定的数值取值才可以,对不对?那如果我们把它做亚变量展开的话,是不是就很简单,就相当于我们的这个特征维度,是不是展开就变成比方说action,这是一,一个特征,对吧?你如果有这个标签,是不是就取一,没有的话是不是就取零啊,然后呃,Adventure冒险,如果有的话取一又是一个特征对不对?呃,这个像后面这个是科幻啊,如果有的话取一,没有的话取零,所以展开之后这个就比较明显了,但是大家想一下,这个会有一个什么问题呢?最后我们的特征向量啊,当然会比较大,对不对,这个是没办法的,你既然要把它铺开,那这个比较大是没办法,这个其实还好,就是大家能想到电影的类型,可能能够想到有限,即。
18:30
十个差不多了,对不对啊,最多上百个差不多了,你要是这个演员跟导演这个要展开的话,那可就就就很可能是几千个,而且数据量大的话,就是几万几十万几百万都有可能,对不对,这个就维度会特别特别大,所以我们的例子是还是用这个类型啊,大家想一下这个展开有什么问题。它的问题在于,我们到时候展开每一个类型,如果有的话,取值就是一,没有就是零,相当于对它是所有,就是只要有这个标签,大家是不是认为所有标签都是平等的,都是平权的呀?但是在实际的过程当中可能会有所不同。
19:14
因为大家会想到有一些类型标签有可能是什么呢?比方说动作片,剧情片,这个是不是很多电影它有可能都有这样一个标签啊,你如果直接给你一个类型标签是这个剧情片的话,你直接去想是不是一下子能想到电影太多太多了,很多电影它都可以打这个标签,但是如果一个电影的标签是恐怖片,一个电影的标签是动画片,这个电影是不是类型就非常的明确,一下,就局限到我们能想到的特征非常明显的那一类啊,那所以大家会想到,假如说一个电影它两个标签,一个是剧情,一个是恐怖,那是不是这两个标签应该是不平等的啊?
20:04
就是如果这两个标签同时打上,大家觉得你更倾向于他应该划分,如果说这两个权重不一样的话,你觉得哪个权重应该更大一点,对他如果这两个标签都有的话,是不是它应该是更加更像恐怖片,不能说更像啊,应该说恐怖片成分应该更大一点才对,对不对?因为剧情片可能很多很多,它的这个成分可能对它的特征体现来讲,贡献并不是很大,它的特征更多的体现在恐怖片上。所以大家想到这个思路跟我们之前讲的那个什么东西比较接近,嗯,我们在给大家讲基于内容推荐的时候,是不是讲到,诶用户生成标签里边,我们要去做分析,是不是应该对热门标签做一个惩罚啊,大家是不是之前我们其实提取的时候就是根据那个,呃,关键词提取那一套新闻里边关键词提取来给大家做分析的,对不对?以一段新闻里边,诶梅西出现了三次,那别的词汇,比方说阿根廷可能出现了四次五次,对吧,那没有意义的那些的勒这些可能出现了更多次,那我们是不是对这种热门,大家发现这些词汇尽管在这篇文章里面出现的多,他是不是在每篇文章里面都出现啊,这是不是属于一个热门词汇,或者说在我们这个问题里边,有一些类型标签是不是属于热门标签啊,热门类型我们是不是应该对它做一个惩罚。
21:36
那得想到按什么来做惩罚呢?用什么算法做惩罚呢?对,大家想到之前给大家讲的t fidf对吧?啊,当然这个就是真正实际项目应用当中,这个就很灵活了,我们可以用当时给大家讲解理论的时候,讲的就是只借鉴它的算法,我们统计出来之后,下面直接除一个log就可以,对不对?或者我们这里边可以调库,就完全用t fidf的这一套给大家做,那接下来我们就用调的方法啊,就是m l live里边大家可能知道会有tdf相关的内容,对不对?哎,大家等一下看看我们是怎么实现的。
我来说两句