深度学习入门

本篇是关于深度学习入门的内容。总结来自Youtube上开发者课堂视频。

第一节 ML 机器学习

是一门交叉学科,涉及计算机,神经学,统计学,概率论,逼近论,图分析,算法复杂度等。

定位

是人工智能AI的核心。主要使用的归纳综合,而不是演绎。

定义

通过一系列的算法实现使计算机不通过明显的外部的指示,而是通过自己对数据的学习,建模,并且利用建立好的模型,和新的输入进行预测的学科。

机器的学习

针对经验E(experience)和一系列的任务T(Task)和一定表现的衡量P,随着经验的激烈,针对定义好的任务可以提高表现,就可以说机器有学习的能力。
下棋,语音识别,以及自动驾驶。

第三节 深度学习 DL

是基于机器学习,机器学习的一个分支。以人的大脑结构的神经网络算法为模型,伴随大数据和计算能力的提高而产生的一系列的算法。

Data Mining 数据挖掘

应用于图像处理与计算机视觉,自然语言处理以及语音识别等领域。

ImageNet 网站
deep neural networkcomputer vision 深度神经网络算法

第四节 ML基础概念

概念学习:类比人类学习的概念:对鸟,车等概念认知,对某一类的事物的不断的认知才形成的认识最终完成对这个事物的学习。

定义:从有关的布尔函数的输入输出训练的样例中推断出该布尔函数,即给出多个函数的布尔值作为样例,通过多个样例机器自动的推断出一个布尔函数。

案例:

概念:定义在实例instance集合之上,每一份实例(样例)构成的这个集合,这个集合用X表示。
X:样例的集合
x:每一个样例
y:学习的目标结果
目标概念:最终的结果。
c(x)=1 或 0 也可说c(x)= y

训练集: training set 产生模型或算法的数据库,即原始数据

测试集:测试已经学习好的模型或算法的数据,testing set

特征向量:features 属性的集合,附属于每一个实例。每个特征值下的值就是特征向量,例如天气下的晴,或者阴 温度下的暖,

标记:class lable,即每一个实例的学习的最终结果,例如下图的享受运动。

正例, 反例:布尔值,0 或者 1,对应的享受运动的否或者是。

案例2:
案例2—硅谷房价

特征向量是面积,学区。
学习的概念是房价, class label。



分类 (classification): 目标标记为类别型数据(category)
回归(regression): 目标标记为连续性数值 (continuous numeric value)
目标标记为类别型数据,称为分类。,即值为布尔型,案例1中小明是否享受游泳
目标标记为连续性数值,称为回归。即值为连续型数据,案例2中硅谷房价的预估。
分类不同解决的方法不同。



有监督学习:训练集有类别标记,目标标记是布尔值
无监督学习:训练集中无类别标记,目标标记不存在或不清楚。
半监督学习:训练集中有的有类别标记,有的没有

机器学习步骤

  • 数据分为训练集和测试集
  • 用训练集和训练集向量训练算法
  • 用测试集测试学习到的算法

第五节 决策树理论 监督学习

机器学习分类和预测算法的评估标准:

  • 准确率
  • 速度
  • 强壮性:当某些值缺失或者有不规则的数据的时候,算法是否还会准确
  • 可规模性:数据规模的大的时候是否还是可用
  • 可解释性

决策树:decision tree,类似流程图,每个内部节点表示在一个属性上的测试,每个分支代表一个属性输出,每个树叶代表类或者类的分布。树的最顶层是根节点。

机器学习中重要的算法是决策树。
最顶层的根节点就是最终的目标标记结果。
分出的分支是每个属性。
当属性有连续的变量的时候,要进行离散化,设置一个值作为分界点。

信息熵:
信息和抽象,如何度量?
1948年,香农提出了 ”信息熵(entropy)“的概念
一条信息的信息量大小和它的不确定性有直接的关系,要搞清楚一件非常非常不确定的事情,或者
是我们一无所知的事情,需要了解大量信息==>信息量的度量就等于不确定性的多少

例子:猜世界杯冠军,假如一无所知,猜多少次?
每个队夺冠的几率不是相等的

比特(bit)来衡量信息的多少

变量的不确定性越大,熵也就越大

