AI技术基于计算机科学、心理学、神经科学、统计学等多个领域的知识,通过算法、大数据、机器学习、深度学习等方法,让计算机系统实现类似于人类的智能。AI技术已经在多个领域得到了广泛应用,比如医疗、金融、制造业、教育等。
概述
AI有很多研究方向,大致如下:
机器学习
机器学习是一种能够通过从数据中自动学习,提高执行某个任务的能力的算法。它可以通过构建模型,让计算机自动从数据中发现规律和模式,来完成分类、聚类、预测等任务。
深度学习
深度学习是机器学习的一个分支,其核心是人工神经网络(Artificial Neural Networks,简称ANN),可以用多层神经元对复杂的非线性关系进行建模和处理,具有更好的表征能力和更好的效果。
自然语言处理(NLP)
自然语言处理(Natural Language Processing)是指计算机对人类语言(如中文、英文等)进行理解、分析和处理的技术。主要针对文本的理解、生成、翻译等问题。
计算机视觉
计算机视觉(Computer Vision)是指计算机根据图像和视频进行理解、分析和处理的技术。主要应用于目标检测、图像分类、图像生成、图像分割等领域。
语音识别
语音识别(Speech Recognition)是指计算机对人类声音进行识别和理解的技术。主要应用于语音输入、语音控制、智能客服等领域。
强化学习
强化学习(Reinforcement Learning)是一种让计算机通过与环境交互,并根据结果调整行为的学习方式。主要应用于游戏、自主驾驶等领域。
机器学习
我们来看一个场景:
你有一个堂兄,他通过房地产投机赚了几百万,然后他邀请你作为他的合伙人。他提供钱,你复杂提供模型来预测不同的房子价值多少。而在这以前,他主要通过直觉来评估房产价值。经过详细询问得知,实际上他是根据以前买卖房产的经验得出一个评估模型,并套用到新的房产上。
机器学习工作原理也是类似的。先根据已有的数据训练出一个预测模型,然后通过该模型对未知的数据进行预测。
先看一个基本的机器学习算法,那就是决策树。
当然,有很多更好的算法提供了更为准确的预测,但决策树理解起来比较简单,同时它也是数据科学中一些优秀模型的基本构建块。
简单起见,我们看一个最简单的决策树。
该决策树将房产分为了两类,每类房子的预测价格是该类型房子的历史平均价格。首先,我们使用数据来决定怎么将房子分成两类,然后决定每类房子的预测价格。
从数据中提取分类模型的过程叫做拟合或者训练模型,用于提取物模型的数据叫做训练数据。从训练数据中训练出模型的过程比较复杂,稍后再述。但有一点是明确的,得到分类模型之后就可以将其应用到新数据中,来预测新房子的价值。
决策树改进
下面两个决策树哪一个看起来更像是通过房产数据训练出来的模型?
左边的看起来更有意义,因为它更符合现实:拥有超过两间卧室的房子通常价格更高。
它最大的缺陷是没有考虑其他影响房产价格的因素,比如说卫生间数量,大小,位置等等。
我们改进一下决策树,加入更多的价格影响因子:
树的最底层的节点叫做叶子节点。叶子节点的值由数据决定。下面来看一下房子价格的数据集。
数据集
本文示例及数据集都来源于kaggle。
Kaggle成立于2010年,是一个进行数据发掘和预测竞赛的在线平台。从公司的角度来讲,可以提供一些数据,进而提出一个实际需要解决的问题;从参赛者的角度来讲,他们将组队参与项目,针对其中一个问题提出解决方案,最终由公司选出的最佳方案可以获得5K-10K美金的奖金。
除此之外,Kaggle官方每年还会举办一次大规模的竞赛,奖金高达一百万美金,吸引了广大的数据科学爱好者参与其中。从某种角度来讲,可以把它理解为一个众包平台。但是不同于传统的低层次劳动力需求,Kaggle一直致力于解决业界难题,因此也创造了一种全新的劳动力市场——不再以学历和工作经验作为唯一的人才评判标准,而是着眼于个人技能,为顶尖人才和公司之间搭建了一座桥梁。
具体数据可以直接下载下来看,长这个样子:
我们用pandas看一下数据集大概情况:
Pandas是一个开源的数据分析框架,用于快速处理大量数据并进行各种操作
这是直接在kaggle上运行的,从结果来看,对于每一列都有8个数字来描述。解释如下:
- count:数据集行数
- mean:平均值
- std:标准方差,衡量数据的分布情况
- min,25%,50%,75%,max:将该列的所有值从小到大排列后的最小值,三个百分位值,最大值
第一个机器学习模型
现在有数据集了,但是里面包含太多的变量,难以理解和打印。如何将这庞大的数据集缩小到可以理解的程度?
我们先通过直觉选择一些变量,后续将展示如何使用统计学技术自动确定变量的优先级。
通过DataFrame数据结构的columns属性来获取数据集的列:
import pandas as pd
melbourne_file_path = '../input/melbourne-housing-snapshot/melb_data.csv'
melbourne_data = pd.read_csv(melbourne_file_path)
melbourne_data.columns
melbourne_data = melbourne_data.dropna(axis=0)
Dropna 函数用于删除缺失值所在的行或列,通常用于处理数据集。该函数的参数 axis 表示删除行或列的索引方向。默认情况下,axis=0 表示删除数据集中的缺失值所在的行,axis=1 表示删除数据集中的缺失值所在的列
得到的columns如下:
Index(['Suburb', 'Address', 'Rooms', 'Type', 'Price', 'Method', 'SellerG',
'Date', 'Distance', 'Postcode', 'Bedroom2', 'Bathroom', 'Car',
'Landsize', 'BuildingArea', 'YearBuilt', 'CouncilArea', 'Lattitude',
'Longtitude', 'Regionname', 'Propertycount'],
dtype='object')
选择预测目标和特征值
方便起见,我们将y设为预测目标,显然它应该是价格这个属性:
y = melbourne_data.Price
输入到模型中并参与预测的列叫做特征值。在我们的例子中,也就是决定房子价格的columns。有时候可能需要将除目标之外的全部属性作为特征值,有时候只需要很少的一些columns作为特征值。
为了预测房子价格,选择以下属性作为特征值:
melbourne_features = ['Rooms', 'Bathroom', 'Landsize', 'Lattitude', 'Longtitude']
方便起见,将特征值记为X:
X = melbourne_data[melbourne_features]
接下来我们用describe函数和head函数来描述特征值。
X.describe()
X.head()
构建模型
我们使用scikit-learn库来构建模型。
scikit-learn 是一个流行的机器学习库,由sklearn.metrics 和 sklearn.model_selection 库组成。它提供了许多机器学习算法和工具,可以帮助用户进行数据分析、特征提取、模型训练和评估等任务。
步骤如下:
- Define:定义模型的类型,是决策树还是其他模型。
- Fit:训练或者拟合,从数据集中训练出模型,这一步是建模的核心。
- Predict:预测,通过模型来预测结果
- Evaluate:评估,评估出模型预测的准确性
下面是一个使用scikit-learn来训练出一个决策树模型的示例:
从图中可以看出训练出的决策树模型对前面5个房子的预测价格。
结果验证
上一步我们构建了一个决策树模型,并能够预测房子的价格。那怎么判断预测结果好不好呢?
下面将介绍如何衡量模型的质量。衡量出模型质量之后,才能更好的对模型进行迭代。
一个模型的质量是好是坏,主要靠预测准确率来决定的。换句话说,预测结果越接近实际值,模型的质量越好。
准确率指标有很多中,其中一种叫做Mean Absolute Error(MAE),即平均绝对误差。
比如现在有一个房子价值15万美元,模型的预测目标是10万美元,则这个房子的预测价格误差就是5万美元,不管是正误差还是负误差,都取绝对值。MAE就是衡量这些误差的平均值。
计算MAE:
实际上,这是一个样本内得分。我们使用同一个样本数据来构建模型,并且评估结果,这实际上是有问题的。
因为预测模型来源于训练数据,用它来预测训练数据自然是比较准确的。但如果拿一些非训练数据来预测,可能准确率就降得极低。
想要评估模型预测的准确性,必须用非训练数据来验证。最直接的方式就是将数据集分为两个部分,一部分用来训练,另一部分用来做结果验证。前者叫训练集,后者叫验证集。
我们用这种方式来重新计算MAE结果如下:
可以看到,使用不同的数据做模型验证得到的结果存在着巨大的差异,使用验证集得到的结果才是更有实际意义的结果。
该模型的AME约为26万,而验证集数据的平均房屋价格在110万左右,AME差不多是平均价格的1/4的水平。
有很多提高模型质量的方式,比如调整特征值,更换其他类型的模型等等。
拟合不足和过度拟合
在scikit-learn的文档中可以看到,决策树有很多可选项,其中最重要的一个是树的深度。树越深,意味着数据集将被拆分为规模更小的组。举例说明:树深为1,数据集将被拆成2组;树深为2将被拆分为4组;树深为3将被拆分为8组,依次类推。当树的深度为10时,我们将得到2的10次方,也就是1024组房屋数据,对应着1024个叶子节点。
当我们拆分足够多时,每个叶子节点的房子就很少。预测结果将会非常接近训练集中的房子的实际价格。但如果用它来预测新的房子,结果将非常不可信,因为每一个叶子节点的预测都是基于很少的数据样本的。
这个现象就叫过度拟合。过度拟合得到的模型,对于训练集的预测几乎是完美的,但对于新数据的预测则表现很差;相反地,如果树深较小,拆分的训练样本不具有区分度,决策树的预测结果与实际值相差甚大,这个现象就叫拟合不足。
下面是MAE和树深之间的关系图:
图中蓝色线条表示训练集的预测MAE和树深的关系,红色线条表示验证集的预测MAE和树深的关系。
从中可以看出,树深越大,对训练集预测的结果的MAE越小,也就是说预测结果越准。但对验证集来说,树深增大到某个点之后再继续增长的话,MAE却是不降反增。
而这个转折点就是我们需要的合适的树的深度,低于这个点的深度属于拟合不足,高于这个点的深度属于过度拟合。
有一些参数会影响树的深度,其中max_leaf_nodes
可以较好的控制树深。该参数越大,允许的叶子节点数越多,拟合程度就越偏向过度拟合一侧。
下面是不同max_leaf_nodes
情况下的MAE得分:
import pandas as pd
from sklearn.metrics import mean_absolute_error
from sklearn.tree import DecisionTreeRegressor
def get_mae(max_leaf_nodes, train_X, val_X, train_y, val_y):
model = DecisionTreeRegressor(max_leaf_nodes=max_leaf_nodes, random_state=0)
model.fit(train_X, train_y)
preds_val = model.predict(val_X)
mae = mean_absolute_error(val_y, preds_val)
return(mae)
melbourne_file_path = '../input/melbourne-housing-snapshot/melb_data.csv'
melbourne_data = pd.read_csv(melbourne_file_path)
# Filter rows with missing price values
filtered_melbourne_data = melbourne_data.dropna(axis=0)
# Choose target and features
y = filtered_melbourne_data.Price
melbourne_features = ['Rooms', 'Bathroom', 'Landsize', 'BuildingArea', 'YearBuilt', 'Lattitude', 'Longtitude']
X = filtered_melbourne_data[melbourne_features]
from sklearn.model_selection import train_test_split
# split data into training and validation data, for both features and target
# The split is based on a random number generator. Supplying a numeric value to
# the random_state argument guarantees we get the same split every time we
# run this script.
train_X, val_X, train_y, val_y = train_test_split(X, y, random_state = 0)
print(get_mae(64, train_X, val_X, train_y, val_y))
print(get_mae(128, train_X, val_X, train_y, val_y))
print(get_mae(256, train_X, val_X, train_y, val_y))
print(get_mae(512, train_X, val_X, train_y, val_y))
print(get_mae(1024, train_X, val_X, train_y, val_y))
print(get_mae(2048, train_X, val_X, train_y, val_y))
print(get_mae(4096, train_X, val_X, train_y, val_y))
结果如下:
249827.1496720289
250895.8982060873
246779.14968509309
244312.4055982274
247411.46218239068
253582.07706791704
254988.6892618894
可以看到,在给出的几个参数中,最大叶子节点数为512时,MAE最小。
随机森林
决策树模型使用起来有一些难点,容易出现拟合不足或者拟合过度的窘境。即使是当今最复杂的建模技术,也难以把握好这个度。因此,一些建模算法另辟蹊径,取得了更好的表现结果,比如随机森林。
随机森林由很多决策树组成,它考虑所有的决策树的预测结果,然后取平均值作为最终的预测结果。
通常来说,随机森林预测结果的准确率比单个决策树的准确率要高,即使使用默认的参数也能工作得很好。
当然,还有很多其他优秀的建模算法,但大部分需要设置合适的参数值。
下面以随机森林为例来看看它是如何工作的:
可以看到,我们仍然是以同样的数据集进行训练和验证结果,最终得到的MAE是19万左右,相比决策树算法的25w有了一个巨大的提升。
其实在随机森林算法中,我们也能通过调整单棵决策树的深度来取得更好的结果。但随机森林最大的一个优点就是,即使没有调参也能获得相对合理的结果。
参考资料
[1]. https://www.kaggle.com/learn/intro-to-machine-learning
文章评论