当前位置:   article > 正文

机器学习及项目实战_机器学习项目实战

机器学习项目实战

机器学习

1 机器学习体系介绍

1.1 机器学习与传统编程

  • 传统编程

在传统编程中,你需要对程序的行为进行硬编码。对于任何解决方案,第一个任务都是创建最合适的算法并编写代码。然后,必须设置输入参数,实际上,如果实现的算法是正确的,它将产生预期的结果。如下面流程图所示,在传统编程中,在对问题进行研究之后,对解决方案按照编写规则进行代码编写,之后对代码、算法进行评估。如果理想,正常运行从而产生预期的结果,如果不理想;分析错误重新对问题进行研究分析。

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-En6KwW7p-1593509692569)(image/1574650573465.png)]

  • 机器学习

在机器学习中,你将大量内容留给机器去学习数据。机器学习的一个显著特征是不需要构建模型。这个复杂而有意义的任务是由机器学习算法执行的。如下图所示,与传统编程最大的区别在于机器学习把数据交给机器进行学习,而传统编程由程序员自己编写。

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-r8i6d57o-1593509692572)(image/1574651451851.png)]

  • 升级机器学习

在我们进行机器学习时,数据是一般都会发生一些变化,比如说,产生一些新的数据,那我们就需要对数据进行一定的升级,然后对升级之后的数据重新进行训练。如果,我们按照之前的方法,需要的步骤就比较多,而且比较麻烦。我们可以对整个流程进行升级,让机器去适应这个流程,这样可以大大的减少我们工作。

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-FosUj9Al-1593509692574)(image/1574652486332.png)]

  • 数据挖掘

应用机器学习技术来训练海量数据,可以帮助我们发 现那些此前并非立见端倪的模式,称为数据挖掘。

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-x5GElpNg-1593509692576)(image/1574652551466.png)]

  • 传统编程与机器学习的区别
    • 解决方案需要规则列表超长问题,通过机器学习可以简化代码,提升执行表现
    • 对于传统技术手段根本无法解决的复杂问题,通过机器学习可以找到方案
    • 对于环境波动:机器学习系统可以适应新的数据
    • 从复杂问题和海量数据中获得更多人类未曾意识到的关联性或者趋势

1.2 机器学习原理与学习方法

1.2.1 机器学习原理
  • 机器学习是指:让机器可以自主获得事物规律。要让机器可以 “学习”,必须将生活中的数据(包括但不限于图像、文字、语音)数值化,将不同事物的变化和关联转化为运算。

  • 机器学习可以成立的原因是:概念和数值、关系和运算可以相互映射

  • 机器学习三要素之数据、模型、算法

    • 数据:还未转换为机器可以识别的数据样本
    • 向量空间模型(VSM, Vector Space Model):负责将格式(文字、图片、音频、视频)转化为一个个向量
    • 训练过程需要依据某种章法进行运算。这个章法,就是算法
    • 模型是机器学习的结果,而这个学习的过程称为训练(Train)

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-8WsCt3DX-1593509692577)(image/1574660977780.png)]

我们通过下面的例子来加深对机器学习原理的学习。

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-70DBKdCR-1593509692579)(image/1574662019870.png)]

1.2.2 学习方法

机器学习是一门多领域交叉学科,涉及概率论、统计学、逼近论、凸分析、算法复杂度理论等多门学科。

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-AJ5ilEPG-1593509692579)(image/1574661841813.png)]

1.3 机器学习中的数学知识

下图是对知识掌握与前景发展的大体结构图。

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-QSFBqq5v-1593509692580)(image/1574663832120.png)]

1.3.1 基础概念
  • 微积分基础
    • 泰勒公式 :是一个用函数在某点的信息描述其附近取值的公式
    • 导数:导数是函数的局部性质。一个函数在某一点的导数描述了这个函数在这一点附近的变化率
    • 梯度:梯度的本意是一个向量(矢量),表示某一函数在该点处的方向导数沿着该方向取得最大值,即函数在该点处沿着该方向(此梯度的方向)变化最快,变化率最大(为该梯度的模)。
  • 概率与统计基础
    • 概率公式:概率,它是反映随机事件出现的可能性大小。
    • 常见分布:是指样本估计量的分布
    • 常见统计量:是统计理论中用来对数据进行分析、检验的变量
  • 线性代数基础
    • 矩阵乘法的几何意义:指的是一般矩阵乘积。一个m×n的矩阵就是m行n列的一个数阵。由于它把许多数据紧凑地集中到了一起,所以有时候可以简便地表示一些复杂的模型
