前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >机器学习-算法篇(上)

机器学习-算法篇(上)

原创
作者头像
harry1225
发布2021-11-24 15:42:35
4050
发布2021-11-24 15:42:35
举报
文章被收录于专栏:算法harry算法harry

一、常用的机器学习算法

1LR

1.1算法原理

逻辑斯蒂回归(Logistic Regression)虽然被称为回归,但其实际上是分类模型,常用于二分类。LR模型因其简单好实现、可解释强深受工业界喜爱。

在机器学习领域,我们听到的更多是损失函数的概念,常通过构建损失函数,然后最小化损失函数求得目标参数。LR的本质是:假设数据服从这个分布,対生成的结果是0或1的概率进行建模,通过采用最大似然估计的方法最大化似然函数,采用梯度上升的方法得到使似然函数最大的参数。

1.2算法实现

代码语言:python
复制
# -*- coding: utf-8 -*-
import numpy as np
import pandas as pd
from sklearn.linear_model.logistic import LogisticRegression
from sklearn.model_selection import cross_val_score
from sklearn.model_selection import train_test_split
from sklearn.preprocessing import StandardScaler

# 导入数据
data = pd.read_csv('data.txt', header=None, sep='\t')
x = data.iloc[:, :-1]
y = data.iloc[:, -1]

# 切分训练集、测试集
x_train, x_test, y_train, y_test = train_test_split(x, y, test_size=0.3, random_state=1)

# 数据标准化
sc = StandardScaler()
x_train = sc.fit_transform(x_train)
x_test = sc.transform(x_test)

# 建模
lr = LogisticRegression(penalty='l2',
                        tol=0.01,
                        C=1.0,
                        solver='liblinear',
                        max_iter=100,
                        random_state=1)

# 模型训练
lr.fit(x_train, y_train)

# 模型评估
y_predict = lr.predict(x_test)
acc = lr.score(x_test, y_test)
print(acc)

算法参数如下:

  • penalty:惩罚项,’l1’ or ‘l2’ ,默认为’l2’。
  • dual:bool 默认False。双配方仅用于利用liblinear解算器的l2惩罚。
  • tol::float, 默认: 1e-4线性支持向量机 ‘公差停止标准’。
  • C:float 默认:相关性.0 正则化强度, 与支持向量机一样,较小的值指定更强的正则化。
  • fit_intercept:bool 默认:True 指定是否应将常量添加到决策函数中。
  • intercept_scaling:float ,默认:相关性 仅在使用求解器“liblinear”且self.fit_intercept设置为True时有用。
  • class_weight:dict or ‘balanced’ 默认:None。{class_label:weight}形式的类相关联的权重。

1.3算法优缺点

1.3.1优点

  • 计算代价不高,易于理解、实现、解释
  • 适合需要得到一个分类概率的场景
  • 可以使用逻辑回归来确定特征之间的联系

1.3.2缺点

  • 容易产生欠拟合
  • 分类精度不高
  • 不好处理多分类的问题、无法解决非线性问题
  • 对异常值敏感,数据集中存在与预期范围不同的数据值可能会导致错误结果

2KNN

2.1算法原理

k近邻(K-Nearest Neighbor,简称KNN)是一种常用的监督学习算法,其工作机制非常简单:给定测试样本,基于某种距离度量找出训练集中与其最靠近的k个训练样本,然后基于这k个“邻居”的信息来进行预测。

2.2算法实现

代码语言:python
复制
from sklearn.neighbors import KNeighborsClassifier

knn = KNeighborsClassifier(n_neighbors=5,
                           weights='distance')

# 模型训练
knn.fit(x_train, y_train)

# 模型评估
y_predict = knn.predict(x_test)
acc = knn.score(x_test, y_test)
print(acc)

模型参数如下:

  • n_neighbors:选择多少个k紧邻进行预测
  • weights:uniform代表众生平等,distance代表距离与权重成反比

2.3算法优缺点

2.3.1优点

  • 简单、有效。
  • 由于KNN方法主要靠周围有限的邻近的样本,而不是靠判别类域的方法来确定所属类别的,因此对于类域的交叉或重叠较多的待分样本集来说,KNN方法较其他方法更为适合。
  • 该算法比较适用于样本容量比较大的类域的自动分类,而那些样本容量较小的类域采用这种算法比较容易产生误分。

2.3.2缺点

  • KNN算法是懒散学习方法,相比一些积极学习算法学习速度更慢。
  • 类别评分不是规格化的(不像概率评分)。输出的可解释性不强,例如决策树的可解释性较强。
  • 不适用于样本不平衡情况。
  • 可以采用权值的方法(和该样本距离小的邻居权值大)来改进。
  • 计算量较大。目前常用的解决方法是事先对已知样本点进行剪辑,事先去除对分类作用不大的样本。

