机器学习种9种常用算法

一、常见算法分类

  • 分类方法
    • KNN
    • 逻辑斯蒂回归(logiscic)
    • 决策树
    • 朴素贝叶斯
    • 支持向量机SVC
from sklearn.neighbors import KNeighborsClassifier
from sklearn.linear_model import LogisticRegression
from sklearn.tree import DecisionTreeClassifier
from sklearn.naive_bayes import GaussianNB
from sklearn.svm import SVC
  • 回归方法
    • KNN
    • 普通线性回归(linear)
    • 岭回归(ridge)
    • lasso回归
    • 决策树
    • 支持向量机SVR
from sklearn.neighbors import KNeighborsRegressor
from sklearn.linear_model import LinearRegression
from sklearn.linear_model import Ridge
from sklearn.linear_model import Lasso
from sklearn.tree import DecisionTreeRegressor
from sklearn.svm import SVR
  • 聚类方法
    • K均值算法(K-means) (无监督学习)
from sklearn.cluster import KMeans

二、算法说明

1.KNN算法

kNN算法又称为k近邻分类(k-nearest neighbor classification)算法。是从训练集中找到和新数据最接近的k条记录,然后根据他们的主要分类来决定新数据的类别。

该算法涉及3个主要因素:训练集、距离或相似的衡量、k的大小。

  • 优点

简单,易于理解,易于实现,无需估计参数,无需训练

适合对稀有事件进行分类(例如当流失率很低时,比如低于0.5%,构造流失预测模型)

特别适合于多分类问题(multi-modal,对象具有多个类别标签),例如根据基因特征来判断其功能分类,kNN比SVM的表现要好

  • 缺点

懒惰算法,对测试样本分类时的计算量大,内存开销大,评分慢

可解释性较差,无法给出决策树那样的规则。

更多KNN算法理解

  • 使用
#1.导入:
分类问题:
from sklearn.neighbors import KNeighborsClassifier
回归问题:
from sklearn.neighbors import KNeighborsRegressor

#2.创建模型
knnclf = KNeighborsClassifier(n_neighbors=5)
knnrgr = KNeighborsRegressor(n_neighbors=3)

#3.训练
knnclf.fit(X_train,y_train)

#4.预测
y_pre = knnclf.predict(x_test)
  • 练习案例
    • 分类:处理鸢尾花数据、人类动作识别、预测年收入、手写数字识别
    • 回归:人脸补全

2.普通线性回归:linear

线性回归由两个词组成的:线性和回归。线性用来描述变量X(variable 或predictor或feature)的系数与响应Y(response)之间的关系是线性的。回归说明它的响应是定量(quantitative)的,而不是定性(qualitative)的。

  • 使用
#1.导入
from sklearn.linear_model import LinearRegression
#2.创建模型
line = LinearRegression()
#3.训练
line.fit(X_train,y_train)
#4.预测
y_pre= line.predict(x_test)
  • 案例:
    • 波士顿房价预测
    • 预测鲍鱼年龄
    • 人脸补全

3.岭回归:ridge

  • 定义

    岭回归(英文名:ridge regression, Tikhonov regularization)是一种专用于共线性数据分析的有偏估计回归方法,实质上是一种改良的最小二乘估计法,通过放弃最小二乘法的无偏性,以损失部分信息、降低精度为代价获得回归系数更为符合实际、更可靠的回归方法,对病态数据的拟合要强于最小二乘法。

岭回归是加了二阶正则项的最小二乘,主要适用于过拟合严重或各变量之间存在多重共线性的时候,岭回归是有bias的,这里的bias是为了让variance更小

归纳总结

1.岭回归可以解决特征数量比样本量多的问题
2.岭回归作为一种缩减算法可以判断哪些特征重要或者不重要,有点类似于降维的效果
3.缩减算法可以看作是对一个模型增加偏差的同时减少方差

岭回归用于处理下面两类问题:

1.数据点少于变量个数
2.变量间存在共线性(最小二乘回归得到的系数不稳定,方差很大)

  • 使用
#1.导入
from sklearn.linear_model import Ridge
#2.创建模型
# alpha就是缩减系数lambda
# 如果把alpha设置为0,就是普通线性回归
ridge = Ridge(alpha=0)
#3.训练
#4.预测

4.lasso回归

  • 说明

    该方法是一种压缩估计。它通过构造一个罚函数得到一个较为精炼的模型,使得它压缩一些系数,同时设定一些系数为零。因此保留了子集收缩的优点,是一种处理具有复共线性数据的有偏估计。

  • 使用

