第1课
练习一 请同学们列举出机器学习的类型,并说明分类的标准。
答案:机器学习有不同的分类标准,最常见的分类,是把它分为监督学习、无监督学习和半监督学习。监督学习的训练需要标签数据,而无监督学习不需要标签数据,半监督学习介于两者之间,使用一部分已有标签的数据。
还有一种常见的分类将机器学习分为监督学习、无监督学习和强化学习这3个类别。大家需要了解的一点是,各类机器学习之间的界限是很模糊的。
练习二 解释机器学习术语:什么是特征,什么是标签,什么是机器学习模型。
答案:特征是机器学习中的输入,原始的特征描述了数据的属性。它是有维度的。特征的维度就是特征的数目。标签是所要预测的真实事物或结果,也称为机器学习的目标。模型,也就是机器从数据规律中发现的函数,其功能是将样本的特征映射到预测标签。
练习三 我们已经见过了Google中的加州房价数据集和Kares自带的MNIST数据集,请同学们自己导入Keras的波士顿房价(boston_housing)数据集,并判断其中哪些是特征字段,哪些是标签字段。
(提示:使用语句from keras.datasets import boston_housing导入波士顿房价数据集。)
搜索Boston Housing Keras,可以找到该数据集的具体信息。
其中特征字段包括以下内容。
CRIM:按城镇划分的人均犯罪率。
ZN:超过25 000平方英尺的住宅用地比例。
INDUS:每个城镇非零售业务英亩的比例。
CHAS:查尔斯河哑变量(如果靠近河流,则为1;否则为0)。
NOX:一氧化氮浓度(百万分之几)。
RM:每个住宅的平均房间数。
AGE:1940年之前建造的自有单位。
DIS:与5个波士顿就业中心的加权距离。
RAD:高速公路通行能力指数。
TAX:每10 000美元的全额财产税。
PTRATIO:按城镇划分的师生比例。
B:按城镇划分的某少数族群人口结构比例。
LSTAT:低收入人口百分比。
标签字段包括以下内容。
MEDV:自有住房的中位数价值(以1 000美元计)。
练习四 参考本课中的两个机器学习项目代码,使用Linear Regression线性回归算法对波士顿房价数据集进行建模。
答案:参见源码包中“第1课 机器学习实战”目录下的练习案例中的源代码文件“C01-3 Boston Housing Price.ipynb”。
第2课
练习一 变量(x,y)的集合{(−5,1),(3,−3),(4,0),(3,0),(4,−3)}是否满足函数的定义?为什么?
答案:不满足,因为输入集的元素4,对应了两个输出(0和-3),这不符合每一个输入集元素只能对应输出集的唯一值的定义。也就是说,当x确定之后,y并不总是能被确定,这和我们试图去发现从特征到标签的相关性的目标不符。
练习二 请同学们画出线性函数y=2x+1的函数图像,并在图中标出其斜率和y轴上的截距。
答案:
练习三 在上一课中,我们曾使用语句from keras.datasets import boston_housing导入了波士顿房价数据集。请同学们输出这个房价数据集对应的数据张量,并说出这个张量的形状。
答案:参见源码包中“第2课 Python数据操作”目录下的源代码文件“C02-3 Tensor - Boston Housing.ipynb”。
数据集张量形状为(404,13)。
练习四 对波士顿房价数据集的数据张量进行切片操作,输出其中第101~200个数据样本。
(提示:注意Python的数据索引是从0开始的。)
答案:参见源码包中“第2课 Python数据操作”目录下的源代码文件“C02-3 Tensor - Boston Housing.ipynb”。
练习五 用Python生成对形状如下的两个张量,确定其阶的个数,并进行点积操作,最后输出结果。
A = [1,2,3,4,5]
B = [[5],[4],[3],[2],[1]]
答案:参见源码包中“第2课 Python数据操作”目录下的源代码文件“C02-3 Tensor - Boston Housing.ipynb”。
第3课
练习一 在这一课中,我们花费了一些力气自己从头构造了一个线性回归模型,并没有借助Sklearn库的线性回归函数。这里请大家用Sklearn库的线性回归函数完成同样的任务。怎么做呢?同学们回头看看第1课1.2.3节的“用Google Colab开发第一个机器学习程序”的加州房价预测问题就会找到答案。
(提示:学完本课内容之后,面对线性回归问题,有两个选择,要么自己构建模型,要么直接调用机器学习函数库里现成的模型,然后用fit方法训练机器,确定参数。)
答案:参见源码包中“第3课 线性回归”目录下教学案例中的源代码文件“C03-3 Sklearn - Ads and Sales.ipynb”。
练习二 在Sklearn库中,除了前面介绍过的Linear Regression线性回归算法之外,还有Ridge Regression(岭回归)和Lasso Regression(套索回归)这两种变体。请大家尝试参考Sklearn在线文档,找到这两种线性回归算法的说明文档,并把它们应用于本课的数 据集。
答案:Ridge Regression和Lasso Regression,都是对模型加入正则化项,惩罚过大的参数,以避免过拟合问题。其中,Lasso Regression采取L1正则化,而Ridge Regression采取L2正则化。
Sklearn库中Ridge Regression和Lasso Regression模型的使用,参见源码包中“第3课 线性回归”目录下教学案例中的源代码文件“C03-3 Sklearn - Ads and Sales.ipynb”。
练习三 导入第3课的练习数据集:Keras自带的波士顿房价数据集,并使用本课介绍的方法完成线性回归,实现对标签的预测。
答案:参见源码包中“第3课 线性回归”目录下练习案例中的源代码文件“C03-5 Linear Regression - Bonston Housing.ipynb”。
第4课
练习一 根据第4课的练习案例数据集:泰坦尼克数据集(见源码包),并使用本课介绍的方法完成逻辑回归分类。
(提示:在进行拟合之前,需要将类别性质的字段进行类别到哑变量的转换。)
答案:参见源码包中“第4课 逻辑回归”目录下的源代码文件C04-4 Logistic Regression Single class-Tiantic.ipynb。
练习二 在多元分类中,我们基于鸢尾花萼特征,进行了多元分类,请同学们用类似的方法,进行花瓣特征集的分类。
答案:参见源码包中“第4课 逻辑回归”目录下的源代码文件C04-2 Logistic Regression Multi classes-Iris Sepal.ipynb。
练习三 请同学们基于花瓣特征集,进行正则化参数C值的调试。
答案:参见源码包中“第4课 逻辑回归”目录下的源代码文件C04-3 Logistic Regression Multi Classes-Iris Petal.ipynb。
第5课
练习一 对本课示例继续进行参数调试和模型优化。
(提示:可以考虑增加或者减少迭代次数、增加或者减少网络层数、添加Dropout层、引入正则项,以及选择其他优化器等。)
答案:请读者自行调试各种参数。
练习二 第5课的练习数据集仍然是泰坦尼克数据集,使用本课介绍的方法构建神经网络处理该数据集。
答案:参见源码包中“第5课 深度神经网络”目录下练习案例中的源代码文件“C05-3 ANN - Titanic.ipynb”。
练习三 使用TensorBoard和回调函数显示训练过程中的信息。
答案:参见源码包中“第5课 深度神经网络”目录下教学案例中的源代码文件“C05-2 Using TensorBoard .ipynb”。
第6课
练习一 对本课示例继续进行参数调试和模型优化。
(提示:可以考虑增加或者减少迭代次数、增加或者减少网络层数、添加Dropout层、引入正则项等。)
答案:请读者自行调试各种参数。
练习二 在Kaggle网站搜索下载第6课的练习数据集“是什么花”,并使用本课介绍的方法新建卷积网络处理该数据集。
答案:参见源码包中“第6课 卷积神经网络”目录下练习案例中的源代码文件“C06-2 CNN - Flowers.ipynb”。
练习三 保存卷积网络模型,并在新程序中导入保存好的模型。
答案:通过下述语句可将模型保存到网络或本机文件夹。
cnn.save('cnn_model.h5')
通过下述语句可调用保存好的模型到新程序。
model = load_model('cnn_model.h5')
第7课
练习一 使用GRU替换LSTM层,完成本课中的鉴定留言案例。
答案:参考下面的代码。
from keras.layers import GRU #导入GRU层
model.add(GRU(100)) # 加入GRU层
练习二 在Kaggle中找到第7课的练习数据集“Quora问答”,并使用本课介绍的方法新建神经网络处理该数据集。
答案:参见源码包中“第7课 循环神经网络”目录下练习案例中的源代码文件“C07-3 RNN - Quora Queries.ipynb”。
练习三 自行调试、训练双向RNN模型。
答案:请读者自行调试。
第8课
练习一 找到第5课中曾使用的“银行客户流失”数据集,并使用本课介绍的算法处理该数据集。
答案:参见源码包中“第8课 传统算法”目录下的源代码文件“C08-2 Tools-Bank.ipynb”。
练习二 本课介绍的算法中,都有属于自己的超参数,请同学们查阅Sklearn文档,研究并调试这些超参数。
答案:请同学们去Sklearn官方网站,阅读每一种算法(模型)的官方文档。
练习三 对于第5课中的“银行客户流失”数据集,选择哪些Sklearn算法可能效果较好,为什么?
答案:参见源码包中“第8课 传统算法”目录下的源代码文件C08-2 Tools-Bank.ipynb,并分析各种算法性能的优劣。
练习四 决策树是如何“生长”为随机森林的?
答案:在训练样本的选择过程中,引入了有放回的随机抽样过程,并不总是选择全部样本;在进行分支决策时,分支节点生成时不总是考量全部特征,而是随机生成特征。
这两个步骤增加了每一棵树的随机性,从而减少偏差,抑制过拟合。然后,将多棵树的结果进行集成,即为随机森林。
第9课
练习一 列举出3种降低方差的集成学习算法、3种降低偏差的集成学习算法,以及4种异质集成算法。
答案:降低方差的集成学习算法包括决策树、随机森林、极端随机森林等。
降低偏差的集成学习算法包括Ada Boost、GBDT、XGBoost等。
异质集成算法包括Stacking、Blending、Voting和Averaging等。
练习二 请同学们用Bagging和Boosting集成学习算法处理第4课曾使用的“心脏病二元分类”数据集。
答案:参见源码包中“第9课 集成学习”目录下练习案例中的源代码文件“C09-4 Ensemble - Heart.ipynb”。
练习三 本课中通过Voting算法集成了各种基模型,并针对“银行客户流失”数据集进行了预测。请同学们使用Stacking算法,对该数据集进行预测。
答案:参见源码包中“第9课 集成学习”目录下教学案例中的源代码文件“C09-3 Stacking - Bank Customer.ipynb”。
第10课
练习一 重做本课中的聚类案例,使用年龄和消费分数这两个特征进行聚类(我们的例子中是选择了年收入和消费分数),并调整K值的大小。
答案:参见源码包中“第10课 无监督及其他类型的学习”目录下教学案例的源代码文件“C10-2 K-means - Age and Spending.ipynb”。
练习二 研究源码包中给出的变分自编码器的代码,试着自己用Keras神经网络生成变分自编码器。
答案:参见源码包中“第10课 无监督及其他类型”的学习目录下“其他”文件夹中的源代码文件“C10-5 VAE.ipynb”。
练习三 研究源码包中给出的GAN实现代码。
答案:参见源码包中“第10课 无监督及其他类型”的学习目录下“其他”文件夹中的源代码文件“C10-4 GAN.ipynb”。
第11课
练习一 设定冰湖挑战is_slippery开关的值为Ture,重新用Q-Learning和SARSA算法完成冰湖挑战。
答案:env = gym.make('Frozen Lake-v0',is_slippery=True)。
练习二 阅读论文《Playing Atari with Deep Reinforcement Learning》,了解Deep Q Network的更多细节。
答案:请读者阅读相关论文。
练习三 使用Deep Q Network算法完成冰湖挑战。
答案:参见源码包中“第11课 强化学习”目录下的源代码文件“C11-3 Deep Q-learning - Frozen Lake.ipynb”。