1. 人工智能
通俗来讲,只要一个系统具备一定的智能,同时可以帮助我们做一些决策,我们都可以把它列为AI系统。
Al is the field that studies the synthesis and analysis Of computational agents that act intelligently.
Think like humans Think rationally
Act like humans Actr ationally
分析犯罪嫌疑人生活轨迹及可能出现的场所,利用了计算机视觉(CV)技术和大数据分析犯罪嫌疑人生活轨迹及可能出现的场所;
在线客服,让人人都享受一对一专业服务,在线客服需要使用自然语言处理技术;
快速进行癌症早期筛查,帮助患者更早发现病灶,通过分析病理图像和其他一些身体状态特征得出。
AI和 BI 最大的区别在于, AI可以帮助我们做决策, 但BI更多的是辅助人做决策。
- AI + 教育 ->因材施教、 人工智能助教、 人工智能老师、 自动判卷
- AI + 金融 ->大数据风控、 量化投资、 智能保险
- AI + 农业 ->种子、种植、管理等
- AI + 医疗 ->病情演变、图形分析等
- AI + 汽车 ->自动驾驶
- AI + 广告 ->精准投放
全民AI(中小学):
数据思维(从数据中发掘价值)、 迭代思维、 最优化思维等
2. 机器学习与深度学习
机器学习自动帮我们从数据中挖掘并总结规律,广泛应用在电商推荐、无人驾驶、人脸识别、金融风险评估等应用。
FieId of study that gives computers the ability to learn without being explicitly programmed.
想用程序来辨别张三和李四两个人。一种实现方法是根据它俩的 显著特征 来设计规则如:假如一个人比较高、偏胖、脸上有皱纹,同时拥有啤酒肚就识别为张三,否则为李四。这种实现方案是基于人的 先验知识 的,也就把一个人已经了解到的知识提前写成规则的形式。
机器学习的运作方式恰好跟这个相反:假如我们手里有若干张张三和李四的照片,然后给机器看,同时告诉机器哪个是张三,哪个是李四。之后我们期待机器可以从这些数据中自动寻找可以分辨张三和李四的规律出来,这叫作机器学习。
- 机器学习技术可以帮助我们从数据中自动找出规律,并把这个规律应用在未来的任务中。
- 机器学习通常需要依赖于大量的数据。数据量越大,通常总结出来的规律就会越准确,对于预测效果也越好。
- 机器学习,从字面意思上可以理解为 ”机器“从数据中自动“学习”规律,而不是我们提前告诉机器具体怎么做,后者也称之为经验主义。
AI的崛起过程中有两件非常具有代表性的事件,一个是2012年的ImageNet竞赛, 另外一个是2015年的AlphaGo事件,利用的都是深度学习。
Deep Learning is a subfield Of machine learning concerned with algorithms inspired by the structure and function 0f the brain called artificial neural networks.
深度学习并不特指某一个模型,而是泛指某一类模型。一个模型如果是属于深度学习范畴,它必将具有比较”深“的结构。这种”深“度通常是通过把一系列简单的模型通过不断叠加的方式来实现的。
- 深度神经网络
- 深度随机森林
- 深度高斯混合模型
- 深度BI-LSTM
比如深度神经网络就是把经典的神经网络不断叠加在一起;深度随机森林就是把随机森林不断叠加在一起。
主流的深度学习模型
- 深度神经网络(Deep Neural Networks)
- 卷积网络(Convolutional Neural Networks) -- 图像
- 循环神经网络(Recurrent Neural Networks) -- 时序数据
- 递归神经网络(Recursive Neural Networks) -- 递归方式构造
- 生成式对抗网络(Generative Adversarial Networks) -- 生产图片
常用工具:
- Numpy、 Pandas、 matplotlib
- scikit_learn(机器学习算法)
- spark MLib(分布式-大数据环境)
- PyTorch、 keras、 TensorFlow (深度学习框架)
从应用的角度,AI技术可以分为三大类: 视觉、自然语言和语音。
文本(自然语言处理)、 图像| 视频(图像识别)、 语音识别(音频、语音)
AI领域顶级会议
- AI全领域:AAAI、IJCAI
- 机器学习领域:Neurips、ICML、UAI、AISTATS
- 深度学习领域:ICLR
- 计算机视觉领域:CVPR、ICCV、ECCV
- 自然语言处理领域:ACL、EMNLP、COLING、NAACL
- 数据挖掘领域:KDD、WSDM、SDM
- 语音识别领域:ICASSP、INTERSPEECH
机器学习基本概念
监督学习、无监督学习、回归、分类。
监督学习和无监督学习的区别
前者处理的数据是带有标签(label)的,后者处理的数据则没有标签的。由于后者的数据没有被标记,我们就无法做预测。
除了 监督学习 和 无监督学习 ,其实还有一类叫作强化学习(reinforcement learning)。AlphaGo就是强化学习最经典的代表作。虽然在棋牌等任务上强化学习取得了不俗的表现,但对于工业界实际问题来讲,强化
学习目前为止并没有特别突出的表现,这也意味着强化学习技术本身也需要更多的探索。 其实,对于现实中的问题,它所面临的环境要比棋牌复杂得多,同时也 充斥了很多的不确定性 。
监督学习例子:
- 人脸识别(人脸 -> 人名)
- 语音识别(语音 -> 文本)
- 主题/文本分类(文档->这个文本属于哪个主题?)
- 机器翻译
- 目标检测(图片里标记过的物体)
- 金融风控
- 情感分析(文本-情感)
- 自动驾驶
监督学习 进一步分为回归和分类问题
- 其中回归问题是用来预测具体的数值如温度、身高、气温、股价;(输出连续性变量)
- 分类问题则用来预测特定的类别, 如文档的主题, 信用的好坏、阴晴、好坏等。(输出定性结果)
数值和类别的主要区别在于后者是没有大小关系的, 比如”好“和”坏“,”电商“和"体育", ”国内“和”国外“。
无监督学习(聚类算法)
- 人群划分(精准推送)
特征与标签
数据集 (Dataset)包含了100个 样本 (sample), 每一个样本拥有50个特征和1个类别 标签 , 标签取自于(0,1)”,这就是经典的用于监督学习的数据。我们可以使用一个标准化的数学用语来表示上面的这句话。
一共有2个样本;
工作经验、职位、城市都属于特征,用X表示;
薪资属于标签(label),用Y表示,是我们需要去预测的,属于一个回归问题(预测的是个具体的值)。
工作经验 | 职位 | 城市 | 薪资(月薪/k) |
2 | 运营 | 北京 | ? |
3 | 后端开发工程师 | 杭州 | ? |
X就是一个矩阵,Y就是一个向量;
数据集的描述:
D表数据集,里边有n个样本,x1,x2...xn 叫一组特征向量; y1,y2...yn叫标签 ,这个标签数据其中一个类别。
训练数据和测试数据
对于给定的训练数据,我们通常把它进一步分为 训练数据 和 测试数据 。这么做的目的是需要留出一部分数据来验证训练出来的模型的好坏。我们使用训练数据来训练模型,并在测试数据上做最后的验证。
如果在测试数据上表现也良好,就说明达到了上线的标准。
机器学习建模流程
机器学习建模通常都需要经过以下几步:
从 数据探索 、 数据处理 、 建模 到最终的 模型验证 和 部署上线 。
案例:通过身高去预测一个人的体重
属于经典的回归问题;AI建模流程:
1. 数据的探索
通过数据探索我们会对业务和数据本身有更深入的理解,从而能够选择更合适的方法来解决问题。 数据探索过程中,最常用的是 数据可视化技术 ,也就是把数据直观地展示在二维或者三维的空间。 通过这种可
视化的方法,我们可以试着理解数据的 分布特征 (如是否满足线性?)、发现是否包含 异常值 、 特征值 是否满足某一类分布(如高斯分布)等等。
# 创建数据集,把数据写入到numpy数组
import numpy as np # 引用numpy库,主要用来做科学计算
import matplotlib.pyplot as plt # 引用matplotlib库,主要用来画图 # 定义数据,总共10个样本,每个样本包含两个值,分别为身高和体重。
data = np.array([[152,51],[156,53],[160,54],[164,55], [168,57],[172,60],[176,62],[180,65], [184,69],[188,72]]) # 打印出数组的大小
print(data.shape) #(10, 2) # 从data中提取身高和体重的值,分别存放在x, y变量中。 # data[:,0]指的是取出所有第一列,也就是身高特征。
x, y = data[:,0].reshape(-1,1), data[:,1] # 在二维空间里画出身高和体重的分布图
plt.scatter(x, y, color='black') plt.xlabel('height (cm)') plt.ylabel('weight (kg)') plt.show()
从身高和体重的可视化结果中,通过肉眼可以直观地看到它们之间的关系,偏向于线性关系。
数据本身具有线性关系,同时属于回归类问题,所以我们可以选择线性回归模型来解决这个任务。线性回归是最为经典的、最简单的回归模型,广泛地应用在各类预测任务中,如下一季度收入预测、销量预测等等。对于线性回归,在之后的章节里做详细的介绍。
在数据探索阶段,可视化技术起到了很重要的作用。但对于特征维度很高的数据来讲,直接去可视化是不太现实的,因为我们人类只能识别出二维或者三维的可视化。
如果给定的数据维度很大,如何做可视化分析呢?
- 没有特别好的方法一下子把所有特征一起做可视化
- 可以采用降维的方法,把特征映射到二维或者三维的空间
- 针对于每一个特征单独做可视化,并观察俩俩特征之间的关系
最为常用的方法是做数据的降维, 比如把100维的数据降维到2维或者3维的空间。用来做数据降维的方法有很多种, 其中最经典的方法叫作主成分分析(PCA)。
2. 数据预处理和特征工程
在建模过程中,数据预处理扮演着举足轻重的角色,这个过程通常会涉及到一些 数据清洗 的工作。在很多的AI任务中,数据本身具有大量的噪声,所以处理好这些是一项必要的工作。噪声可以是,数据字段的缺失、数据字段的异常、数据字段的不匹配等等。虽然这些工作看似很枯燥,但对于结果有着非常重要的影响,所以一定要引起足够的重视。
特征工程 (feature engineering)也起着非常重要的作用。所谓的特征工程指的是把一个物体表示为向量的过程。那为什么需要这种向量呢?这是因为任何模型的输入要求的就是一个个向量。
特征工程本身具有很多的学问和技巧,而且对于不同的数据类型如文本或者图像,需要使用不一样的特征工程技术。 在一般的建模过程中,花费50%以上的时间在特征工程上其实也很正常。
对于体重预测问题来讲,实际上不太需要特征预处理或者特征工程步骤的。首先,我们的特征都很干净,而且也没有任何异常值。另外,毕竟只有一个特征,也不太需要特征工程的步骤。
3. 构建回归模型
当选定了模型之后(如线性回归),下一步的事情就是针对于训练数据去 拟合 一个最好的线性回归模型。这部分的工作可以通过 sklearn 里封装好的函数来实现。
对于给定的特征X和标签y,我们可以直接调用sklearn里的LinearRegression()类初始化一个线性回归模型,之后再通过fit()函数在给定的数据上做拟合。样例代码如下:
# 实例化一个线性回归的模型
regr = linear_model.LinearRegression()
# 拟合给定的数据(X, y)
regr.fit(X_train,y_train)
拟合完之后对象regr里存储着已经训练好的线性回归模型的参数,并可以使用regr来对未来的数据做预测了。这里需要注意的是,对于给定的数据我们可以提前分好训练集和测试集。
4. 验证模型效果
对于验证模型的效果,可以从两个方面考虑。一方面,我们可以观察在训练数据上的 拟合度 ,另外一方面观察在测试数据上的 预测能力 。在训练数据上的拟合度是根本,如果在训练数据上都没有很好地拟合,就更不要谈测试数据上的验证了。
对于线性回归模型,它的拟合度可以通过真实值和预测值之间的误差来表示。
# 计算训练好的模型在训练数据上的拟合度
print (regr.score(X_train, y_train))
# 可视化在训练数据上拟合后的线条,这部分通过matplotlib库来实现,线条可以通过
# plot()函数来实现
# 首先,画出给定的训练数据
plt.scatter(x_train, y_train, color='red')
# 画出训练好的线条
plt.plot(x_train, regr.predict(x_train), color='blue')
# 画x,y轴的标题
plt.xlabel('height (cm)')
plt.ylabel('weight (kg)')
代码如下:
# 引用 sklearn库,主要为了使用其中的线性回归模块
from sklearn import datasets, linear_model # train_test_split用来把数据集拆分为训练集和测试机
from sklearn.model_selection import train_test_split # 引用numpy库,主要用来做科学计算
import numpy as np # 引用matplotlib库,主要用来画
import matplotlib.pyplot as plt # 创建数据集,把数据写入到numpy数组
data = np.array([[152, 51], [156, 53], [160, 54], [164, 55], [168, 57], [172, 60], [176, 62], [180, 65], [184, 69], [188, 72]]) # 打印出数据大小
print("The size of dataset is (%d,%d)" % data.shape) # X,y分别存放特征向量和标签. 注:这里使用了reshape(-1,1), 其主要的原因是 # data[:,0]是一维的数组(因为只有一个特征),但后面调用模型的时候对特征向量的要求 # 是矩阵的形式,所以这里做了reshape的操作。
X, y = data[:, 0].reshape(-1, 1), data[:, 1] # 使用train_test_split函数把数据随机分为训练数据和测试数据。 训练数据的占比由 # 参数train_size来决定。如果这个值等于0.8,就意味着随机提取80%的数据作为训练集
X_train, X_test, y_train, y_test = train_test_split(X, y, train_size=0.8) # TODO 1. 请实例化一个线性回归的模型 # TODO 2. 在X_train,y_train上训练一个线性回归模型。 如果训练顺利,则regr会存储训练完成之后的结果模型
# 实例化一个线性回归的模型
regr = linear_model.LinearRegression() # 拟合给定的数据(X, y)
regr.fit(X_train,y_train) # 在训练集上做验证,并观察是否训练得当,首先输出训练集上的决定系数R平方值
print("Score for training data %.2f" % regr.score(X_train, y_train)) #0.97
# 画训练数据
plt.scatter(X_train, y_train, color='red') # 画出训练好的线条
plt.plot(X_train, regr.predict(X_train), color='blue') # TODO 3. 画在训练数据上已经拟合完毕的直线 # 画测试数据
plt.scatter(X_test, y_test, color='black') # 画x,y轴的标题
plt.xlabel('height (cm)') plt.ylabel('weight(kg)') plt.show() # 输出在测试集上的决定系数R平方值
print("Score for testing data %.2f" %regr.score(X_test, y_test)) print("Prediction for a person with height 171 is: %.2f" % regr.predict([[171]])) ---->> The size of dataset is (10,2) Score for training data 0.97 Score for testing data 0.89 Prediction for a person with height 171 is: 60.38