1.3.2 概率统计与机器学习的关系
  • 统计本质是分布,机器学习训练出来的是模型,模型可能包含了很 多分布
  • 训练与预测过程的一个核心评价指标就是模型的误差
  • 误差本身就可以是概率的形式,与概率紧密相关
  • 对误差的不同定义方式就演化成了不同损失函数的定义方式
  • 机器学习是概率与统计和计算机编程的结合
1.3.3 推荐书籍
  • Christopher M. Bishop, Pattern Recognition and Machine Learning, Springer-Verlag, 2006
  • Kevin P. Murphy, Machine Learning:A Probabilistic Perspective, The MIT Press, 2012
  • 李航,统计学习方法,清华大学出版社,2012
  • 周志华, 机器学习,清华大学出版社,2016
  • Machine Learning,Andrew Ng,coursera
  • 机器学习基石/技术,林轩田,coursera

1.4 总结

  • 机器学习模型本质就是一个函数,函数运算所有的特征,得到一个值
  • 数据挖掘基本等于机器学习,统计学是机器学习的子集,凹集,模式识别也是约等于数据挖掘,原始的模式识别更接近于匹配和规则,现在的机器学习更偏重于统计
  • 统计是取出一部分数据,得知分布情况,求全集的分布情况。统计是对全量 的一种关测,所以成本会很少,如果能用抽样解决的问题,尽量不要用机器 学习来做,机器学习成本比较高,一般用统计和概率弄一下就可以了
  • 数据挖掘建模之前需要对数据进行清洗处理 ,了解数据的关联性很重要, bat的数据挖掘组,需要在进入之前,在数据组轮值半年岗

2 机器学习分类

2.1 机器学习应用领域

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-KQlh7550-1593509692581)(image/1574665597238.png)]

  • 计算机视觉

让机器像人一样看世界,看到图像,视频等媒体。会把图像进行识别,分类。

  • 语音识别

与机器进行语音交流,让机器明白你说什么

  • NLP自然语言处理

让机器像人一样理解语言,理解人写的文字等的含义。并作出一定的反应。

  • 统计-推荐系统

推荐系统主要解决信息过载的问题。它有两个目的:一是让用户找到感兴趣的物品;二是让物品出现在对它感兴趣的用户前。

  • 数据挖掘

数据挖掘主要是应用于大数据领域,利用机器学习的模型来挖掘数据中的潜在价值。发现数据之间的关系。

  • 模式识别

给机器各种特征描述,从而让机器对未知的事物进行判断

2.2 机器学习分类

机器学习分为四种,分别是监督学习、无监督学习、半监督学习和增强学习。使用比较多的的是监督学习与无监督学习。

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-TPW2y92E-1593509692581)(image/1574670085958.png)]

在解决问题的时候,必须考虑下面两个问题:一、使用机器学习算法的目的,想要算法完成何种任务;二、需要分析或者收集的数据是什么。

首先考虑使用机器学习算法的目的。如果想要预测目标变量的值,则可以选择监督学习算法,否则可以选择无监督学习算法,确定选择监督学习算法之后,需要进一步确定目标变量类型,如果目标变量是离散型,则可以选择分类算法;如果目标变量是连续的数值,则需要选择回归算法。

如果不想预测目标变量的值,则可以选择无监督算法。进一步分析是否需要将数据划分为离散的组。如果这是唯一的需求,则使用聚类算法。

2.2.1 监督学习

利用无标签的数据学习数据的分布或数据与数 据之间的关系被称作无监督学习,也就是说,通过过往的一些数据的特征以及最终结果来进行训练的方式就是监督学习法,监督学习算法的训练数据源需要由特征值以及目标队列两部分组成。

  • 训练