#1.导入
from sklearn.linear_model import Lasso
#2.创建模型
las = Lasso(alpha=0.0001)
#3.训练
#4.预测
  • 案例
    • 波士顿房价预测
    • 预测鲍鱼年龄
    • 人脸补全

5.逻辑斯蒂回归:logistic

  • 说明

利用Logistics回归进行分类的主要思想是:根据现有数据对分类边界线建立回归公式,以此进行分类。这里的“回归” 一词源于最佳拟合,表示要找到最佳拟合参数集。

训练分类器时的做法就是寻找最佳拟合参数,使用的是最优化算法。接下来介绍这个二值型输出分类器的数学原理

Logistic Regression和Linear Regression的原理是相似的,可以简单的描述为这样的过程:

(1)找一个合适的预测函数,一般表示为h函数,该函数就是我们需要找的分类函数,它用来预测输入数据的判断结果。这个过程是非常关键的,需要对数据有一定的了解或分析,知道或者猜测预测函数的“大概”形式,比如是线性函数还是非线性函数。

(2)构造一个Cost函数(损失函数),该函数表示预测的输出(h)与训练数据类别(y)之间的偏差,可以是二者之间的差(h-y)或者是其他的形式。综合考虑所有训练数据的“损失”,将Cost求和或者求平均,记为J(θ)函数,表示所有训练数据预测值与实际类别的偏差。

(3)显然,J(θ)函数的值越小表示预测函数越准确(即h函数越准确),所以这一步需要做的是找到J(θ)函数的最小值。找函数的最小值有不同的方法,Logistic Regression实现时有梯度下降法(Gradient Descent)。

  • 使用
#1.导入
from sklearn.linear_model import LogisticRegression

#2.创建模型
logistic = LogisticRegression(solver='lbfgs')

#solver参数的选择:
“liblinear”:小数量级的数据集
“lbfgs”, “sag” or “newton-cg”:大数量级的数据集以及多分类问题
“sag”:极大的数据集

#3.训练

#4.预测
  • 案例

    • 手写数字集分类
    • make_blobs聚类数据进行分类
    • 预测年收入是否大于50K美元
    • 从疝气病症预测病马的死亡率

    6.决策树

  • 说明

    决策树(decision tree)是一个树结构(可以是二叉树或非二叉树)。其每个非叶节点表示一个特征属性上的测试,每个分支代表这个特征属性在某个值域上的输出,而每个叶节点存放一个类别。使用决策树进行决策的过程就是从根节点开始,测试待分类项中相应的特征属性,并按照其值选择输出分支,直到到达叶子节点,将叶子节点存放的类别作为决策结果。

分类解决离散问题,回归解决连续问题
#1.导入
分类:from sklearn.tree import DecisionTreeClassifier
回归:from sklearn.tree import DecisionTreeRegressor
#2.创建模型
# max_depth 整数类型,决定对多少个数据特征做分裂
tree = DecisionTreeClassifier(max_depth=5)
tree = DecisionTreeRegressor(max_depth=5)
#3.训练
#4.预测
  • 案例

    • 处理鸢尾花数据
    • 预测隐形眼镜类型
    • 处理make_blobs聚类数据

    7.朴素贝叶斯

《机器学习种9种常用算法》

  • 优点:

    • 朴素贝叶斯模型发源于古典数学理论,有着坚实的数学基础,以及稳定的分类效率;
    • 对小规模的数据表现很好;
    • 能处理多分类任务,适合增量式训练;
    • 对缺失数据不太敏感,算法也比较简单,常用于文本分类
  • 缺点:

    • 只能用于分类问题
    • 需要计算先验概率;
    • 分类决策存在错误率;
    • 对输入数据的表达形式很敏感

    1、高斯分布朴素贝叶斯

  • 应用场景

    • 高斯分布就是正态分布
    • 用于一般分类问题
  • 使用

#1.导入
from sklearn.naive_bayes import GaussianNB
#2.创建模型
gNB = GaussianNB()
#3.训练
gNB.fit(data,target)
#4.预测
y_pre = gNB.predict(x_test)

2、多项式分布朴素贝叶斯

  • 应用场景

    • 适用于文本数据(特征表示的是次数,例如某个词语的出现次数)
  • 使用

#1.导入
from sklearn.naive_bayes import MultinomialNB

#2.创建模型
mNB = MultinomialNB()

