九三智能控 2019-04-10
欢迎来到scikit-learn机器学习世界。
scikit-learn是一款强大的通用机器学习库。属于传统机器学习的领域,其特点是利用特征工程,人为对数据进行提炼和清洗。
本文将讨论以下主题:
什么是机器学习呢?简单来说,它是能检测数据模型,并用此作出未来预测的一系列方法。机器学习在金融和医疗保健等众多行业中具有巨大价值。这意味着机器学习领域对拥有技能资本的人才有更高的要求。
快速概览:机器学习在谷歌中的搜索趋势
从广义上讲,机器学习主要可以分为三种类型:
• 监督学习
• 无监督学习
• 强化学习
监督学习是机器学习的方式之一,其数据带有一组标签或一个数值型目标变量。这些标签/类别一般属于某种特征/属性,通常被称为目标变量。例如,每一行数据要么属于“健康”类别,要么属于“不健康”类别。给定一组特征,例如体重、血糖水平和年龄,我们可以使用监督机器学习算法来预测这个人是否健康。在下面的简单数学表达式中,S是监督学习算法,X是体重和年龄等输入特征的集合,而Y是带有“健康”或“不健康”标签的目标变量:
尽管监督机器学习使用scikit-learn,也是在业界实现的最常见的机器学习类型,但大多数数据集通常没有预定义的标签。
首先使用无监督学习算法将没有标签的数据划分成不同的组,然后我们可以为这些组分配标签。
监督学习算法可用来解决分类和回归问题。你将学到如何实现一些最流行的监督机器学习算法。受欢迎的监督机器学习算法在工业和研究中得到了广泛应用,并帮助我们解决了不同领域的各种问题。下面是一些监督学习算法。
无监督学习是机器学习的方式之一,其算法试图在没有结果/目标变量的数据中检测/找出模型。换句话说,数据此前没有标签。因此,该算法通常根据数据的相近程度,使用距离等度量法将数据组合在一起。如上一节所述,现实世界中遇到的大多数数据不会带有一组预定义标签,严格说来,只有一组没有目标属性的输入特征。在下面这个简单的数学表达式中,U是无监督学习算法,而X是体重和年龄等输入特征的集合:
根据这些数据,我们的目标是创建可能被标为“健康”或“不健康”的组。无监督学习算法使用距离等度量法来确定一组数据点的相近性,以及两个这样的组相差有多远。
无监督学习算法
无监督学习算法通常用于基于距离的聚类数据点。无监督学习算法如下所示:
强化学习也是机器学习的领域之一。强化指的是在特定情况下,采取适当的行动使得回报最大化。各种软件和机器使用强化学习来寻找其在特定情况下应该采取的最优行为或路径。强化学习和监督学习的不同之处在于:在监督学习中,训练数据本身具有答案,因此,数据模型是由正确答案训练而成;然而在强化学习中,没有这种答案,只能由强化智能体决定执行给定任务的步骤。在没有训练数据集的情况下,必然要从经验中学习。
Scikit-learn是一款免费的开源软件,可以帮助你解决监督和无监督机器学习问题。该软件完全用Python搭建,并利用了Python提供的一些最流行的库,即NumPy和SciPy。Scikit-learn非常受欢迎的主要原因在于一旦你知道了核心管道的样子,世界上大多数最流行的机器学习算法都可以在插件里快速实现并格式化。另一个原因是流行的分类算法,如逻辑回归和支持向量机是用Cython编写的。Cython为这些算法提供了类似于C语言的性能,因此在此过程中,使用scikit-learn非常有效。
Scikit-learn旨在解决与监督学习和非监督学习相关的问题,目前还不支持强化学习。
如何安装Scikit-Learn包
在个人设备上安装scikit-learn有两种方式:
pip法可在macOS、Linux终端或Windows PowerShell上实现,而Anaconda法将使用Anaconda提示符。在这两种安装方法之中选择一种特别简单。
· pip法
pip3 install NumPy pip3 install SciPy pip3 install scikit-learn pip3 install -U scikit-learn
· Anaconda法
conda install NumPy conda install SciPy conda install scikit-learn conda install -U scikit-learn
到目前为止,本课程的重点在于向那些刚进入机器学习世界的初学者简要介绍机器学习。我们已经了解了scikit-learn如何适应机器学习的环境以及如何安装必要的软件。
现在,我们要进行实践训练,并进行一些数据探索和分析。
在本节中我们看到的数据集是波士顿住房数据集。
通常,数据存储在表格中,这意味着它可以保存为逗号分隔变量(CSV)文件。使用Pandas库,可以将这种格式和许多其它格式作为数据帧对象读入Python。其它常见格式包括制表符分隔变量(TSV)、SQL表格和JSON数据结构。实际上,Pandas支持以上所有格式。但是,在本例中,我们不打算用这种方式加载数据,因为数据集可以直接通过scikit-learn获得。
可以使用该方法从sklearn.datasets模块访问波士顿住房数据集。
获取小数据集:load_boston
from sklearn import datasets boston = datasets.load_boston() type(boston) print(boston['DESCR'])
import pandas as pd ## Loading the data as Dataframe in pandas df = pd.DataFrame(data=boston['data'], columns = boston['feature_names']) #Checking our top 5 rows of the dataframe df.head()
在机器学习中,正在被建模的变量称为目标变量;根据给定的特征,目标变量就是你所要预测的东西。对于此数据集,建议的目标变量是MEDV,即以千美元计的平均房价。
## Adding Target temp Column to our dataframe df['MEDV'] = boston['target'] ## Creating copy of the target Value y = df['MEDV'].copy() ##Deleting the Newly created column del df['MEDV'] ## Concat the target columns to our existing dataframe df = pd.concat((y, df), axis=1)
在此,我们引入虚拟变量y来保存目标列的副本,然后再从数据帧中删除它。然后我们使用Pandas concatenation函数将它与沿第1轴的剩余数据帧相结合(与包括行的0轴相反)。
print(df.shape) df.isnull().sum() --------------------- (506, 14) MEDV 0 CRIM 0 ZN 0 INDUS 0 CHAS 0 NOX 0 RM 0 AGE 0 DIS 0 RAD 0 TAX 0 PTRATIO 0 B 0 LSTAT 0 dtype: int64
对于这个数据集,我们看到没有非数元素(NaNs), 这意味着我们在清理数据方面没有立即要做的工作,可以继续进行。
为了简化分析,我们在探索之前要做的最后一件事是删除一些列。我们将不再关注这些,而是更详细地关注其余部分。
通过运行包含以下代码的单元格来删除一些列。
for col in ['ZN', 'NOX', 'RAD', 'PTRATIO', 'B']: del df[col]
由于这是一个我们从未见过的全新数据集,因此第一个目标是理解数据。我们已经看到了数据的文本描述,这对于定性了解非常重要。现在来计算一个定量描述。
该表计算了多个属性,包括每列的平均值、标准差、最小值和最大值。该表还提供了关于如何分配所有内容的高级概念。请注意,通过在输出中添加“.T”来对结果进行转换,这将交换行和列。
cols = ['RM', 'AGE', 'TAX', 'LSTAT', 'MEDV'] df[cols].corr() import matplotlib.pyplot as plt import seaborn as sns %matplotlib inline ax = sns.heatmap(df[cols].corr(), cmap=sns.cubehelix_palette(20, light=0.95, dark=0.15)) ax.xaxis.tick_top() # move labels to the top
调用sns.heatmap并将成对相关矩阵作为输入传递。在这里使用自定义调色板来覆盖Seaborn默认值。
这个结果表显示了每组值之间的相关性分数。大的正分数表示强烈的正相关性(即在同一方向)。正如预期的那样,我们在对角线上看到最大值为1。
皮尔森相关系数定义为两个变量之间的协方差,除以它们标准差的乘积。
相应地,协方差的定义如下:
这里n是样本的个数,Xi 和Yi是被求和的各个样本,Xbar和Ybar是每个集合的均值。
我们可以看到,给定一组特征后预测的连续目标变量出现了一个回归问题,特别是当我们将预测平均房价(MEDV)时。我们将训练仅使用一个特征作为输入的模型来进行预测。这样,模型在概念上更容易理解,我们也可以更专注于scikit-learn API的技术细节。
我们将导入线性回归类,并按照计算MSE时的方法构建先行分类模型。运行以下命令:
在给定LSTAT值的情况下,使用scikit-learn拟合多项式回归模型来预测平均房价(MEDV)。我们希望建立一个具有较低均方误差(MSE)的模型。
y = df['MEDV'].values x = df['LSTAT'].values.reshape(-1,1) from sklearn.preprocessing import PolynomialFeatures poly = PolynomialFeatures(degree=3) x_poly = poly.fit_transform(x) from sklearn.linear_model import LinearRegression clf = LinearRegression() clf.fit(x_poly, y) y_pred = clf.predict(x_poly) resid_MEDV = y - y_pred from sklearn.metrics import mean_squared_error error = mean_squared_error(y, y_pred) print('mse = {:.2f}'.format(error)) fig, ax = plt.subplots() # Plot the samples ax.scatter(x.flatten(), y, alpha=0.6) # Plot the polynomial model x_ = np.linspace(2, 38, 50).reshape(-1, 1) x_poly = poly.fit_transform(x_) y_ = clf.predict(x_poly) ax.plot(x_, y_, color='red', alpha=0.8) ax.set_xlabel('LSTAT'); ax.set_ylabel('MEDV'); -------------------------------------- mse = 28.88
通过上面的步骤,关于编写第一个机器学习模型的全面指南就完成了。在此,我们使用散点图等视觉辅助工具来加深对数据的理解,还进行了简单的预测建模。