用来训练模型,估计参数

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-9bvx4NqD-1593509692582)(image/1574673053106.png)]

  • 预测

用来测试和评估训练出来的模型好坏,不能用于训练模型

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-nTyRkSgt-1593509692582)(image/1574673085530.png)]

  • 总结

监督学习是从标记的训练数据来推断一个功能的机器学习任务。然后使用预测数据对训练出来的模型进行验证。

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-sf8cGppm-1593509692583)(image/1574673126858.png)]
监督学习依赖于每个样本,可以得到每个特征序列映射到的确切的目标值是什么,所以常用于回归以及分类场景。常见的监督学习算法有:K近邻、朴素贝叶斯、决策树、随机森林、逻辑回归、线性回归、支持向量机SVM等。

  • k-近邻算法

KNN法即K近邻法,它的思路非常简单:找到训练集样本空间中的K个距离预测样本x最近的点,统计K个距离最近的点的类别,找出个数最多的类别,将x归入该类别。

  • KNN法有三个基本要素:K值的选择、距离度量及分类决策规则
    • K值选择:K太小,分类结果易受噪声点影响;K太大,近邻中又可能包含太多的其它类别的点。
    • 一般采用马氏距离或者欧式距离
    • 分类决策规则:加权投票法,加权投票法中的权重随着样本间距离增大而减小
  • 优缺点
    • 优点:精度高、对异常值不敏感、无数据输入假定
    • 缺点:计算复杂度高、空间复杂度高
    • 使用数据范围:数值型和标称型

本案例使用最著名的”鸢尾“数据集,该数据集曾经被Fisher用在经典论文中,目前作为教科书般的数据样本预存在Scikit-learn的工具包中。

from sklearn.datasets import load_iris
from sklearn.cross_validation import train_test_split
from sklearn.preprocessing import StandardScaler
from sklearn.neighbors import KNeighborsClassifier
from sklearn.metrics import classification_report
from sklearn.model_selection import GridSearchCV

def knniris():
    """
    鸢尾花分类
    :return: None
    """
    # 数据集获取和分割
    lr = load_iris()

    x_train, x_test, y_train, y_test = train_test_split(lr.data, lr.target, test_size= 0.25)

    # 进行标准化
    std = StandardScaler()

    x_train = std.fit_transform(x_train)
    x_test = std.transform(x_test)

    # estimator流程
    knn = KNeighborsClassifier()

    # # 得出模型
    # knn.fit(x_train,y_train)
    #
    # # 进行预测或者得出精度
    # y_predict = knn.predict(x_test)
    #
    # # score = knn.score(x_test,y_test)

    # 通过网格搜索,n_neighbors为参数列表
    param = {
   "n_neighbors": [3, 5, 7]}

    gs = GridSearchCV(knn, param_grid= param, cv= 10)

    # 建立模型
    gs.fit(x_train,y_train)

    # print(gs)

    # 预测数据

    print(gs.score(x_test,y_test))

    # 分类模型的精确率和召回率

    # print("每个类别的精确率与召回率:",classification_report(y_test, y_predict,target_names=lr.target_names))

    return None

if __name__ == "__main__":
    knniris()
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41
  • 42
  • 43
  • 44
  • 45
  • 46
  • 47
  • 48
  • 49
  • 50
  • 51
  • 52
  • 53
  • 54
  • 55
  • 56
  • 57
  • 朴素贝叶斯

朴素贝叶斯(Naive Bayes)是一个非常简单,但是实用性很强的分类模型。朴素贝叶斯分类器的构造基础是贝叶斯理论。朴素贝叶斯分类器的主要思路:通过联合概率P(x,y)=P(x|y)P(y)建模,运用贝叶斯定理求解后验概率P(y|x);将后验概率最大者对应的的类别作为预测类别,因为后验概率最大化,可以使得期望风险最小化。

  • 优点
    • 数学基础坚实,分类效率稳定,容易解释;
    • 所需估计的参数很少,对缺失数据不太敏感;
    • 无需复杂的迭代求解框架,适用于规模巨大的数据集。
  • 缺点
    • 属性之间的独立性假设往往不成立可考虑用聚类算法先将相关性较大的属性进行聚类)
    • 需要知道先验概率,分类决策存在错误率。
