2.1 分类与回归
回归任务的目标是预测一个连续值,区分分类任务和回归任务有一个简单方法,就是问一个问题:输出是否具有某种连续性。如果在可能的结果之间具有连续性,那么它就是一个回归问题。根据教育水平、年龄和居住地来预测一个人的年收入,这就是回归的一个例子。在预测收入时,预测值是一个金额(amount),可以在给定范围内任意取值。回归任务的另一个例子是,根据上一年的产量、天气和农场员工数等属性预测玉米农场的产量。同样,产量也可以取任意数值。
2.2 泛化、过拟合与欠拟合
- 泛化
如果一个模型能够对没见过的数据做出准确预测,我们就说它能够从训练集泛化(generalize)到测试集。 - 过拟合(overfitting)
构建一个对现有信息量来说过于复杂的模型,称为过拟合(overfitting)。如果你在拟合模型时过分关注训练集的细节,得到了一个在训练集上表现很好、但不能泛化到新数据上的模型,那么就存在过拟合。 - 欠拟合(underfitting)
模型过于简单,无法抓住数据的全部内容。
模型越复杂,在训练数据上的预测结果就越好。但是,如果模型过于复杂,我过多关注训练集中每个单独的数据点,模型就不能很好地泛化到新数据上。二者之间存在一个最佳位置,可以得到最好的泛化性能。这就是我们想要的模型。
2.3 监督学习算法
2.3.1 K近邻
K近邻分类
方法
from sklearn.neighbors import KNeighborsClassifier
clf = KNeighborsClassifier(n_neighbors=3)
K近邻回归
from sklearn.neighbors import KNeighborsRegressor
优缺点
k-NN 的优点之一就是模型很容易理解,通常不需要过多调节就可以得到不错的性能。在考虑使用更高级的技术之前,尝试此算法是一种很好的基准方法。构建最近邻模型的速度通常很快,但如果训练集很大(特征数很多或者样本数很大),预测速度可能会比较慢。使用 k-NN 算法时,对数据进行预处理是很重要的。这一算法对于有很多特征(几百或更多)的数据集往往效果不好,对于大多数特征的大多数取值都为 0 的数据集(所谓的稀疏数据集)来说,这一算法的效果尤其不好。
2.3.2 线性模型
1. 用于回归的线性模型
对于回归问题,线性模型预测的一般公式如下:
ŷ = w[0] * x[0] + w[1] * x[1] + … + w[p] * x[p] + b
w是特征(参数),b是学习模型的参数,ŷ是模型的预测结果。可以将预测的响应值看作输入特征的加权求和,权重由 w 的元素给出(可以取负值)。对于有多个特征的数据集而言,线性模型可以非常强大。特别地,如果特征数量大于训练数据点的数量,任何目标 y 都可以(在训练集上)用线性函数完美拟合 。有许多不同的线性回归模型。这些模型之间的区别在于如何从训练数据中学习参数 w 和b,以及如何控制模型复杂度。
2. 线性回归(又名普通最小二乘法)
线性回归,或者普通最小二乘法(ordinary least squares, OLS),是回归问题最简单也最经典的线性方法。线性回归寻找参数 w 和 b,使得对训练集的预测值与真实的回归目标值 y之间的均方误差最小。线性回归没有参数,这是一个优点,但也因此无法控制模型的复杂度。
3.岭回归(ridge regression)
如果使用标准线性模型,在训练集上性能很好,测试集性能差距较大,这是过拟合。替代方法是使用岭回归来控制模型复杂度。在岭
回归中,对系数(w)的选择不仅要在训练数据上得到好的预测结果,而且还要拟合附加约束。我们还希望系数尽量小。换句话说, w 的所有元素都应接近于 0。直观上来看,这意味着每个特征对输出的影响应尽可能小(即斜率很小),同时仍给出很好的预测结果。这种约束是所谓正则化(regularization)的一个例子。正则化是指对模型做显式约束,以免过拟合。岭回归用到的这种被称为 L2 正则化。
from sklearn.linear_model import Ridge
Ridge 模型在模型的简单性(系数都接近于 0)与训练集性能之间做出权衡。简单性和训练集性能二者对于模型的重要程度可以由用户通过设置 alpha 参数来指定。通过调整alpha 可以调整正则化的影响。
ridge10 = Ridge(alpha=10).fit(X_train, y_train)
另一种方法是固定 alpha 值,但改变训练数据量。将模型性能作为数据集大小的函数进行绘图,这样的图像叫作学习曲线。如果有足够多的训练数据,正则化变得不那么重要,并且岭回归和线性回归将具有相同的性能。线性回归的训练性能会随数据量增大而下降,这是因为模型难以过拟合或记住所有数据。
4.lasso
与岭回归相同,使用 lasso 也是约束系数使其接近于 0,但用到的方法不同,叫作 L1 正则化(系数的绝对值之和)。L1 正则化的结果是,使用 lasso 时某些系数刚好为 0。这说明某些特征被模型完全忽略。这可以看作是一种自动化的特征选择。某些系数刚好为 0,这样模型更容易解释,也可以呈现模型最重要的特征。与 Ridge 类似, Lasso 也有一个正则化参数 alpha,可以控制系数趋向于 0 的强度。scikit-learn 还提供了 ElasticNet类,结合了 Lasso 和 Ridge 的惩罚项。在实践中,这种结合的效果最好,不过代价是要调节两个参数:一个用于 L1 正则化,一个用于 L2 正则化。
5.用于分类的线性模型
线性模型也广泛应用于分类问题。我们首先来看二分类。这时可以利用下面的公式进行预测:
ŷ = w[0] * x[0] + w[1] * x[1] + …+ w[p] * x[p] + b > 0
不返回ŷ ,为预测设置了阈值(0)。如果函数值小于 0,我们就预测类别 -1;如果函数值大于 0,我们就预测类别 +1。对于用于回归的线性模型,输出 ŷ 是特征的线性函数,是直线、平面或超平面(对于更高维的数据集)。对于用于分类的线性模型, 决策边界是输入的线性函数。换句话说,(二元)线性分类器是利用直线、平面或超平面来分开两个类别的分类器。
学习线性模型有很多种算法。这些算法的区别在于以下两点:
• 系数和截距的特定组合对训练数据拟合好坏的度量方法;
• 是否使用正则化,以及使用哪种正则化方法。
最常见的2中线性分类算法
(1)Logistic回归
在 linear_model.LogisticRegression 中实现,虽然 LogisticRegression的名字中含有回归(regression),但它是一种分类算法,并不是回归算法,不应与LinearRegression 混淆。
(2)线性支持向量机(linearsupport vector machine,线性 SVM)
在 svm.LinearSVC(SVC 代表支持向量分类器)中实现
线性回归中用参数c来调整正则化效果,c越大,对应弱正则化,向过拟合发展;c越小,正则化越强,只关注大多数。与回归的情况类似,用于分类的线性模型在低维空间中看起来可能非常受限,决策边界只能是直线或平面。同样,在高维空间中,用于分类的线性模型变得非常强大,当考虑更多特征时,避免过拟合变得越来越重要
6.用于多分类的线性模型
(1)一对其余方法。
(2)多分类Logistic方法
7.优缺点
线性模型的主要参数是正则化参数,在回归模型中叫作 alpha,在 LinearSVC 和 LogisticRegression 中叫作 C。alpha 值较大或 C 值较小,说明模型比较简单。特别是对于回归模型而言,调节这些参数非常重要。通常在对数尺度上对 C 和 alpha 进行搜索。你还需要确定的是用 L1 正则化还是 L2 正则化。如果你假定只有几个特征是真正重要的,那么你应该用L1 正则化,否则应默认使用 L2 正则化。