近两年人工智能技术蓬勃发展,OpenAI连续放出ChatGPT、Sora等“王炸”产品,大模型、AIGC等技术带来了革命性的提升,很多人认为人工智能将引领第四次工业革命。国内各大互联网公司也是重点投资布局,从个人角度来说要尽快跟上时代的潮流,有一句话说得好,“未来,淘汰你的不是AI,而是那些懂得运用AI的人!”。我们的初衷是从热火朝天的技术浪潮中回归冷静,深入理解和跟进AI技术的发展动态,并通过一系列实例解析,渐进式地引导读者掌握AI领域的知识体系。如今,我们决定将这些宝贵的学习资料公之于众,以期对广大初涉AI领域的学习者带来实质性的启迪和帮助。
引言
本文以经典的鸢尾花分类问题为切入点,生动详实地介绍传统机器学习任务中的分类任务所涉及的核心技术。我们将借助Python技术栈的强大工具——如pandas的数据处理功能、sklearn的机器学习算法库、matplotlib及seaborn的数据可视化工具以及numpy的科学计算能力,引领读者步入机器学习的奇妙世界,开启一场融合理性与艺术的探索之旅。
在探索具体的分类任务之前,我们先简介下人工智能的背景。人工智能的历史可以追溯到20世纪40-50年代。在1956年的达特茅斯会议上人工智能被正式确立为一个学科。人工智能(AI)是指使计算机系统具备模拟和模仿人类智能的能力,而机器学习(ML)是实现AI的一种方法,深度学习(DL)则是机器学习中使用深层神经网络模型的一种技术。下图[1]是他们三者之间的关系。
图1:人工智能(AI)、机器学习(ML)和深度学习(DL)之间的关系
机器学习算法有多种分类方法[2][3],从机器学习任务来分主要有分类、回归、聚类和降维等方法,本文从一个机器学习的经典任务“鸢尾花分类”为例,来介绍一些常见的数据分析方法和工具的使用。
图2:机器学习的多种分类方法
鸢尾花数据
在使用算法之前,我们先用统计和可视化工具对数据进行初步分析,这样便于直观理解数据的统计值、分布和相关性等信息。
工具:pandas、seaborn
方法:描述性统计、数据分布、相关性分析等
目的:从统计和视觉角度分析数据的基本情况
▐ 数据集简介
鸢尾花包含很多种类,这个数据集包含 3 种:“山鸢尾”(Setosa),“杂色鸢尾”(Versicolor)和“维吉尼亚鸢尾”(Virginica)[1]。三种花在花萼(sepal)长度和宽度以及花瓣(petal)的长度和宽度上有非常明显的区别,详见下图所示:
图3:三种鸢尾花的花萼(sepal)以及花瓣(petal)的长度和宽度
这三个分类标签就是我们想要预测的分类,即因变量。其中,每个物种有50条数据,每条数据包含4个变量,我们把它称为自变量(或特征):花瓣长度、花瓣宽度、花萼长度、花萼宽度。花萼是由叶子演化而来,起到保护花蕾的作用。我们可以用pandas读取csv文件(读取为二维表格格式的DataFrame对象),然后看下前10条数据。
import pandas as pd iris = pd.read_csv('./iris.csv', names=['sepal_length', 'sepal_width', 'petal_length', 'petal_width', 'class']) print(iris.head(10))
图4:鸢尾花数据集的前10条数据
可以用图形展示三个类别的数据(数据中0-50条,51~100条,101~150条是同一个类别未打散,正好可以看出三类数据的区别)。
iris.plot.line(stacked=False)
图5:三种类别鸢尾花的四个字段的真实值
使用pandas DataFrame的describe方法打印描述性统计信息。从中可以看出四个特征字段的各个统计值,如均值、方差、四分位数等。
iris.describe()
图6:鸢尾花数据集的描述性统计
结合numpy分组聚合方法打印不同鸢尾花类别的几个特征字段的均值。可以看出三类鸢尾花的花萼长宽、花瓣长宽等特征值有显著的区分。
import numpy as np # 读取csv略过 print(iris.groupby(['class']).agg({ 'sepal_length': np.mean, 'sepal_width': np.mean, 'petal_length': np.mean, 'petal_width': np.mean }))
图7:三种类别鸢尾花的字段均值
▐ 数据分布
- 直方图
直方图是一种显示连续变量的分布情况的图表,通过将数据分成不同的区间(通常称为“bin”或“桶”),并统计每个区间中数据的频数或概率密度来展示数据的分布情况。直方图是由统计学家Karl Pearson在19世纪末引入的,它可以帮助我们了解数据的集中趋势、离散程度以及异常值情况。下面,使用直方图查看各个特征属性的分布区间。
iris.plot(kind='hist', subplots=True, layout=(2, 2), figsize=(10, 10))
图8:鸢尾花四个属性的直方图(分箱频数)
- 核密度估计(KDE)
我们使用微分思想,将频率直方图的组距一步步减小,随着组距的减小,矩形宽度越来越小,因此,在极限情况下频率直方图就会变成一条曲线,而这条曲线即为概率密度曲线。核密度估计(kernel density estimation,简称 KDE)是一种用于估计这条曲线的概率密度函数(probability density function,PDF)的统计方法[14]。它通过对样本点周围使用内核函数(kernel function)加权平均来得到密度估计值。
核函数是一种用于估计概率密度函数的函数形式。通俗来说,核函数就是一个用来描述数据点附近密度的函数。核函数通常是一个关于距离的函数,它衡量了一个数据点附近的其他数据点对该位置的贡献。核密度估计的思想是将每个数据点作为中心,通过核函数来计算该位置附近的密度贡献值,然后将所有数据点的贡献值加起来得到整体的概率密度估计。常见的核函数有高斯核函数(也叫正态核函数)和Epanechnikov核函数。
通过概率密度曲线可以看出更细致的取值概率。
iris.plot(kind='kde')
图9:鸢尾花数据集四个变量的KDE曲线
当然,再加上各个鸢尾花类别,可以看2维KDE的分布。
'Iris-setosa'] virginica = iris.loc[iris['class'] == 'Iris-virginica'] versicolor = iris.loc[iris['class'] == 'Iris-versicolor'] sns.kdeplot(x=setosa.sepal_width, y=setosa.sepal_length, shade=True, alpha=0.7, color='blue', linewidth=2.5) sns.kdeplot(x=virginica.sepal_width, y=virginica.sepal_length, shade=True, alpha=0.7, color='red', linewidth=2.5) sns.kdeplot(x=versicolor.sepal_width, y=versicolor.sepal_length, shade=True, alpha=0.7, color='green', linewidth=2.5)
图9:鸢尾花数据集3种类别2个特征的二维KDE曲线
除此之外也有一些其他方法可以查看数据的分布,例如:箱线图、小提琴图、六边形分箱图等,本文不做过多介绍。
▐ 相关性
- 相关性系数
皮尔逊相关性系数(Pearson Correlation)是衡量向量相似度的一种方法。输出范围为-1到+1, 0代表无相关性,负值为负相关,正值为正相关。数值越接近1越相关。
iris.iloc[:, :4].corr()
图10:鸢尾花数据集4个特征的相关性系数
将皮尔逊相关性系数矩阵绘制成热力图可以清楚地看出变量之间的相关关系:花萼长度和宽度没有相关性,而花瓣长度和宽度的相关性很明显。
sns.heatmap(iris.iloc[:, :4].corr(), annot=True, cmap='YlGnBu')
图11:鸢尾花数据集4个特征的相关性系数热力图
- 散点矩阵
可以用seaborn绘制出三种花的各个属性的散点矩阵。用于查看数据的相关性和概率密度分布。
import seaborn as sns # 其他代码略过 sns.pairplot(iris, hue='class', diag_kind='kde')
图12:鸢尾花数据集4个特征的散点矩阵
分类算法入门:以鸢尾花数据集为例(下):https://developer.aliyun.com/article/1480493