#3.字符集转换为词频
from sklearn.feature_extraction.text import TfidfVectorizer
#先构建TfidfVectorizer对象
tf = TfidfVectorizer()
#使用要转换的数据集和标签集对tf对象进行训练
tf.fit(X_train,y_train)
#文本集 ----> 词频集
X_train_tf = tf.transform(X_train)

#4.使用词频集对机器学习模型进行训练
mNB.fit(X_train_tf,y_train)

#5.预测

#将字符集转化为词频集
x_test = tf.transform(test_str)
#预测
mNB.predict(x_test)
  • 案例:垃圾短信过滤

3、伯努利分布朴素贝叶斯

  • 应用场景

    • 适用于伯努利分布,也适用于文本数据(此时特征表示的是是否出现,例如某个词语的出现为1,不出现为0)
    • 绝大多数情况下表现不如多项式分布,但有的时候伯努利分布表现得要比多项式分布要好,尤其是对于小数量级的文本数据
  • 使用

#1.导入
from sklearn.naive_bayes import BernoulliNB

#2.创建模型
bNB = BernoulliNB()

#3.将字符集转词频集
from sklearn.feature_extraction.text import TfidfVectorizer
tf = TfidfVectorizer()
tf.fit(X_train,y_train)
X_train_tf = tf.transform(X_train)

#4.训练
bNB.fit(X_train_tf,y_train)

#5.预测
#将字符集转化为词频集
x_test = tf.transform(test_str)
#预测
bNB.predict(x_test)
  • 案例
    • 高斯分布:普通分类(鸢尾花)
    • 多项式分布、伯努利分布:文本处理(垃圾短信、垃圾邮件过滤)

8.支持向量机SVM

  • 原理

解决的问题:

1.线性分类

在训练数据中,每个数据都有n个的属性和一个二类类别标志,我们可以认为这些数据在一个n维空间里。我们的目标是找到一个n-1维的超平面(hyperplane),这个超平面可以将数据分成两部分,每部分数据都属于同一个类别。 其实这样的超平面有很多,我们要找到一个最佳的。因此,增加一个约束条件:这个超平面到每边最近数据点的距离是最大的。也成为最大间隔超平面(maximum-margin hyperplane)。这个分类器也成为最大间隔分类器(maximum-margin classifier)。 支持向量机是一个二类分类器。

2.非线性分类

SVM的一个优势是支持非线性分类。它结合使用拉格朗日乘子法和KKT条件,以及核函数可以产生非线性分类器。
SVM的目的是要找到一个线性分类的最佳超平面 f(x)=xw+b=0。求 w 和 b。

首先通过两个分类的最近点,找到f(x)的约束条件。
有了约束条件,就可以通过拉格朗日乘子法和KKT条件来求解,这时,问题变成了求拉格朗日乘子αi 和 b。
对于异常点的情况,加入松弛变量ξ来处理。
非线性分类的问题:映射到高维度、使用核函数。

线性分类及其约束条件:
SVM的解决问题的思路是找到离超平面的最近点,通过其约束条件求出最优解。

  • 使用
#1.导入
处理分类问题:
from sklearn.svm import SVC
处理回归问题:
from sklearn.svm import SVR
#2.创建模型(回归时使用SVR)
svc = SVC(kernel='linear')
svc = SVC(kernel='rbf')
svc = SVC(kernel='poly')
#3.训练
svc_linear.fit(X_train,y_train)
svc_rbf.fit(X_train,y_train)
svc_poly.fit(X_train,y_train)
#4.预测
linear_y_ = svc_linear.predict(x_test)
rbf_y_ = svc_rbf.predict(x_test)
poly_y_ = svc_poly.predict(x_test)

9.K均值算法(K-means)

  • 原理

    • 聚类的概念:一种无监督的学习,事先不知道类别,自动将相似的对象归到同一个簇中。
    • K-Means算法是一种聚类分析(cluster analysis)的算法,其主要是来计算数据聚集的算法,主要通过不断地取离种子点最近均值的算法。
  • 使用

#1.导入
from sklearn.cluster import KMeans

#2.创建模型
# 构建机器学习对象kemans,指定要分类的个数
kmean = KMeans(n_clusters=2)

#3.训练数据
# 注意:聚类算法是没有y_train的
kmean.fit(X_train)

#4.预测数据
y_pre = kmean.predict(X_train)
  • 实例
    • 中国足球定位
    • 图片压缩
    原文作者:五大常用算法
    原文地址: https://blog.csdn.net/weixin_38748717/article/details/78837762
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