k最近邻
适用于小型数据集
优点
- 模型很容易理解,通常不需要过多调节就可以得到不错的性能,是一种很好的基准方法
缺点
- 预测速度慢,不能处理具有很多特征的数据集
- 对于大多数特征的大多数取值都为0的数据集(稀疏数据集)来说,这一算法的效果尤其不好。
参数
1、邻居个数 n_neighbors
- 随着邻居个数的增多,模型变得简单,决策边界越来越光滑,训练集精度下降
- 使用较小的邻居个数(比如3个或5个)往往可以得到比较好的结果
2、数据点之间距离的度量方法:默认使用欧式距离
线性模型
- 适用于非常大的数据集(训练其他模型不太可行),对稀疏数据也很有效,也适用于高维数据。
- 如果特征数量大于样本数量,线性模型的表现通常都很好。
LinearRegression
对数据存在过拟合,Ridge
是一种约束更强的模型,更不容易过拟合,Lasso
使某些系数刚好为0,更容易解释
优点
- 线性模型的训练速度非常快,预测速度也很快。可以推广到非常大的数据集,对稀疏数据也有效。如果数据包含数十万甚至上百万个样本,可能需要研究如何使用
LogisticRegression
和Ridge
模型的solver='sag'
选项,在处理大型数据时,这一选项比默认值要更快。 - 用了我们之间见过的用于回归和分类的公式,理解如何进行预测是相对比较容易的。
缺点
- 往往不完全清楚系数为什么是这样的。如果数据集中包含高度相关的特征,很难对系数做出解释。
- 在更低维的空间中,其他模型(SVM等)的泛化性能可能更好。
参数
1、正则化参数
①回归正则化参数 alpha
- 默认
alpha=1
; - alpha值越大,使系数更加趋于0,模型更加简单;
- 减小alpha值可以提高泛化性能,alpha太小会出现过拟合,得到线性回归的相似结果
②分类正则化参数 C
- 默认
C=1
; - C值越小,系数向量更接近于0,模型比较简单,尽量适应“大多数”数据点,正则化强;
- C值越大,尽可能将训练集拟合到最好(使每个数据点分类准确)
2、回归:L1正则化(Lasso)还是L2正则化(Ridge)
分类:L1正则化还是L2正则化 penalty=”l1”
,solver='liblinear'
- 默认使用L2正则化
- 如果假定只有几个特征是真正重要的,如果模型的可解释性很重要的话,那么应该用L1正则化。由于L1只用到几个特征,所以更容易解释哪些特征对模型是重要的,以及这些特征的作用。
3、最大迭代次数 max_iter
朴素贝叶斯
- 只适用于分类问题。适用于非常大的数据集和高维数据。
GaussianNB
主要用于高维数据,而BernoulliNB
和MultinomialNB
则广泛用于稀疏计数数据,比如文本。MultinomialNB
的性能通常要优于BernoulliNB
,特别是在包含很多非零特征的数据集(即大型文档)上。
优点
- 类似线性模型,比线性模型速度还快,适用于非常大的数据集和高维数据。
- 它的训练和预测速度都很快,训练过程也很容易理解。
- 该模型对高维稀疏数据的效果很好,对参数的鲁棒性也相对较好。
缺点
- 类似线性模型,泛化能力通常要低于线性模型。
参数
1、模型复杂度参数 alpha
(MultinomialNB 和BernoulliNB)
- alpha的工作原理是,算法向数据中添加alpha这么多的虚拟数据点,这些点对所有特征都取正值。这可以将统计数据“平滑化”。
- alpha越大,平滑化越强,模型复杂度就越低。
- 算法性能对alpha值的鲁棒性相对较好,也就是说,alpha值对模型性能并不重要。但调整alpha通常都会使精度略有提高。
决策树
适用于特征的尺度完全不一样,或二元特征与连续特征同时存在的数据集
优点
- 得到的模型很容易可视化,非专家也很容易理解(至少对于较小的树而言);
- 算法完全不受数据缩放的影响。由于每个特征被单独处理,而且数据的划分也不依赖于缩放,因此决策树算法不需要特征预处理,比如归一化或标准化。特别是特征的尺度完全不一样时或者二元特征和连续特征同时存在时,决策树的效果很好。
缺点
- 即使做了预剪枝,它也经常会过拟合,泛化性能很差。因此,在大多数应用中,往往使用集成方法来替代单棵决策树。
参数
默认将树完全展开:树不断分支,直到所有叶结点都是纯的
控制决策树模型复杂度的参数是预剪枝参数,它在树完全展开之前停止树的构造。通常来说,选择一种预剪枝策略足以防止过拟合。
1、树的最大深度max_depth
2、叶节点最大数目 max_leaf_nodes
3、一个结点中样本点最小数目min_samples_leaf
4、随机种子 random_state
随机森林
不适用于高维稀疏数据。
优点
- 随机森林拥有决策树的所有优点,不需要数据缩放。
- 同时弥补了决策树的一些缺陷。鲁棒性很好,非常强大。
缺点
- 对于维度非常高的稀疏数据(如文本数据),随机森林的表现不是很好,使用线性模型更合适。
- 对于非常大的数据集,随机森林需要更大的内存,训练和预测的速度也比线性模型要慢。对一个应用来说,如果时间和内存很重要的话,那么换用线性模型可能更为明智。
- 如果你需要以可视化的方式向非专家总结预测过程,那么选择单棵决策树可能更好。
参数
1、树的个数 n_estimators
- 总是越大越好。对更多的树取平均可以降低过拟合,从而得到鲁棒性更好的集成。
- 不过收益是递减的,而且树越多需要的内存也越多,训练时间也越长。
- 常用的经验法则就是“在你的时间/内存允许的情况下尽量多”。
2、选择的特征个数 max_features
max_features=n_features
,考虑所有特征,无随机性max_features=1
,考虑随机选择的一个特征,并测试- max_features较大,随机森林的树非常相似,利用最独特的特征可以轻松拟合数据
- max_features较小,随机森林的树差异很大,为了很好的拟合数据,每棵树的深度都要很大,较小的max_features可以降低过拟合
- 回归问题默认值
max_features=n_features
- 分类问题默认值
max_features=sqrt(n_features)
3、树的最大深度max_depth
4、叶节点最大数目 max_leaf_nodes
5、随机种子 random_state
随机森林本质上是随机的,设置不同的随机状态可以彻底改变构建的模型。
如果你希望结果可以重现,固定random_state
是很重要的。
梯度提升决策树
- 梯度提升采用连续的方式构造树,每棵树都试图纠正前一棵树的错误
- 与其他基于树的模型相同,适用于二元特征与连续特征同时存在的数据集,不适用于高维稀疏数据。
优点
- 与随机森林相比,精度通常比随机森林略高,预测速度更快,需要的内存也更少。
- 与其他基于树的模型类似,这一算法不需要对数据进行缩放就可以表现得很好,而且也适用于二元特征与连续特征同时存在的数据集。
缺点
- 与随机森林相比,需要仔细调参,而且训练时间可能会比较长。
参数
参数1和2高度相关,通常的做法是根据时间和内存的预算选择合适的n_estimators
,然后对不同的learning_rate
进行遍历。
1、树的个数 n_estimators
默认为100棵树,总是越大越好,但梯度提升不同,增大n_estimators 会导致模型更加复杂,进而可能导致过拟合。
2、学习率 learning_rate
默认为0.1,降低学习率,可降低模型复杂度,用于控制每棵树对前一棵树的错误的纠正强度
3、树的最大深度max_depth
默认为3,限制最大深度,可降低每棵树的复杂度,通常都设置得很小,一般不超过5。
4、随机种子 random_state
核支持向量机
- 在低维数据和高维数据(即很少特征和很多特征)上的表现都很好;
- 对于特征含义相似,且范围也差不多的中等大小的数据集很强大。
优点
- SVM允许决策边界很复杂,即使数据只有几个特征。
- 它在低维数据和高维数据(即很少特征和很多特征)上的表现都很好。
缺点
- 对样本个数的缩放表现不好,在有多达10000 个样本的数据上运行SVM可能表现良好,如果数据量达到100000 甚至更大,在运行时间和内存使用方面可能会面临挑战。
- 需要数据缩放,对参数敏感。预处理数据和调参都需要非常小心。这也是为什么如今很多应用中用的都是基于树的模型,比如随机森林或梯度提升(需要很少的预处理,甚至不需要预处理)。此外,SVM模型很难检查,可能很难理解为什么会这么预测,而且也难以将模型向非专家进行解释。
参数
1、L1正则化参数 C
- 默认
C=1
,与线性模型相似,C值较小模型简单,C值较大模型复杂。 - C值很小,说明模型非常受限,每个数据点的影响范围都有限,决策边界看起来几乎是线性的,误分类的点对边界几乎没有任何影响。
- 增大C之后这些误分类点对模型的影响变大,使得决策边界发生弯曲来将这些点正确分类。
2、核的选择 kernel
- 径向基函数核/高斯核/RBF核:
kernel=’rbf’
- 多项式核:
kernel=’poly’
3、与核相关的参数
- RBF 核只有一个参数gamma,默认
gamma=1/n_features
,控制高斯核的宽度 - gamma较小,说明高斯核的半径较大,图中的决策边界比较平滑,生成的是复杂度较低的模型
- gamma越大,图中决策边界更关注单个点,大的gamma值生成更为复杂的模型。
神经网络(深度学习)
可以构建非常复杂的模型,特别是对于大型数据集而言。
优点
- 能够获取大量数据中包含的信息,并构建无比复杂的模型。给定足够的计算时间和数据,并且仔细调节参数,神经网络通常可以打败其他机器学习算法(无论是分类任务还是回归任务)
缺点
- 神经网络——特别是功能强大的大型神经网络——通常需要很长的训练时间。
- 需要仔细地预处理数据,对数据缩放敏感。与SVM 类似,神经网络在“均匀”数据上的性能最好(“均匀”是指所有特征都具有相似的含义)。如果数据包含不同种类的特征,那么基于树的模型可能表现得更好。
参数
神经网络对参数选取很敏感
hidden_layer_sizes
1、 隐层的个数 hidden_layer_sizes
2、 每个隐层的隐单元个数 默认hidden_layer_sizes = [100]
# 一个隐层,每个隐层100个隐单元
hidden_layer_sizes = [10,10]
# 两个隐层,每个隐层10个隐单元
3、 L2正则化参数 alpha
默认alpha=0.0001
(弱正则化),与岭回归中alpha相似,增大alpha可以降低模型复杂度
4、 使用的非线性函数 activation
默认为校正非线性,activation = ‘relu’
使用正切双曲线(tanh非线性):activation = ‘tanh’
5、 solver
参数
默认solver = ‘adam’
, 在大多数情况下效果都很好,但对数据的缩放相当敏感;
solver = ‘lbfg’
, 鲁棒性相当好,但在大型模型或大型数据集上的时间会比较长;
solver = ‘sgd’
, 深度学习高级研究人员会用到,还有许多其他参数需要调节。
6、 随机种子 random_state
7、 最大迭代次数 max_iter
调参的常用方法
- 首先创建一个大到足以过拟合的网络,确保这个网络可以对任务进行学习。
- 知道训练数据可以被学习之后,要么缩小网络,要么增大alpha来增强正则化,这可以提高泛化性能。
sklearn 算法与对应库
from | import | |
---|---|---|
KNN分类 | sklearn.neighbors | KNeighborsClassifier |
KNN回归 | sklearn.neighbors | KNeighborsRegressor |
最小二乘回归 | sklearn.linear_model | LinearRegression |
岭回归 | sklearn.linear_model | Ridge |
Lasso | sklearn.linear_model | Lasso |
Logistic回归 | sklearn.linear_model | LogisticRegression |
线性SVC | sklearn.svm | LinearSVC |
分类决策树 | sklearn.tree | DecisionTreeClassifier |
回归决策树 | sklearn.tree | DecisionTreeRegressor |
树的可视化 | sklearn.tree | export_graphviz |
随机森林 | sklearn.ensemble | RandomForestClassifier |
梯度提升树 | sklearn.ensemble | GradientBoostingClassifier |
支持向量机SVM | sklearn.svm | SVC |
MLP分类 | sklearn.neural_network | MLPClassifier |
MLP回归 | sklearn.neural_network | MLPRegressor |