各种机器学习算法比较

前言

 简单介绍各种机器学习算法的优缺点,和用python中的一些相关库的用法

一、监督学习算法

1、k-NN近邻

1.1 简介

 k-NN 算法可以说是最简单的机器学习算法。构建模型只需要保存训练数据集即可。想要对新数据点做出预测,算法会在训练数据集中找到最近的数据点,也就是它的“最近邻”。

 主要过程为:1. 计算训练样本和测试样本中每个样本点的距离(常见的距离度量有欧式距离,马氏距离等);2. 对上面所有的距离值进行排序;3. 选前k个最小距离的样本;4. 根据这k个样本的标签进行投票,得到最后的分类类别;

1.2 实现

1.2.1 导入
from sklearn.neighbors import KNeighborsClassifier
# 还可以用于回归,在使用多个近邻时,预测结果为这些邻居的平均值
from sklearn.neighbors import KNeighborsRegressor
1.2.2 实例化并设定邻居的个数为3
clf = KNeighborsClassifier(n_neighbors=3)
1.2.3 训练、预测和评估
clf.fit(X_train, y_train)
clf.predict(X_test)
clf.score(X_test, y_test)

1.3 优缺点及参数

1.3.1 优点
  • 理论成熟,思想简单,既可以用来做分类也可以用来做回归;
  • 可用于非线性分类;
  • 训练时间复杂度为O(n);
  • 对数据没有假设,准确度高,对outlier不敏感;
1.3.2 缺点
  • 计算量大,预测速度慢;
  • 样本不平衡问题(即有些类别的样本数量很多,而其它样本的数量很少);
  • 需要大量的内存;
  • 不能处理具有很多特征的问题
1.3.3参数

  主要有两个参数,即邻居的个数和距离的选择,默认的是欧式距离

2、线性模型

2.1 简介

 线性模型是在实践中广泛使用的一类模型,利用输入特征的线性函数进行预测。

 分为回归和分类,回归又包括最小二乘回归、岭回归(斜率参数尽可能小,用L2正则惩罚)和lasso回归(有的斜率参数为0,用L1正则惩罚),分类包括Logistic回归。

2.2 实现

2.2.1 导入
# 线性回归
from sklearn.linear_model import LinearRegression
# 岭回归
from sklearn.linear_model import Ridge
# lasso回归
from sklearn.linear_model import Lasso

# Logistic回归
from sklearn.linear_model import LogisticRegression
2.2.2 训练、预测和评估
# 线性模型的训练
lr = LinearRegression().fit(X_train, y_train)
# 线性模型的预测
lr.predict()
# 斜率参数,是一个numpy数组
lr.coef_
# 截距参数,是一个浮点数
lr.intercept_
lr.score(X_test, y_test)

# 岭回归与线性回归类似,但可以设置α参数,α越大,惩罚越厉害,斜率越小,但可能会提高泛化性能
Ridge(alpha=10)

# lasso回归与线性回归类似,同样可以设置α和运行迭代得最大次数,α越大,惩罚越厉害,斜率可能会降为0
Lasso(alpha=0.01, max_iter=100000)

# Logistic回归用参数C控制正则化强度,c越大,对应的正则化越弱
LogisticRegression(C=100)

2.3 优缺点

2.3.1 优点
  • 线性回归实现简单,计算简单
  • 训练速度非常快,预测速度也很快
  • Logistic回归实现简单,广泛的应用于工业问题上
  • 对Logistic回归而言,多重共线性并不是问题,它可以结合L2正则化来解决该问题
2.3.2 缺点
  • 线性模型不能拟合非线性数据
  • 当特征空间很大时,Logistic回归性能不太好
  • Logistic回归容易欠拟合,一般准确度不太高
  • Logistic回归不能很好地处理大量多类特征或变量

3、朴素贝叶斯

3.1 简介

 与线性模型非常相似,但它的训练速度往往更快。这种高效率所付出的代价是,朴素贝叶斯模型的泛化能力要比线性分类器(如LogisticRegression 和LinearSVC)稍差。

 朴素贝叶斯基于贝叶斯定理与特征条件独立假设,对于给定的训练数据集,首先基于特征条件独立假设学习输入输出的联合概率分布;然后基于此模型,对于给定的输入x,利用贝叶斯定理求出后验概率最大的输出y

