02丨学习数据挖掘的最佳路径是什么?

你好,我是悦创。
上一节中,我给你分享了数据分析的全景图,其中最关键的部分就是数据挖掘,那什么是数据挖掘呢?
想象一下,茫茫的大海上,孤零零地屹立着钻井,想要从大海中开采出宝贵的石油。
对于普通人来说,大海是很难感知的,就更不用说找到宝藏了。但对于熟练的石油开采人员来说,大海是有坐标的。他们对地质做勘探,分析地质构造,从而发现哪些地方更可能有石油。然后用开采工具,进行深度挖掘,直到打到石油为止。
大海、地质信息、石油对开采人员来说就是数据源、地理位置、以及分析得到的结果。
而我们要做的数据挖掘工作,就好像这个钻井一样,通过分析这些数据,从庞大的数据中发现规律,找到宝藏。
1. 数据挖掘,从知识清单开始
我们第一天学开车的时候一定不会直接上路,而是要你先学习基本的知识,然后再进行上车模拟。
只有对知识有全面的认知,才能确保在以后的工作中即使遇到了问题,也可以快速定位问题所在,然后找方法去对应和解决。
所以我列了一个数据挖掘的知识清单,分别是数据挖掘的基本流程、十大算法和数学原理,以此来开启我们的学习之旅。
2. 数据挖掘的基本流程
在正式讲数据挖掘知识清单之前,我先和你聊聊数据挖掘的基本流程。
数据挖掘的过程可以分成以下 6 个步骤。
- 商业理解:数据挖掘不是我们的目的,我们的目的是更好地帮助业务,所以第一步我们要从商业的角度理解项目需求,在这个基础上,再对数据挖掘的目标进行定义。
- 数据理解:尝试收集部分数据,然后对数据进行探索,包括数据描述、数据质量验证等。这有助于你对收集的数据有个初步的认知。
- 数据准备:开始收集数据,并对数据进行清洗、数据集成等操作,完成数据挖掘前的准备工作。
- 模型建立:选择和应用各种数据挖掘模型,并进行优化,以便得到更好的分类结果。
- 模型评估:对模型进行评价,并检查构建模型的每个步骤,确认模型是否实现了预定的商业目标。
- 上线发布:模型的作用是从数据中找到金矿,也就是我们所说的“知识”,获得的知识需要转化成用户可以使用的方式,呈现的形式可以是一份报告,也可以是实现一个比较复杂的、可重复的数据挖掘过程。数据挖掘结果如果是日常运营的一部分,那么后续的监控和维护就会变得重要。
3. 数据挖掘的十大算法
为了进行数据挖掘任务,数据科学家们提出了各种模型,在众多的数据挖掘模型中,国际权威的学术组织 ICDM (the IEEE International Conference on Data Mining)评选出了十大经典的算法。
按照不同的目的,我可以将这些算法分成四类,以便你更好的理解。
- 分类算法:C4.5,朴素贝叶斯(Naive Bayes),SVM,KNN,Adaboost,CART
- 聚类算法:K-Means,EM
- 关联分析:Apriori
- 连接分析:PageRank
3.1 C4.5
C4.5 算法是得票最高的算法,可以说是十大算法之首。C4.5 是决策树的算法,它创造性地在决策树构造过程中就进行了剪枝,并且可以处理连续的属性,也能对不完整的数据进行处理。它可以说是决策树分类中,具有里程碑式意义的算法。
3.2 朴素贝叶斯(Naive Bayes)
朴素贝叶斯模型是基于概率论的原理,它的思想是这样的:对于给出的未知物体想要进行分类,就需要求解在这个未知物体出现的条件下各个类别出现的概率,哪个最大,就认为这个未知物体属于哪个分类。
朴素贝叶斯和贝叶斯区别
- 朴素贝叶斯:假设特征之间是条件独立的,即在给定类别的情况下,所有特征相互独立。这种“朴素”假设简化了计算,使得模型在实践中可以快速进行概率计算。
- 贝叶斯方法:并没有条件独立的假设,可以包含特征之间的依赖关系。一般的贝叶斯方法可能通过贝叶斯网络等更复杂的结构来表示和计算特征之间的关系。
- 朴素贝叶斯:由于独立性假设,每个特征的概率可以单独计算,因此计算量大大减少。通常,朴素贝叶斯被用于分类任务,例如文本分类、垃圾邮件过滤等。
- 贝叶斯方法:计算时需要考虑特征间的关系,因此计算量通常更大,但能够捕捉到数据中更复杂的关系。
- 朴素贝叶斯:由于假设简单、计算高效,适用于高维数据、样本量相对较大的场景,如自然语言处理中的文本分类。
- 贝叶斯方法:适用于对特征依赖性有较高要求的复杂场景,通常用于对依赖关系的建模,比如通过贝叶斯网络或贝叶斯推断来处理时间序列、图模型等。
- 朴素贝叶斯:由于独立性假设通常不完全成立,模型的精度在某些复杂任务上可能受到限制。不过在许多情况下,朴素贝叶斯的表现依然不错,尤其在高维数据下。
- 贝叶斯方法:能更准确地捕捉到特征之间的关系,因此在理论上会比朴素贝叶斯更精确,但实现复杂,训练时间更长。
总结来说,朴素贝叶斯是贝叶斯方法的一个简化版本,通过“朴素”假设来降低复杂度,适用于对计算效率要求高的场景。而一般的贝叶斯方法能更灵活地处理特征依赖,但计算复杂度相对较高。
3.3 SVM
SVM 的中文叫支持向量机,英文是 Support Vector Machine,简称 SVM。SVM 在训练中建立了一个超平面的分类模型。如果你对超平面不理解,没有关系,我在后面的算法篇会给你进行介绍。
3.4 KNN
KNN 也叫 K 最近邻算法,英文是 K-Nearest Neighbor。所谓 K 近邻,就是每个样本都可以用它最接近的 K 个邻居来代表。如果一个样本,它的 K 个最接近的邻居都属于分类 A,那么这个样本也属于分类 A。
3.5 AdaBoost
Adaboost 在训练中建立了一个联合的分类模型。boost 在英文中代表提升的意思,所以 Adaboost 是个构建分类器的提升算法。它可以让我们多个弱的分类器组成一个强的分类器,所以 Adaboost 也是一个常用的分类算法。
3.6 CART
CART 代表分类和回归树,英文是 Classification and Regression Trees。像英文一样,它构建了两棵树:一棵是分类树,另一个是回归树。和 C4.5 一样,它是一个决策树学习方法。
3.7 Apriori
Apriori 是一种挖掘关联规则(association rules)的算法,它通过挖掘频繁项集(frequent item sets)来揭示物品之间的关联关系,被广泛应用到商业挖掘和网络安全等领域中。频繁项集是指经常出现在一起的物品的集合,关联规则暗示着两种物品之间可能存在很强的关系。
- 关联规则是一种用来表达数据中不同项(物品)之间关系的规则。它通常以“如果…,那么…”的形式表达。比如在购物数据中:如果客户购买了某种商品,那么很可能还会购买另一种商品。「如同要和女朋友去酒店,就要买避孕套」
- 关联规则的目标是找到数据中不同项之间的关系,从而帮助我们发现潜在的规律。例如,发现“买面包的人通常还会买牛奶”这样的规则可以用于营销决策。
- 频繁项集是指在数据中经常一起出现的物品集合。Apriori 算法通过找出频繁出现的项集来构建关联规则。
- 比如在超市购物数据中,如果“面包”和“牛奶”经常一起出现在购物蓝中,它们就组成了一个频繁项集。
- 频繁项集揭示了物品之间的潜在联系,为关联规则的生成提供基础。
- 项集就是一组项(物品)的集合。例如,在购物数据中,一个项集可能是
{面包,牛奶,黄油}
,表示某个购物篮中包含这些商品。 - 项集可以包含不同数量的项。例如
{面包}
是一个单项集,{面包, 牛奶}
是一个双项集,依此类推。 - 在 Apriori 算法中,项集的频繁程度决定了它是否被用来生成关联规则。
总结:Apriori 算法主要是通过找出频繁出现的项集,来建立不同物品之间的关联规则。通过分析这些规则,我们可以了解不同物品之间的关系,并将这些发现应用于商业决策(如关联销售)和网络安全(如发现异常访问模式)等领域。
在 Python 中,项集通常可以用集合(set) 来表示,因为集合具有以下特点,非常适合于项集的表示和处理:
- 元素唯一性: 集合中的元素是唯一的,这可以避免重复项。
- 无序性:集合是无序的,正好符合项集的需求。
- 快速的集合运算:集合支持高效的并集、交集、差集等运算,这对于挖掘频繁项集时的计算非常有用。
为什么不用列表或元组?
- 列表(list):虽然列表可以存储多个元素,但它允许重复项,不适合表示项集。此外,列表的集合运算效率不如集合。
- 元组(tuple):元组是不可变类型,适用于不需要修改的场景。而在挖掘关联规则过程中,项集需要动态组合或修改,因此元组也不太适合。
示例代码
在 Python 中,可以用 set 来表示项集,例如:
# 创建一个项集
item_set = {"牛奶", "面包", "黄油"}
# 添加新项
item_set.add("鸡蛋")
# 另一个项集
another_set = {"牛奶", "面包"}
# 计算交集(同时存在于两个项集中的项)
common_items = item_set.intersection(another_set)
print("交集:", common_items)
print("交集直接计算:", item_set & another_set)
# 计算并集(两个项集中所有的项)
all_items = item_set.union(another_set)
print("并集:", all_items)
print("并集直接计算:", item_set | another_set)
another_set2 = {"牛奶", "面包", "三明治", "汉堡包"}
# 差集(difference):返回存在于一个集合但不在另一个集合中的元素
difference_items = item_set.difference(another_set2) # 计算差集(item_set 中有,但 another_set 中没有的项)
print("差集(item_set - another_set):", difference_items)
print("差集直接计算:", item_set - another_set2)
# 对称差集(symmetric difference):返回只在其中一个集合中出现的元素(不同时出现在两个集合中的元素)
symmetric_difference_items = item_set.symmetric_difference(another_set2)
print("对称差集:", symmetric_difference_items)
print("对称差集直接计算:", item_set ^ another_set2)
# 对称差集可以用其他三种集合操作来实现吗?如何实现?
all_items = item_set | another_set2 # 并集
common_items = item_set & another_set2 # 交集
print(all_items - common_items)
# ---output---
交集: {'面包', '牛奶'}
交集直接计算: {'面包', '牛奶'}
并集: {'鸡蛋', '面包', '黄油', '牛奶'}
并集直接计算: {'鸡蛋', '面包', '黄油', '牛奶'}
差集(item_set - another_set): {'黄油', '鸡蛋'}
差集直接计算: {'黄油', '鸡蛋'}
对称差集: {'汉堡包', '黄油', '鸡蛋', '三明治'}
对称差集直接计算: {'汉堡包', '黄油', '鸡蛋', '三明治'}
{'黄油', '汉堡包', '三明治', '鸡蛋'}
- 无序性:没有顺序,也就是没有下标;
- 确定性:每个人值都是确定的;
- 互异性:每个值都是不重复的,出现重复不会报错,会自动去除;
- 可变性:集合的数据可以添加;
3.8 K-Means
K-Means 算法是一个聚类算法。你可以这么理解,最终我想把物体划分成 K 类。假设每个类别里面,都有个“中心点”,即意见领袖,它是这个类别的核心。现在我有一个新点要归类,这时候就只要计算这个新点与 K 个中心点的距离,距离哪个中心点近,就变成了哪个类别。
假设我们有一堆水果,想把它们分成三类(K=3),比如苹果、香蕉和橘子。我们可以假设每种水果的“中心点”代表了该类别的典型特征(比如苹果是红色和圆形的,香蕉是黄色和弯的)。当我们有一个新水果进来时(比如红色的圆形水果),我们计算它与三个类别中心的距离,看它最像哪一种水果。若最像苹果,就归到苹果类。
在一个商场里,顾客的消费行为可以分为几类(比如高消费、中等消费和低消费)。我们用每个类别的消费特征(中心点)来代表该类别的顾客特点,比如高消费顾客可能经常购买高价商品,而低消费顾客只买日用品。当有新顾客的消费记录时,可以将其与三个类别的中心点比较,看他最接近哪类消费习惯,从而将其归入相应的顾客群体中。
假设我们想根据观众的喜好将电影分为几类,比如动作片、喜剧片和爱情片。每个类别的中心点代表了这个类型的典型特征,比如动作片的中心点可能有高动作场景、紧张情节等。当有一部新电影出现时,我们通过计算它与每个中心点的相似度,确定它更偏向于哪个类别,从而将其归类。
3.9 EM
EM 算法也叫最大期望算法,是求参数的最大似然估计的一种方法。原理是这样的:假设我们想要评估参数 A 和参数 B,在开始状态下二者都是未知的,并且知道了 A 的信息就可以得到 B 的信息,反过来知道了 B 也就得到了 A。可以考虑首先赋予 A 某个初值,以此得到 B 的估值,然后从 B 的估值出发,重新估计 A 的取值,这个过程一直持续到收敛为止。
EM 算法经常用于聚类和机器学习领域中。
假设有一个笼子里有鸡和兔子,我们只知道头的数量和脚的数量,想要估计鸡和兔子的数量。可以先假设鸡的数量(参数 A)的一个初值,然后计算兔子的数量(参数 B),再基于这个估计的兔子数量反过来修正鸡的数量,如此迭代,直到两者的估计值不再显著变化。
假设我们对消费者的偏好(参数 A)和产品特征(参数 B)不太了解,只观察到消费者的购买行为。可以先随机给出一个消费者偏好的初始值,然后根据这个初值对每个产品进行分类,从而估计产品特征。接着,根据得到的产品特征反过来再去估计消费者的偏好,如此反复更新,直到消费者偏好和产品特征的估计值收敛为止。
假设我们有用户对内容的评分数据,但不清楚用户的兴趣(参数 A)和内容的特征(参数 B)。可以先随机初始化用户兴趣的值,然后根据内容特征的估计值计算每个用户对内容的偏好。然后反过来,根据内容特征更新用户的兴趣,如此迭代,逐步逼近真实的用户兴趣和内容特征。
假设我们不知道某些基因型(参数 A)和表型(参数 B)之间的关系,但观察到表型的表现。可以假设基因型的初值,然后根据表型特征估计基因型的可能值,再根据基因型重新估计表型的分布,重复迭代,直到结果收敛,得到基因和表型间的估计关系。
这些例子展示了 EM 算法的核心思想:通过交替估计互相依赖的两个未知参数,并在每次迭代中更新它们的估计值,直到找到使得数据最符合的参数估计。
3.10 PageRank
PageRank 起源于论文影响力的计算方式,如果一篇论文被引入的次数越多,就代表这篇论文的影响力越强。同样 PageRank 被 Google 创造性地应用到了网页权重的计算中:当一个页面链出的页面越多,说明这个页面的“参考文献”越多,当这个页面被链入的频率越高,说明这个页面被引用的次数越高。基于这个原理,我们可以得到网站的权重划分。
算法可以说是数据挖掘⛏️的灵魂,也是最精华的部分。这 10 个经典算法在整个数据挖掘领域中的得票最高的,后面的一些其他算法也基本上都是在这个基础上进行改进和创新。今天你先对十大算法有一个初步的了解,你只需要做到心中有数就可以了,具体内容不理解没有关系,后面我会详细给你进行讲解。
4. 数据挖掘的数学原理
我说了这么多数据挖掘中的经典算法,但是如果你不了解概率论和数理统计,还是很难掌握算法的本质;如果你不懂线性代数,就很难理解矩阵和向量运作在数据挖掘中的价值;如果你没有最优化方法的概念,就对迭代收敛理解不深。所以说,想要更深刻地理解数据挖掘的方法,就非常有必要了解它后背的数学原理。
4.1 概率论与数理统计
概率论在我们上大学的时候,基本上都学过,不过大学里老师教的内容,偏概率的多一些,统计部分讲得比较少。在数据挖掘里使用到概率论的地方就比较多了。比如条件概率、独立性的概念,以及随机变量、多维随机变量的概念。
很多算法的本质都与概率论相关,所以说概率论与数理统计是数据挖掘的重要数学基础。
4.2 线性代数
向量和矩阵是线性代数中的重要知识点,它被广泛应用到数据挖掘中,比如我们经常会把对象抽象为矩阵的表示,一幅图像就可以抽象出来是一个矩阵,我们也经常计算特征值和特征向量,用特征向量来近似代表物体的特征。这个是大数据降维的基本思路。
基于矩阵的各种运算,以及基于矩阵的理论成熟,可以帮我们解决很多实际问题,比如 PCA 方法、SVD 方法,以及 MF、NMF 方法等在数据挖掘中都有广泛的应用。
4.3 图论
社交网络的兴起,让图论的应用也越来越广。人与人的关系,可以用图论上的两个节点来进行连接,节点的度可以理解为一个人的朋友数。我们都听说过人脉的六度理论,在 Facebook 上被证明平均一个人与另一个人的连接,只需要 3.57 个人。当然图论对于网络结构的分析非常有效,同时图论也在关系挖掘和图像分割中有重要的作用。
4.4 最优化方法
最优化方法相当于机器学习中自我学习的过程,当机器知道了目标,训练后与结果存在偏差就需要迭代调整,那么最优化就是这个调整的过程。一般来说,这个学习和迭代的过程是漫长、随机的。最优化方法的提出就是用更短的时间得到收敛,取得更好的效果。
5. 总结
今天我列了下学习数据挖掘你要掌握的知识清单,只有你对数据挖掘的流程、算法、原理有更深的理解,你才能在实际工作中更好地运用,我将在后面的章节中对它们进行一一介绍。

最后给你留道思考题吧。
今天我给你讲了如何学习数据挖掘,你从中有什么样的体会呢?如果某电商网站想挖掘商品之间的关联关系,从而提升销售额,你觉得可以采用上面的哪个算法?为什么?
欢迎在留言区和我讨论,也欢迎点击“请朋友读”,把这篇文章分享给你的朋友或者同事,一起来交流,一起来进步。
欢迎关注我公众号:AI悦创,有更多更好玩的等你发现!
公众号:AI悦创【二维码】

AI悦创·编程一对一
AI悦创·推出辅导班啦,包括「Python 语言辅导班、C++ 辅导班、java 辅导班、算法/数据结构辅导班、少儿编程、pygame 游戏开发」,全部都是一对一教学:一对一辅导 + 一对一答疑 + 布置作业 + 项目实践等。当然,还有线下线上摄影课程、Photoshop、Premiere 一对一教学、QQ、微信在线,随时响应!微信:Jiabcdefh
C++ 信息奥赛题解,长期更新!长期招收一对一中小学信息奥赛集训,莆田、厦门地区有机会线下上门,其他地区线上。微信:Jiabcdefh
方法一:QQ
方法二:微信:Jiabcdefh
