本章开始涉及编程练习,这里采用Python-sklearn的方式,环境搭建可参考 数据挖掘入门:Python开发环境搭建(eclipse-pydev模式).
相关答案和源代码托管在我的Github上:PY131/Machine-Learning_ZhouZhihua.
本章讲述线性模型(linear model),相关内容包括:
- 线性回归(linear regression)
序关系(order)、均方差(square error)最小化、欧式距离(Euclidean distance)、最小二乘法(least square method)、参数估计(parameter estimation)、多元线性回归(multivariate linear regression)、广义线性回归(generalized linear model)、对数线性回归(log-linear regression);
- 对数几率回归(逻辑回归)(logistic regression)
分类、Sigmoid函数、对数几率(log odds / logit)、极大似然法(maximum likelihood method);
- 线性判别分析(linear discriminant analysis - LDA)
类内散度(within-class scatter)、类间散度(between-class scatter);
- 多分类学习(multi-classifier)
拆解法,一对一(One vs One - OvO)、一对其余(OvR)、多对多(MvM)、纠错输出码(ECOC)、编码矩阵(coding matrix)、二元码、多标记学习(multi-label learning);
- 类别不平衡(class-imbalance)
再缩放(rescaling)、欠采样(undersampling)、过采样(oversampling)、阈值移动(threshold-moving);
偏置项b在数值上代表了自变量取0时,因变量的取值;
1.当讨论变量x对结果y的影响,不用考虑b; 2.可以用变量归一化(max-min或z-score)来消除偏置。
直接给出证明结果如下图:
所使用的数据集如下:
本题是本书的第一个编程练习,采用了自己编程实现和调用sklearn库函数两种不同的方式(查看完整代码):
具体的实现过程见:周志华《机器学习》课后习题解答系列(四):Ch3.3 - 编程实现对率回归
本题采用UCI中的iris data set 和 Blood Transfusion Service Center Data Set 数据集,借助sklearn实现(查看完整代码)。
具体的实现过程见:周志华《机器学习》课后习题解答系列(四):Ch3 - 3.4.交叉验证法练习
本题采用题3.3的西瓜数据集,采用基于sklearn实现和自己独立编程实现两种方式(查看完整代码)。
具体的实现过程见:周志华《机器学习》课后习题解答系列(四):Ch3 - 3.5.编程实现线性判别分析
给出两种思路:
- 参考书p57,采用广义线性模型,如 y-> ln(y)。
- 参考书p137,采用核方法将非线性特征空间隐式映射到线性空间,得到KLDA(核线性判别分析)。
参考书p65,对于同等长度的编码,理论上来说,任意两个类别间的编码距离越远,纠错能力越强。那么如何实现呢,可参考文献Error-Correcting Output Codes。下图是截取文中的关于在较少类时采用exhaustive codes来生成最优ECOC二元码的过程:
采用文中方法,每两类的Hamming Distance均达到了码长的一半,这也是最优的编码方式之一。
参考书p66,对OvR、MvM来说,由于对每类进行了相同的处理,其拆解出的二分类任务中类别不平衡的影响会相互抵销,因此通常不需专门处理。
以OvR(一对其余)为例,由于其每次以一个类为正其余为反(参考书p63),共训练出N个分类器,在这一过程中,类别不平衡由O的遍历而抵消掉。