# 读取20类新闻文本的数据细节
from sklearn.datasets import fetch_20newsgroups
news = fetch_20newsgroups(subset= 'all')

# 20类新闻文本数据分割
from sklearn.cross_validation import train_test_split

X_train,X_test,y_train,y_test = train_test_split(news.data, news.target, test_size= 0.25,random_state= 42)

# 文本转换为特征向量进行TF特征抽取
from sklearn.feature_extraction.text import CountVectorizer

vec = CountVectorizer()
# 训练数据输入,并转换为特征向量
X_train = vec.fit_transform(X_train)
print(X_train)

# 测试数据转换
X_test = vec.transform(X_test)
print(X_test)


# 朴素贝叶斯分类器对文本数据进行类别预测
from sklearn.naive_bayes import MultinomialNB

# 使用平滑处理初始化的朴素贝叶斯模型
mnb = MultinomialNB(alpha=1.0)

# 利用训练数据对模型参数进行估计
mnb.fit(X_train,y_train)

# 对测试验本进行类别预测。结果存储在变量y_predict中
y_predict = mnb.predict(X_test)

print(y_predict)
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 决策树

决策树(decision tree)归纳是经典的分类算法。它采用自顶向下递归的方式构造决策树。可以从生成的决策树中提取规则。通常决策树学习包括三个步骤:决策树的生成和决策树的修剪。决策树的优缺点

  • 优点:

    • 计算复杂度不高,易于理解和解释;
    • 数据预处理阶段比较简单,且可以处理缺失数据;
    • 能够同时处理数据型和分类型属性,且可对有许多属性的数据集构造决策树,其他技术往往需要数据属性的单一;
    • 是一个白盒模型,若给定一个观察模型,则根据所产生的决策树很容易推断出相应的逻辑表达式;
    • 在相对短的时间内能够对大数据集合做出可行且效果良好的分类结果。
  • 缺点:

    • 对于各类别样本数量不一致数据,信息增益偏向于那些具有更多数值的特征。因此建议用平衡的数据训练决策树;
    • 决策树的结果可能是不稳定的,因为在数据中一个很小的变化可能导致生成一个完全不同的树,这个问题可以通过使用集成决策树来解决;
    • 实际决策树学习算法是基于启发式算法,如贪婪算法,寻求在每个节点上的局部最优决策。这样的算法不能保证返回全局最优决策树;
    • 忽略属性之间的相关性;
    • 易于过拟合;
import pandas as pd
import sklearn
from sklearn.cross_validation import train_test_split
from sklearn.feature_extraction import DictVectorizer
from sklearn.tree import DecisionTreeClassifier
from sklearn.metrics import classification_report
from sklearn.ensemble import RandomForestClassifier, GradientBoostingClassifier


titanic = pd.read_csv('http://biostat.mc.vanderbilt.edu/wiki/pub/Main/DataSets/titanic.txt')

#选取一些特征作为我们划分的依据
x = titanic[['pclass', 'age', 'sex']]
y = titanic['survived']

# 填充缺失值
x['age'].fillna(x['age'].mean(), inplace= True)

# 分割数据集
x_train, x_test, y_train, y_test = train_test_split(x, y, test_size= 0.25)

dt = DictVectorizer(sparse= False)

print(x_train.to_dict(orient= "record"))

# 按行,样本名字为键,列名也为键,[{"1":1,"2":2,"3":3}]
x_train = dt.fit_transform(x_train.to_dict(orient= "record"))

x_test = dt.fit_transform(x_test.to_dict(orient= "record"))

# 使用决策树
dtc = DecisionTreeClassifier()

dtc.fit(x_train, y_train)

dt_predict = dtc.predict(x_test)

print(dtc.score(x_test, y_test))

print(classification_report(y_test, dt_predict, target_names= ["died", "survived"]))
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 随机森林

随机森林是一个包含多个决策树的分类器,并且其输出的类别是由个别树输出的类别的众数而定。个标准的决策树会根据每维特征对预测结果的影响程度进行排序,进而决定不同的特征从上至下构建分裂节点的顺序,如此以来,所有在随机森林中的决策树都会受这一策略影响而构建的完全一致,从而丧失的多样性。所以在随机森林分类器的构建过程中,每一棵决策树都会放弃这一固定的排序算法,转而随机选取特征。