树以代表训练样本的单个结点开始(步骤1)。
如果样本都在同一个类,则该结点成为树叶,并用该类标号(步骤2 和3)。(即学习目标只有一种结果,情况很少见)
否则,算法使用称为信息增益的基于熵的度量作为启发信息,选择能够最好地将样本分类的属性(步骤6)。该属性成为该结点的“测试”或“判定”属性(步骤7)。在算法的该版本中,
所有的属性都是分类的,即离散值。连续属性必须离散化,比如,属性中有年龄10,20,40,33等数字,此时需要把年龄按段划分下,进行离散化。
对测试属性的每个已知的值,创建一个分枝,并据此划分样本(步骤8-10)。
算法使用同样的过程,递归地形成每个划分上的样本判定树。一旦一个属性出现在一个结点上,就不必该结点的任何后代上考虑它(步骤13)。
递归划分步骤仅当下列条件之一成立停止:
(a) 给定结点的所有样本属于同一类(步骤2 和3)。
(b) 没有剩余属性可以用来进一步划分样本(步骤4)。在此情况下,使用多数表决(步骤5)。
这涉及将给定的结点转换成树叶,并用样本中的多数所在的类标记它。替换地,可以存放结
点样本的类分布。
(c) 分枝
test_attribute = a i 没有样本(步骤11)。在这种情况下,以 samples 中的多数类
创建一个树叶(步骤12)

其他算法:
C4.5: Quinlan
Classification and Regression Trees (CART): (L. Breiman, J. Friedman, R. Olshen, C. Stone)
共同点:都是贪心算法,自上而下(Top-down approach)
区别:属性选择度量方法不同: C4.5 (gain ratio), CART(gini index), ID3 (Information Gain)

如何处理连续性变量的属性?

树剪枝叶 (避免overfitting)
因为学习集上分的太细,测试集上不会有结果。所以需树剪枝叶。
.1 先剪枝
.2 后剪枝

决策树的优点:
直观,便于理解,小规模数据集有效

决策树的缺点:
处理连续变量不好
类别较多时,错误增加的比较快
可规模性一般

第六节 决策树 应用

python 机器学习库:scikit-learn
简单高效的数据挖掘和机器学习分析,对所有用户开放,根据不同需求高度可重用性。基于Numpy, SciPy和matplotlib。开源,商用级别:获得 BSD许可。

覆盖问题领域:
分类(classification)
回归(regression),
聚类(clustering),
降维(dimensionality reduction)
模型选择(model selection)
预处理(preprocessing)

sklearn对输入的数据的要求:输入的要是数值型的值,而不是字符等。
针对于上述的,age属性原来是一维,要转换为三维的:样例1中,
youth:1, middle:0, sensior:0
其余的属性同理,都转换为多维的。
youth middle senior high medium low student(no) student(yes) fair execllent no yes
1 0 0 1 0 0 1 0 1 0 0 1
sklearn自带的包可以直接将数据转换为上述类型的数据。

# coding=utf8
# 只接受整形数据,要对数据进行转化
from sklearn.feature_extraction import DictVectorizer
import csv
from sklearn import preprocessing
from sklearn import tree
# 读写的过程
from sklearn.externals.six import StringIO


allfiledata = open('./csvfile.csv', 'r')
reader = csv.reader(allfiledata)
header = next(reader)

featureList = []  # 属性以及属性值列表
lableList = []  # class lable值

for row in header:
    lableList.append(row[len(row) - 1])
    # print(lableList)
    rowDict = {}

    for i in range(1, len(row) - 1):
        rowDict[header[1]] = row[i]

    featureList.append(rowDict)
# 得出的形式:[{crefit_rating: fair, age:youth, income:high....}, { 样例2内容 },{ 样例3内容 }.......]
# print(featureList)

# 特征值列表转换
vec = DictVectorizer()
dunmuX = vec.fit_transform(featureList).toarry()  # 将featureList列表, 特征值列表中的字符转换为0或者1的形式
print(dunmuX)

# class label 转换
bl = preprocessing.LabelBinarizer()
dumY = bl.fit_transform(lableList)
print(dumY)
# 以上是转换训练集中的内容,为0或1 的形式

# 创建分类器clf
#  entropy 指明的是使用信息熵的标准
clf = tree.DecisionTreeClassifier(criterion='entropy')  # 后面的参数参见文档。
# 信息熵的差异作为标准
clf = clf.fit(dunmuX, dumY)
# 得出的是决策树的基本信息


"""
feature_names=vec.get_feature_names() 因为在得出决策树的时候是是转换为01形式的,再次输出的时候
就需要还原为原来的属性名,age,income等,feature_names就是这样作用
文件名为dot文件格式,打开是对决策树文字的描述,并不直观
如果要查看图形化的内容,安装插件
"""
with open('allinfomationdotfile.dot', 'w') as f:
    f = tree.export_graphviz(clf, feature_names=vec.get_feature_names(), out_file=f)

# 以上就会得出学习出来的模型,现在给出一个新的数据,调用预测方法,得出的学习的结果
newdata = dunmuX[0, :]  # 取出第一个样例,并且改变其中2个数值作为新的数据
newdata[0] = 1
newdata[2] = 0

predict = clf.predict(newdata)
# 输出的结果是列表,内容是所预测的结果,布尔值。