原文链接:https://blog.csdn.net/snail9610/article/details/104764985
全文2万多字,建议收藏!!!
0 本文介绍1 K近邻 1.1 何为K近邻 1.2 构建K近邻—分类 1.3 KNeighborsClassifier 1.4 构建K近邻—回归 1.5 优点、缺点和参数 2 线性模型 2.1 线性回归 2.2 岭回归Ridge 2.3 Lasso回归 2.4 用于分类的线性模型—logistic/SVC 2.5 用于多分类的线性模型 2.7 优点、缺点、参数 3 朴素贝叶斯分类器 3.1 特点 3.2 实现 3.3 特征计算方式 3.4 优点、缺点和参数 4 决策树 4.1 构造决策树 4.2 控制决策树的复杂度 4.3 分析决策树 4.4 树的特征重要性 4.5 优点、缺点和参数 5 决策树集成 5.1 随机森林 5.2 梯度提升回归树(梯度提升机) 6 核支持向量机 6.1 线性模型与非线性特征 6.2 核技巧 6.3 对SVM的理解 6.4 SVM调参 6.5 数据预处理 6.6 优点、缺点 7 神经网络 7.1 简单神经网络模型 7.2 神经网络构建和调参 7.3 优点、缺点 8 监督学习模型的选择原则
0 本文介绍
本文根据Andreas C.Muller的《Introduction to Machine Learning with Python》和西瓜书,整理了常见的监督学习模型。本文不讲解复杂的数学理论,涉及到了K近邻、线性模型、朴素贝叶斯分类器、决策树、随机森林、梯度提升回归树、SVM、MLP,以及监督学习模型的选择原则,全文2万多字, 后续还会进一步补充 。 在后面的推送中会记录机器学习数学推导、无监督学习等机器学习内容,Kaggle竞赛等竞赛。1 K近邻
1.1 何为K近邻
KNN 算法可以说是最简单的机器学习算法,构建和预测都非常简单。构建模型只需要保存训练数据集即可。想要对新数据点做出预测,算法会在训练数据集中找到最近的数据点,也就是它的“最近邻”。 一个邻居: KNN算法最简单的就是一个最近邻,也就是与我们想要预测的数据点最近的训练数据点。预测结果就是这个训练数据点的已知输出。 K个邻居: 在考虑多于一个邻居的情况时,我们用 “投票法”(voting) 来指定标签。也就是说,对于每个测试点,我们数一数多少个邻居属于类别0,多少个邻居属于类别1。然后将出现次数更多的类别(也就是k 个近邻中占多数的类别)作为预测结果。1.2 构建K近邻—分类
在scikit-learn中构建K近邻十分简单,只需要导入类并将其实例化即可。这时可以设定参数,比如邻居的个数。 from sklearn.neighbors import KNeighborsClassifierclf = KNeighborsClassifier(n_neighbors=optional number)clf.fit(X_train, y_train)clf.predict(X_test)print("Test set accuracy: {:.2f}".format(clf.score(X_test, y_test)))
1.3 KNeighborsClassifier
可以进行可视化,以查看决策边界(decision boundary),即算法对类别0 和类别1 的分界线。 模型复杂度和邻居的关系:- 使用单一邻居绘制的决策边界紧跟着训练数据
- 随着邻居个数越来越多,决策边界也越来越平滑
- 更平滑的边界对应更简单的模型,使用更少的邻居对应更高的模型复杂度,而使用更多的邻居对应更低的模型复杂度
- 极端情况:邻居个数等于训练集中所有数据点的个数,那么每个测试点的邻居都完全相同(即所有训练点),所有预测结果也完全相同即训练集中出现次数最多的类别。
1.4 构建K近邻—回归
利用单一邻居的预测结果就是最近邻的目标值。在使用多个近邻时,预测结果为这些 邻居的平均值 。 用于回归的k 近邻算法在scikit-learn 的KNeighborsRegressor 类中实现。其用法与KNeighborsClassifier 类似: from sklearn.neighbors import KNeighborsRegressorreg = KNeighborsRegressor(n_neighbors=3)print("Test set R^2: {:.2f}".format(reg.score(X_test, y_test))
对于回归问题,score是决定系数R^2,是回归模型预测的优度度量,位0到1之间。R^2等于1 对应完美预测,R^2 等于0 对应常数模型,即总是预测训练集响应(y_train)的平均值。
1.5 优点、缺点和参数
通常,KNeighbors 分类器有2 个重要参数:邻居个数与数据点之间距离的度量方法。在实践中,使用较小的邻居个数(比如3 个或5 个)往往可以得到比较好的结果。scikit-learn默认使用欧式距离。- KNN的优点之一就是模型很容易理解,通常不需要过多调节就可以得到不错的性能
- 构建最近邻模型的速度通常很快,但如果训练集很大(特征数很多或者样本数大),预测速度可能会比较慢。
- 对于有很多特征(几百或更多)的数据集往往效果不好,对于大多数特征的大多数取值都0的数据集(所谓的稀疏数据集)来说,这一算法的效果尤其不好。
2 线性模型
2.1 线性回归
线性回归或者普通最小二乘法(ordinary least squares,OLS) 均方误差(mean squared error)是预测值与真实值之差的平方和除以样本数。线性回归没有参数,这是一个优点,但也因此无法控制模型的复杂度。 Tips:- 注意到了coef_ 和intercept_ 结尾处奇怪的下划线。scikit-learn总是将从训练数据中得出的值保存在以下划线结尾的属性中。这是为了将其与用户设置的参数区分开。
- 训练集和测试集上的分数非常接近(特别是都非常低时)。这说明可能存在欠拟合,而不是过拟合。
- 训练集和测试集之间的性能差异是过拟合的明显标志,因此我们应该试图找到一个可以控制复杂度的模型。
2.2 岭回归Ridge
- 预测公式与普通最小二乘法相同。(同)
- 对系数(w)的选择不仅要在训练数据上得到好的预测结果,而且还要拟合附加约束。(异)
- 我们还希望系数尽量小。换句话说,w 的所有元素都应接近于 0。直观上来看,这意味着每个特征对输出的影响应尽可能小(即斜率很小),同时仍给出很好的预测结果。这种约束是所谓正则化(regularization)的一个例子。
- 正则化是指对