根据下列算法而建造每棵树:

  • 用N来表示训练用例(样本)的个数,M表示特征数目。
  • 输入特征数目m,用于确定决策树上一个节点的决策结果;其中m应远小于M。
  • 从N个训练用例(样本)中以有放回抽样的方式,取样N次,形成一个训练集(即bootstrap取样),并用未抽到的用例(样本)作预测,评估其误差。
  • 对于每一个节点,随机选择m个特征,决策树上每个节点的决定都是基于这些特征确定的。根据这m个特征,计算其最佳的分裂方式。
import pandas as pd
import sklearn
from sklearn.cross_validation import train_test_split
from sklearn.feature_extraction import DictVectorizer
from sklearn.tree import DecisionTreeClassifier
from sklearn.metrics import classification_report
from sklearn.ensemble import RandomForestClassifier, GradientBoostingClassifier


titanic = pd.read_csv('http://biostat.mc.vanderbilt.edu/wiki/pub/Main/DataSets/titanic.txt')

# 选取一些特征作为我们划分的依据
x = titanic[['pclass', 'age', 'sex']]
y = titanic['survived']

# 填充缺失值
x['age'].fillna(x['age'].mean(), inplace= True)
x_train, x_test, y_train, y_test = train_test_split(x, y, test_size= 0.25)
dt = DictVectorizer(sparse= False)
print(x_train.to_dict(orient= "record"))

# 按行,样本名字为键,列名也为键,[{"1": 1, "2": 2, "3": 3}]
x_train = dt.fit_transform(x_train.to_dict(orient= "record"))
x_test = dt.fit_transform(x_test.to_dict(orient= "record"))


# 使用随机森林
rfc = RandomForestClassifier()
rfc.fit(x_train, y_train)
rfc_y_predict = rfc.predict(x_test)
print(rfc.score(x_test, y_test))
print(classification_report(y_test, rfc_y_predict, target_names= ["died", "survived"]))
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 逻辑回归

逻辑回归(Logistic Regression),简称LR。它的特点是能够使我们的特征输入集合转化为0和1这两类的概率。一般来说,回归不用在分类问题上,因为回归是连续型模型,而且受噪声影响比较大。如果非要应用进入,可以使用逻辑回归。了解过线性回归之后再来看逻辑回归可以更好的理解。原始数据的下载地址为:https://archive.ics.uci.edu/ml/machine-learning-databases/breast-cancer-wisconsin/

  • Logistic回归优点:

    • 实现简单;
    • 分类时计算量非常小,速度很快,存储资源低;
  • 缺点:

    • 容易欠拟合,一般准确度不太高
    • 只能处理两分类问题(在此基础上衍生出来的softmax可以用于多分类),且必须线性可分;
import numpy as np
import pandas as pd
from sklearn.metrics import  roc_auc_score
from sklearn.preprocessing import StandardScaler  # 标准化
from sklearn.linear_model import LogisticRegression # 逻辑回归
from sklearn.metrics import  classification_report # 召回率
from sklearn.model_selection import train_test_split  # 训练集 测试集 拆分

# 加载数据
data = pd.read_csv('data/breast-cancer-wisconsin.data', header= None)

# 列名称
columns = ['Sample code number', 'Clump Thickness', 'Uniformity of Cell 			Size', 'Uniformity of Cell Shape', 'Marginal Adhesion', 				'SingleEpithelial Cell Size', 'Bare Nuclei', 'Bland 					Chromatin', 'Normal Nucleoli', 'Mitoses', 'Class']

data.columns = columns

print(data)

# 缺失值处理
data.replace('?',np.nan, inplace= True)

# 检测缺失值
res_null = data.isnull().sum()

# 删除缺失值
data.dropna(axis= 0, how= 'any', inplace= True)

# 进行筛选数据集 --- 去除编号的第一列
data = data.iloc[:,1:
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/从前慢现在也慢/article/detail/221990?site
推荐阅读
相关标签
  

闽ICP备14008679号