3朴素贝叶斯

3.1算法原理

朴素贝叶斯分类是一种十分简单的分类算法,说它十分简单是因为它的解决思路非常简单。即对于给出的待分类项,求解在此项出现的条件下各个类别出现的概率,哪个最大,就认为此待分类项属于哪个类别。举个形象的例子,若我们走在街上看到一个黑皮肤的外国友人,让你来猜这位外国友人来自哪里。十有八九你会猜是从非洲来的,因为黑皮肤人种中非洲人的占比最多,虽然黑皮肤的外国人也有可能是美洲人或者是亚洲人。但是在没有其它可用信息帮助我们判断的情况下,我们会选择可能出现的概率最高的类别,这就是朴素贝叶斯的基本思想。

相关定理及概念如下:

  • 先验概率:通过经验来判断事情发生的概率,比如说“贝叶死”的发病率是万分之一,就是先验概率。
  • 后验概率:后验概率就是发生结果之后,推测原因的概率。比如说某人查出来了患有“贝叶死”,那么患病的原因可能是 A、B 或 C。患有“贝叶死”是因为原因 A 的概率就是后验概率。
  • 条件概率:事件 A 在另外一个事件 B 已经发生条件下的发生概率,表示为 P(A|B)。**比如原因 A 的条件下,患有“贝叶死”的概率就是条件概率。

3.2算法实现

代码语言:python
复制
from sklearn.naive_bayes import GaussianNB, BernoulliNB, MultinomialNB

bayes = GaussianNB()
bayes.fit(x_train, y_train)

# class_prior_ :获取各个类的先验概率
print(bayes.class_prior_)
y_predict = bayes.predict(x_test)
y_predict_proba = bayes.predict_proba(x_test)
acc = bayes.score(x_test, y_test)
print(acc)

模型参数如下:

  • naive_bayes.BernoulliNB:伯努利分布下的朴素贝叶斯,适用于离散变量,其假设各个特征xi在各个类别y下是服从n重伯努利分布(二项分布)的,因为伯努利试验仅有两个结果,因此,算法会首先对特征值进行二值化处理(假设二值化的结果为1与0)。
  • naive_bayes.GaussianNB:高斯分布下的朴素贝叶斯,适用于连续变量,其假定各个特征xi在各个类别y下是服从正态分布的,算法内部使用正态分布的概率密度函数来计算概率。高斯朴素贝叶斯相比其他线性模型擅长在环形数据和月亮型数据上的分类。
  • naive_bayes.MultinomialNB:多项式分布下的朴素贝叶斯,适用于离散变量,其假设各个特征xi在各个类别y下是服从多项式分布的,故每个特征值不能是负数。

3.3算法优缺点

3.3.1优点

  • 坚实的数学理论支撑,稳定的分类效率
  • 对缺失数据不太敏感,算法比较简单,常用于文本分类
  • 对小规模的数据表现很好,能个处理多分类任务,适合增量式训练

3.3.2缺点

  • 要求特征之间相互独立,该假设往往在实际应用中是不成立的
  • 需要知道先验概率,且先验概率很多时候取决于假设,假设的模型可以有很多种,因此在某些时候会由于假设的先验模型的原因导致预测效果不佳。
  • 由于我们是通过先验和数据来决定后验的概率从而决定分类,所以分类决策存在一定的错误率。

4、SVM

3.1算法原理

Svm(support Vector Mac)又称为支持向量机,是一种二分类的模型。其主要思想为找到空间中的一个更够将所有数据样本划开的超平面,并且使得本本集中所有数据到这个超平面的距离最短。

4.2算法实现

代码语言:python
复制
from sklearn import svm

svc = svm.SVC(C=1.0,
              cache_size=200,
              class_weight=None,
              coef0=0.0,
              degree=3,
              gamma='auto',
              kernel='rbf',
              max_iter=-1,
              probability=False,
              random_state=None,
              shrinking=True,
              tol=0.001,
              verbose=False)

svc.fit(x_train, y_train)

# 分类结果
y_predict = svc.predict(x_test)
acc = svc.score(x_test, y_test)
print(acc)

