本文适合有一定Python Pandas基础,但又对机器学习/数据分析感兴趣又不熟悉的朋友们。
这个项目的数据是美国各个社区的犯罪数据(community crime data),里面有美国各个community (城市或者城镇或者县)的人口特征的数据(包括种族、年龄、家里几口人、有几个孩子等等)、经济情况(有多少人贫困、有多少人需要公共福利、平均收入、投资收入等等)、执法相关的数据(有多少巡警、有多少人报案、有多少警车) 和犯罪率(分为暴力犯罪率和非暴力犯罪率),一共2215行,每行代表一个community的情况。
分析的目标是对这些community 进行分类,看什么类别的community犯罪率高。进一步如果你想选择居住地或者警察需要分配警力都可以根据你分类的结果来做决策。
解决方案:
-
这需要我们用机器学习里的聚类算法(clustering algorithm)来解决这个问题,我选择的是聚类算法里最常用的K-means clustering。
-
编程语言: Python。
数据分析难点:
1.列非常多,有147列,这非常不利于我们应用一些机器学习模型,因为
-
维度的诅咒(Curse of Dimensionality):
随着特征数量的增加,数据空间的维度增加,这可能导致样本数据在这个高维空间内稀疏分布。
这意味着为了可靠地学习数据模式,需要大量的数据点。
而且,在高维空间中,很多机器学习算法的性能会下降,因为距离(如欧几里得距离)在高维度中的计算变得不那么有效。
-
过拟合(Overfitting):
当模型拥有大量特征时,它可能会学习到数据中的噪音而非真正的模式。
这意味着模型可能在训练数据上表现得非常好,但是在未见过的新数据上表现不佳。
-
计算复杂度增加:
更多的特征意味着更高的计算复杂度。
这不仅增加了训练模型所需的时间和计算资源,也可能增加模型推理时的延迟。
-
可解释性降低:
具有大量特征的模型往往难以解释和理解。
这在需要模型透明度和可解释性的应用中是一个重要问题,比如在金融服务或医疗保健行业。
所以我会采用特征选择(feature selection)和特征降维(feature extraction)技术,以减少特征数量,同时保留最重要的信息。这有助于提高模型的性能和泛化能力,同时降低计算成本。
2.很多缺失值,这可能导致模型无法完全学习数据中的关系和模式,从而影响模型的准确性和可靠性。需要我们用合理的方法处理。
作者注:
-
这个项目中数据不是重点,你可以替换成任何你想分析的数据,但是分析思路和建模方法都是类似的,完全可以套用。
聚类分析其实在市场营销中的个性化定向广告的应用上尤其广泛,相信大家也一定对消费者行为分类不陌生,聚类分析就是消费者分类 (customer segmentation)的典型应用。
读数据是再简单不过的事,在这里不做赘述。数据大概长下图的样子
1、数据清理
1.1 首先就是处理缺失值,从上图也可以看出很多缺失值用的问号,所以我们需要先做一步替换。这里有一列很多0也是应该换成NULL,现实中很多时候数据表中的0也不是代表数字0,而是不知道是什么而自动填充的数字,这时候也需要先把0替换成NULL,再查缺失值,要具体情况具体分析。
计算每列缺失值的百分比
我们会发现很多与执法相关的数据缺失。我选择处理缺失值的方法是:
1. 删除超过 50% 缺失值的列,因为插值(impute) 可能不可靠;
2. 对缺失值较少的列使用中位数进行插值,因为中位数比平均值对异常值更稳健。
这步骤之后我们还有123列。
1.2 移除与研究问题无关的列
我们想研究社区人口统计学(demographics)和社会经济学(socioeconomics)与犯罪率之间的关系,所以和这些指标没关系的列就被删除了。代码如下
在这次清理后,我们剩下了 68 个数值列(除去社区名,州名还有暴力和非暴力犯罪率)。在数据转换和标准化后,我还进一步进行了降维处理,稍后会具体讲解。
1.3 处理异常值和偏斜度 skewness.
我使用了箱形图(boxplot)来可视化异常值。由于变量众多,我选了一部分对研究问题影响最大的关键变量:比如人口统计特征中各个种族人的比例、年龄百分比、薪资中位数、就业率,犯罪率种的暴力犯罪人口比(ViolentCrimesPerPop)和非暴力犯罪人口比(nonViolPerPop)。箱形图显示了所选列中异常值的存在。异常值通常表现为超出箱形图须线的点。代码如下:
然而,在决定如何处理这些异常值之前,考虑数据的上下文是重要的。例如,在犯罪数据中,异常值可能代表实际的罕见或极端事件,对某些类型的分析可能很有价值,所以我决定不移除异常值,而是考虑对这次分析进行对数变换(log transformation),我计算了这些属性的偏斜度,并对偏斜度高的列(绝对值>1)进行了对数变换。代码如下:
其中负数代表列的数值分布是左偏斜(负偏斜),正数代表列的数值分布是右偏斜(正偏斜)。
1.4 标准化(Standardization)
是应用机器学习算法之前常见的预处理步骤,尤其是对数据规模敏感的算法,如 K 均值聚类 (k-means clustering)。我们对所有数值列进行了标准化,使它们的平均值为 0,标准差为 1。
02、特征降维(feature extraction)
考虑到我们仍有 68 个数值列,我考虑使用降维(dimensionality reduction)技术进一步精炼我们的列,并为 K 均值聚类做准备。这里我选择了主成分分析(PCA)进行降维。
PCA(主成分分析)通过创建“主成分”,将数据转换为新的坐标系统,这些主成分彼此正交(即不相关),并且是原始数据变量的线性组合。每个主成分都按照其解释数据方差的能力排序。第一个主成分解释了最多的方差,第二个主成分(与第一个正交)解释了其余方差中最多的部分,依此类推。以下代码表示27个主成分解释了数据95%的方差,第一个主成分单独解释了大约 28% 的方差,前两个主成分共解释了大约 45.8% 的方差。
下图是一个解释方差比率和主成分个数的可视化,用以展示数据集中每个主成分占据的方差比例。
我决定选前20个主成分为k-means clustering做准备。
也还可以进一步探索每个主成分代表的原数据列的含义:
上图x轴列出了原始列名,y轴代表了每个特征在主成分中的权重,条形的大小(正或负)表示原始列与主成分之间关系的强度。剩下三个主成分的图由于篇幅限制没做呈现。
1.第一主成分:在如`population`(人口)、`racepctblack`(黑人比例)、`racePctHisp`(西班牙裔比例)等特征上有正的权重,在`racePctWhite`(白人比例)上有负的权重。这表明第一主成分可能代表着黑人和西班牙裔人口较多的地区与白人人口较多的地区之间的对比。
2.第二主成分:这个成分在`racePctAsian`(亚洲人比例)、`racePctHisp`、`PctForeignBorn`(外国出生比例)等特征上有显著的正权重,在`agePct65up`(65岁以上比例)和`PctBornSameState`(同州出生比例)上有负权重。这可能表明第二主成分对比的是年轻、多元化(特别是亚洲和西班牙裔)和更多外籍出生人口的地区与老年、较少多元化和更多本地出生人口的地区。
3.第三主成分:可能捕捉到年轻人口较多的地区与老年或更多西班牙裔和外籍出生人口的地区之间的对比。
4.第四主成分:它可能对比的是老年人口较多且可能拥有房屋和使用公共交通的地区。
每个主成分捕捉数据中不同方面的差异,它们在原始特征上的权重可以帮助我们理解每个成分代表的具体对比或模式。
03、K-均值聚类 (K-means clustering)
找到社区相似性并根据其简化的特征集(20 principal components)对社区进行划分。
3.1 使用肘部方法(elbow method)确定最佳簇数。这涉及到绘制簇内平方和(WCSS: within-cluster sum of squares)与簇数的关系图,并寻找减少速率急剧变化的“肘点”。从下面的图表中,我们确定簇数为 4。
3.2 对预处理后的数据集运用确定的簇数进行了 K-均值算法,并使用轮廓分数 (silhouette score)来评估 K-均值聚类结果的质量。
较高的轮廓分数表明簇之间分离得更好。我们的轮廓分数为 0.19,表明簇之间并不是非常明显但还是合理的。这个分数表明,尽管存在一定的分离,但簇之间并不是非常清晰地区分开。
3.3 为了解释每个簇的特征,我们在原始标准化数据框中添加了簇标签,并计算了每个簇内属性的平均值。
每个簇(cluster)可能代表的概要:
Cluster 0: 此群体有相对较高的亚洲人口,较大比例的年轻人,在这个群体中,暴力和非暴力犯罪率略高于平均水平。
Cluster 1: 以较高的黑人口为特征,老年人口比例较高且中等收入较低,教育程度低。贫困率、失业率、公共援助领取和离婚率都很高。这个群体可能代表着一个处于劣势的黑人社区。这个群体中的暴力和非暴力犯罪率都高于平均水平。
Cluster 2: 这个群体中,西班牙裔人口比例极高。人口年轻,21岁以下人口比例高。收入和教育程度低。贫困率、失业率和公共援助领取都很高,同时在制造业的就业也很高。这个群体似乎代表着一个处于劣势的西班牙裔社区。这个群体中暴力犯罪率明显较高,非暴力犯罪率也相对较高。
Cluster 3: 这个群体中,白人口比例高,中等收入、教育水平和管理/专业职业的就业率也高。然而,贫困率、失业率、公共援助领取和离婚率都非常低。Cluster 3代表一个富裕、繁荣的白人社区,它在所有群体中暴力犯罪率最低,非暴力犯罪率也低于平均水平。
3.4 如果你想进一步用可视化解释你的分类,可以任意选择你感觉比较重要的两列,然后进行下图的可视化,对角线上的图表示了不同cluster在该列的分布,比如图3行3列是外国人比重,其中绿色的cluster(即cluster2)是外国人最多的类。图3行3列是65岁以上的人比重,其中蓝色(即cluster1)是老年人更多的类。
如何学习大模型 AI ?
由于新岗位的生产效率,要优于被取代岗位的生产效率,所以实际上整个社会的生产效率是提升的。
但是具体到个人,只能说是:
“最先掌握AI的人,将会比较晚掌握AI的人有竞争优势”。
这句话,放在计算机、互联网、移动互联网的开局时期,都是一样的道理。
我在一线互联网企业工作十余年里,指导过不少同行后辈。帮助很多人得到了学习和成长。
我意识到有很多经验和知识值得分享给大家,也可以通过我们的能力和经验解答大家在人工智能学习中的很多困惑,所以在工作繁忙的情况下还是坚持各种整理和分享。但苦于知识传播途径有限,很多互联网行业朋友无法获得正确的资料得到学习提升,故此将并将重要的AI大模型资料包括AI大模型入门学习思维导图、精品AI大模型学习书籍手册、视频教程、实战学习等录播视频免费分享出来。
第一阶段(10天):初阶应用
该阶段让大家对大模型 AI有一个最前沿的认识,对大模型 AI 的理解超过 95% 的人,可以在相关讨论时发表高级、不跟风、又接地气的见解,别人只会和 AI 聊天,而你能调教 AI,并能用代码将大模型和业务衔接。
- 大模型 AI 能干什么?
- 大模型是怎样获得「智能」的?
- 用好 AI 的核心心法
- 大模型应用业务架构
- 大模型应用技术架构
- 代码示例:向 GPT-3.5 灌入新知识
- 提示工程的意义和核心思想
- Prompt 典型构成
- 指令调优方法论
- 思维链和思维树
- Prompt 攻击和防范
- …
第二阶段(30天):高阶应用
该阶段我们正式进入大模型 AI 进阶实战学习,学会构造私有知识库,扩展 AI 的能力。快速开发一个完整的基于 agent 对话机器人。掌握功能最强的大模型开发框架,抓住最新的技术进展,适合 Python 和 JavaScript 程序员。
- 为什么要做 RAG
- 搭建一个简单的 ChatPDF
- 检索的基础概念
- 什么是向量表示(Embeddings)
- 向量数据库与向量检索
- 基于向量检索的 RAG
- 搭建 RAG 系统的扩展知识
- 混合检索与 RAG-Fusion 简介
- 向量模型本地部署
- …
第三阶段(30天):模型训练
恭喜你,如果学到这里,你基本可以找到一份大模型 AI相关的工作,自己也能训练 GPT 了!通过微调,训练自己的垂直大模型,能独立训练开源多模态大模型,掌握更多技术方案。
到此为止,大概2个月的时间。你已经成为了一名“AI小子”。那么你还想往下探索吗?
- 为什么要做 RAG
- 什么是模型
- 什么是模型训练
- 求解器 & 损失函数简介
- 小实验2:手写一个简单的神经网络并训练它
- 什么是训练/预训练/微调/轻量化微调
- Transformer结构简介
- 轻量化微调
- 实验数据集的构建
- …
第四阶段(20天):商业闭环
对全球大模型从性能、吞吐量、成本等方面有一定的认知,可以在云端和本地等多种环境下部署大模型,找到适合自己的项目/创业方向,做一名被 AI 武装的产品经理。
- 硬件选型
- 带你了解全球大模型
- 使用国产大模型服务
- 搭建 OpenAI 代理
- 热身:基于阿里云 PAI 部署 Stable Diffusion
- 在本地计算机运行大模型
- 大模型的私有化部署
- 基于 vLLM 部署大模型
- 案例:如何优雅地在阿里云私有部署开源大模型
- 部署一套开源 LLM 项目
- 内容安全
- 互联网信息服务算法备案
- …
学习是一个过程,只要学习就会有挑战。天道酬勤,你越努力,就会成为越优秀的自己。
如果你能在15天内完成所有的任务,那你堪称天才。然而,如果你能完成 60-70% 的内容,你就已经开始具备成为一名大模型 AI 的正确特征了。