4、支持向量机

4.1 简介

 功能强大,能执行线性或非线性分类、回归,甚至是异常值检测问题。特别适用于中小型复杂数据集的分类。就算数据在原特征空间线性不可分,只要给个合适的核函数,它就能运行得很好。但内存消耗大,难以解释,运行和调参也有些烦人,而随机森林却刚好避开了这些缺点,比较实用。

 支持向量机分为有核和无核,无核和线性模型类似。

4.2 实现

4.2.1 导入
# 用于分类
from sklearn.svm import LinearSVC
# 非线性,添加核函数
from sklearn.svm import SVC

# 用于回归
from sklearn.svm import LinearSVR
4.2.2 训练、预测和评估
# 训练
linear_svm = LinearSVC().fit(X, y)
# 预测
linear_svm.predict()
# 评估
linear_svm.score(X_test, y_test)

4.3 优缺点及参数

4.3.1 参数

 参数主要包括gamma,c。小的gamma 值表示决策边界变化很慢,生成的是复杂度较低的模型,而大的gamma 值则会生成更为复杂的模型。C 参数是正则化参数,与线性模型中用到的类似。c越大模型越复杂。默认c=1,gamma=1/n_features。

 另一个重要的参数就是选择核函数。一般选用高斯核函数。

4.3.2 优点
  • 可以解决高维问题,即大型特征空间
  • 能够处理非线性特征的相互作用
  • 无需依赖整个数据
  • 可以提高泛化能力
4.3.3 缺点
  • 预处理数据和调参都需要非常小心
  • 当观测样本很多时,效率并不是很高
  • 对缺失数据敏感

4.4 与Logistic回归的对比

  • 如果相比于样本数(m),样本的特征(n)很大,用Logistic回归或线性svm
  • 如果n很小,m适中,用高斯核的svm
  • 如果n很小,m很大,创建或增加n,然后同第一条

5、随机森林

5.1 简介

 随机森林本质上是许多决策树的集合,其中每棵树都和其他树略有不同。随机森林背后的思想是,每棵树的预测可能都相对较好,但可能对部分数据过拟合。如果构造很多树,并且每棵树的预测都很好,但都以不同的方式过拟合,那么我们可以对这些树的结果取平均值来降低过拟合。既能减少过拟合又能保持树的预测能力。

 随机森林中树的随机化方法有两种:一种是通过选择用于构造树的数据点,另一种是通过选择每次划分测试的特征。而每颗树用的数据集为从原始数据集bootstrap采样得到的。

 对于回归问题,我们可以对这些结果取平均值作为最终预测;对于分类问题,则用到了“软投票”策略。也就是说,每个算法做出“软”预测,给出每个可能的输出标签的概率。对所有树的预测概率取平均值,然后将概率最大的类别作为预测结果。

5.2 实现

5.2.1 导入
from sklearn.ensemble import RandomForestClassifier
# 其中n_estimators控制树的个数,还有max_features参数,控制每棵树在每个节点处选择的特征个数,还有设置n_jobs=-1,使用所有的cpu内核进行训练
forest = RandomForestClassifier(n_estimators=5, random_state=2)
5.2.2 训练、预测和评估
# 训练
forest.fit(X_train, y_train)
# 预测
forest.predict(X_test)
# 评估
forest.score(X_train, y_train)
# 特征的重要性
forest.feature_importances_

5.3 优缺点和重要参数

详见随机森林的优缺点
有一个缺点是训练和预测的速度要比线性模型要慢

6、如何选择?

  1. 首当其冲应该选择的就是逻辑回归,如果它的效果不怎么样,那么可以将它的结果作为基准来参考,在基础上与其他算法进行比较;

  2. 然后试试决策树(随机森林)看看是否可以大幅度提升你的模型性能。即便最后你并没有把它当做为最终模型,你也可以使用随机森林来移除噪声变量,做特征选择;

  3. 如果特征的数量和观测样本特别多,那么当资源和时间充足时(这个前提很重要),使用SVM不失为一种选择。

二、无监督学习算法

  • 1
    点赞
  • 28
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值