模型参数如下:

  • C: 错误项的惩罚系数,默认值为1.0 。C越大,对分错样本的惩罚程度越大,在训练样本中准确率越高,对测试数据的分类准确率降低。相反,减小C的话,容许训练样本中有一些误分类错误样本,泛化能力强。对于训练样本带有噪声的情况,一般采用后者,把训练样本集中错误分类的样本作为噪声。
  • kernel: 算法中采用的核函数类型,默认为‘rbf’。‘linear’:线性核函数 、‘poly’:多项式核函数 、‘rbf’:径像核函数/高斯核、‘sigmod’:sigmod核函数 、‘precomputed’:核矩阵。
  • degree: 指多项式核函数的阶数n,默认为3。这个参数只对多项式核函数有用,如果给的核函数参数是其他核函数,则会自动忽略该参数。
  • gamma: 核函数系数,默认为auto。只对‘rbf’,‘poly’,‘sigmod’有效。如果gamma为auto,代表其值为样本特征数的倒数,即1/n_features.
  • coef0:核函数中的独立项,float类型,可选参数,默认为0.0。只有对’poly’ 和,’sigmod’核函数有用,是指其中的参数c。
  • probability:是否启用概率估计,默认为False。这必须在调用fit()之前启用,并且会fit()方法速度变慢。
  • class_weight:默认为None,如果给定参数‘balance’,根据y的值自动平衡正负样本的权重。
  • max_iter :最大迭代次数,默认为-相关性。
  • random_state:伪随机数发生器的种子,默认为None 。

4.3算法优缺点

4.3.1优点

  • 可以解决小样本情况下的机器学习问题
  • 可以提高泛化性能
  • 可以解决高维问题
  • 可以解决非线性问题
  • 可以避免神经网络结构选择和局部极小点问题

4.3.2缺点

  • 对缺失数据敏感
  • 对非线性问题没有通用解决方案,必须谨慎选择Kernelfunction来处理

5、决策树

决策树就是一个类似于流程图的树形结构,树内部的每一个节点代表的是对一个特征的测试,树的分支代表该特征的每一个测试结果,而树的每一个叶子节点代表一个类别。树的最高层是就是根节点。

决策树是机器学习中很经典的一个算法,可用于分类和回归。一棵决策树的生成过程主要分为以下3个部分:

  • 特征选择:特征选择是指从训练数据中众多的特征中选择一个特征作为当前节点的分裂标准,如何选择特征有着很多不同量化评估标准标准,从而衍生出不同的决策树算法。
  • 决策树生成: 根据选择的特征评估标准,从上至下递归地生成子节点,直到数据集不可分则停止决策树停止生长。 树结构来说,递归结构是最容易理解的方式。
  • 剪枝:决策树容易过拟合,一般来需要剪枝,缩小树结构规模、缓解过拟合。剪枝技术有预剪枝和后剪枝两种。

5.1决策树相关概念

  • 熵:样本集合不纯度,熵越小,集合不纯度越低;知识的不确定性,熵越小,不确定性越小。
  • 条件熵:条件概率p(y|x)就是在X的条件下我们计算Y的概率,那么条件熵也是相同的,就是我们先按照X做为分类标准,再计算以Y作为分类标准的熵值。
  • 信息增益:以某特征划分前后集合熵的差值来衡量使用当前特征对于样本集合D划分效果的好坏。
  • 信息增益比:以信息作为划分训练数据的特征,存在偏向选择取值较多的特征的问题,使用信息增益比可以校正这一问题。 信息增益比等于特征A的信息增益g(D,A)除以,训练数据集D关于在特征A下的熵H(D)的比值。
  • 基尼指数:表示在样本集合中一个随机选中的样本被分错的概率。 Gini指数越小表示集合中被选中的样本被分错的概率越小,也就是说集合的纯度越高,反之,集合越不纯。

5.2算法原理

5.1.1ID3算法

ID3算法是最早提出的一种决策树算法,ID3算法的核心是在决策树各个节点上应用信息增益准则来选择特征,递归的构建决策树。具体方法是:从根节点开始,对节点计算所有可能的特征的信息增益,选择信息增益最大的特征作为节点的特征,由该特征的不同取值建立子节点:再对子节点递归的调用以上方法,构建决策树:直到所有的特征信息增益均很小或没有特征可以选择为止。

ID3算法缺点:

  • ID3不能处理连续数据的属性
  • ID3不能处理有属性缺失的样本
  • ID3容易产生过度拟合
  • ID3一般会优先选择较多属性值的特征,因为属性多的特征会有相对较大的信息增益

5.1.2C4.5算法

C4.5算法与ID3算法决策树的生成过程相似,C4.5算法对ID3算法进行了改进,它是用信息增益比来选择特征。

5.1.3CART算法

CART算法(classification and regression tree)分类和回归算法,是一种应用广泛的决策树学习方法,既然是一种决策树学习方法,CART算法既可以用于分类还可以用于回归。当CART是分类树的时候,采用GINI值作为分裂节点的依据,当CART作为回归树的时候,使用样本的最小方差作为分裂节点的依据。

5.1.4ID3、C4.5、CART对比

算法

支持模型

树结构

特征选择

连续值处理

缺失值处理

剪枝

ID3

分类

多叉树

信息增益

不支持

不支持

不支持

C4.5

分类

多叉树

信息增益比

支持

支持

支持

CART

分类,回归

二叉树

基尼系数,均方差

支持

支持

支持

5.2算法实现

代码语言:javascript
复制
from sklearn import tree

# 分类树
tree = tree.DecisionTreeClassifier(criterion='entropy',
                                   max_depth=3,
                                   min_samples_leaf=5)
                                   
tree.fit(x_train, y_train)


# 决策树中的类数量
tree_num = tree.n_classes_

# feature的重要性,值越大那么越重要
feature_score = tree.feature_importances_

y_predict = tree.predict(x_test)
y_predict_proba = tree.predict_proba(x_test)
acc = tree.score(x_test, y_test)
print(acc)

模型参数如下:

  • class_weight:类别权重,默认为None。可选值还有dict和balanced,dict:指定样本各类别的权重,权重大的类别在决策树构造的时候会进行偏倚;balanced:算法自己计算权重,样本量少的类别所对应的样本权重会更高。
  • criterion:在基于特征划分数据集合时,选择特征的标准。默认是gini,也可以是entropy。
  • max_depth:决策树的最大深度,我们可以控制决策树的深度来防止决策树过拟合。
  • max_features:在划分数据集时考虑的最多的特征值数量。为int或float类型。其中int值是每次split时最大特征数;float值是百分数,即特征数=max_features*n_features。
  • max_leaf_nodes:最大叶子节点数。int类型,默认为None。默认情况下是不设置最大叶子节点数,特征不多时,不用设置。特征多时,可以通过设置最大叶子节点数,防止过拟合。
  • min_impurity_decrease:节点划分最小不纯度。float类型,默认值为0。节点的不纯度必须大于这个阈值,否则该节点不再生成子节点。通过设置,可以限制决策树的增长。
  • min_impurity_split:信息增益的阀值。信息增益必须大于这个阀值,否则不分裂。
  • min_samples_leaf:叶子结点需要的最小样本数。如果其叶子结点数小于这个阈值,则会和兄弟节点一起被剪枝。
  • min_samples_leaf的取值可以是int或float类型、int类型:最小样本数量。
  • float类型:表示一个百分比。即:最小样本数=min_samples_leaf * 样本数量n,并向上取整。
  • min_samples_split:当节点的样本数少于min_samples_split时,不再继续分裂。默认值为2。
  • min_weight_fraction_leaf:默认为0.0。
  • presort:bool类型,默认为False。表示在拟合前,是否对数据进行排序来加快树的构建。当数据集较小时,使用presort=true会加快分类器构建速度。当数据集较为庞大时,presort=true又会使得树的构建十分缓慢。

5.3算法优缺点

5.3.1优点

  • 易于理解和解释,属于白盒模型
  • 对于决策树,数据的准备往往是简单或者是不必要的.其他的技术往往要求先把数据一般化,比如去掉多余的或者空白的属性。能够同时处理数据型和常规型属性
  • 决策树可很好地扩展到大型数据库中,同时它的大小独立于数据库的大小
  • 对于那些各类别样本数量不一致的数据,在决策树当中,信息增益的结果偏向于那些具有更多数值的特征

5.3.2缺点

  • 决策树处理缺失数据时的困难
  • 过度拟合问题的出现
  • 忽略数据集中属性之间的相关性

以上梳理了机器学习中最经典、最简单的5个算法,后续在机器学习-算法篇(下)还会介绍到随机森林、ADaBoost、GBDT、XGBoost、LightGBM等机器学习算法,写得不是很好,欢迎大家指导😉

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 一、常用的机器学习算法
  • 1LR
    • 1.1算法原理
      • 1.2算法实现
        • 1.3算法优缺点
          • 1.3.1优点
          • 1.3.2缺点
      • 2KNN
        • 2.1算法原理
          • 2.2算法实现
            • 2.3算法优缺点
              • 2.3.1优点
              • 2.3.2缺点
          • 3朴素贝叶斯
            • 3.1算法原理
              • 3.2算法实现
                • 3.3算法优缺点
                  • 3.3.1优点
                  • 3.3.2缺点
              • 4、SVM
                • 3.1算法原理
                  • 4.2算法实现
                    • 4.3算法优缺点
                      • 4.3.1优点
                      • 4.3.2缺点
                  • 5、决策树
                    • 5.1决策树相关概念
                      • 5.2算法原理
                        • 5.1.1ID3算法
                        • 5.1.2C4.5算法
                        • 5.1.3CART算法
                        • 5.1.4ID3、C4.5、CART对比
                      • 5.2算法实现
                        • 5.3算法优缺点
                          • 5.3.1优点
                          • 5.3.2缺点
                      领券
                      问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档