李烨课程学习提要

李烨课程学习提要

 

目录

李烨课程学习提要

00—前言

01---为什么要学原理和公式推导

02---学习机器学习原理,改变看待世界的方式

03---如何学习“机器学习”

04---为什么要学 Python 以及如何学Python

05---机器是如何学习的?

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

07--模型的获取和改进

08---模型的质量和评判指标

09---最常用的优化算法——梯度下降法

10---线性回归——从模型函数到目标函数

11---线性回归——梯度下降法求解目标函数

12—朴素贝叶斯分类器——从贝叶斯定理到分类模型

13---朴素贝叶斯分类器:条件概率的参数估计

14---逻辑回归: 非线性逻辑函数的由来

15---逻辑回归: 用来做分类的回归模型

16---决策树——既能分类又能回归的模型

17---决策树——告诉你 Hello Kitty 是人是猫

18---SVM——线性可分 SVM 原理

19---SVM——直观理解拉格朗日乘子法

20---SVM——对偶学习算法

22---SVM——非线性 SVM 和核函数

23---SVR——一种“宽容”的回归模型

 


00—前言

这门课能帮助你快速进入人工智能领域,从事工程或者算法工作。

第一部分:绪论

第二部分:基本原理

第三部分:有监督学习 I

第四部分:有监督学习 II

第五部分:无监督学习

第六部分:从机器学习到深度学习

 

你将收获什么

1.AI 技术岗位求职知识储备

2.触类旁通各大模型与算法

3.极简版实例体验实际应用

4.配套数据+代码快速实操上手

数据是我们经过见过的万事万物,而算法则是我们的思辨能力。

 

01---为什么要学原理和公式推导

学习原理的必要性

功利层面:面试会考、老板会问、同事会质疑

实用层面:优化模型、针对问题实际问题定向建模

 

真正创造价值的,从来都是解决实际问题的人。

 

02---学习机器学习原理,改变看待世界的方式

破除迷信、追本溯源、精进看待世界的方法

学习机器学习原理和公式推导,并非只是做一些无聊的数字变换。很可能由此为我们打开一扇窗,让我们从新的角度就看待世界,并为日常决定的思考过程提供更加可量化方法。

 

03---如何学习“机器学习”

机器学习的核心——将事物转化为数值,将关系、变换转化为运算——以事实(数据)为依据,以规章(算法)为准绳,通过计算来掌握事物的客观规律(模型)。

反复学习,从记忆到掌握,由易到难,螺旋式推进。

数学需要多精深?

基础数学概念

两条路径反刍数学知识

制定数学知识速查手册

 

日常学习 Tips:关联、记录、分享

 

04---为什么要学 Python 以及如何学Python

根据数据平台 Kaggle 发布的2017年机器学习及数据科学调查报告,Python 是数据科学家和人工智能从业者使用最多的语言/工具。

语言简单易学,支持库丰富强大,这两大支柱从早期就奠定了 Python 的江湖地位。

了解下面这些概念:数据类型、变量、函数、参数、返回值、调用、递归……

学习流程控制:顺序、条件、循环。

搞清几种不同类型:array、list、dict、set 的用法。

在这个过程中,学习什么是静态类型,什么是动态类型,什么是强类型,什么是弱类型,这些不同设计的目的和应用场景分别是什么。

 

05---机器是如何学习的?

机器学习就是:让计算机程序(机器),不是通过人类直接指定的规则,而是通过自身运行,习得(学习)事物的规律,和/或事物间的关联。

计算机程序所能够处理,只有数值和运算。

要让一段程序了解客观世界变化万千的事物,则必须将这些事物数值化,将事物的变化

和不同事物之间的关联转化为运算。

机器(Machine)、学习(Learning)、数据(Data)、特征(Feature)、模型(Model)、算法(Algorithm)

通过标注数据进行学习的方法,就叫做有监督学习或直接叫监督学习(SupervisedLearning)

 

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

源数据

特征工程做两件事:

1. 确定用哪些特征来表示数据;2. 确定用什么方式表达这些特征。

通过标注数据进行学习的方法,就叫做有监督学习或直接叫监督学习(SupervisedLearning)

模型是怎么得到的?

向量空间模型(Vector Space Model/VSM)和无标注数据、特征向量(Feature Vector)、有标注数据、模型

训练--根据已经被指定的 f(x) 的具体形式——模型类型,结合训练数据,计算出其中各个参数的具体取值的过程。

有监督学习的目标就是:让训练数据的所有 x 经过 f(x) 计算后,获得的 y’与它们原本对应的 y 的差别尽量小。

算法

目标函数:argmin J(theta)—— 最小化J(theta)

损失函数(Loss Function):对于一个训练数据,描述 y’与 y 之间的差别。

代价函数(Cost Function)对于所有训练数据,描述整体的损失。一般写作J(theta)

算法是机器学习和深度学习中最具技术含量的部分。

要得到高质量的模型,算法很重要,但往往(尤其是在应用经典模型时)更重要的是数据。

有监督学习需要标注数据。因此,在进入训练阶段前必须要经过一个步骤:人工标注。

标注的过程繁琐且工作量颇大,却无法避免。

 

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

算法通过在数据上运算产生模型。

 

07--模型的获取和改进

训练集、验证集和测试集

每个集合都应当是独立的,和另外两个没有重叠。

大量的高质量训练数据,是提高模型质量的最有效手段。

超参数是需要模型训练者自己来设置和调整的

模型类型选择

 

08---模型的质量和评判指标

分类模型评判指标: 精准率(Precision)召回率(Recall)、 F1Score

指标对应的是模型和数据集

模型的偏差和过拟合(相对于过拟合)

 

 

09---最常用的优化算法——梯度下降法

学习的目标就是最小化目标函数的取值,而目标函数又是凸函数,那么学习的目标自然转化成了寻找某个凸函数的最小值。最常用的一种方法,叫做梯度下降法。

 

1. 随机取一个自变量的值 ;

2. 对应该自变量算出对应点的因变量值: ;

3. 计算 处目标函数 的导数;

4. 从 开始,沿着该处目标函数导数的方向,按一个指定的步长  ,向前“走一步”,

走到的位置对应自变量取值为 。换言之, 是 在 处的斜率;

5. 继续重复2-4,直至退出迭代(达到指定迭代次数,或 近似收敛到最优解)。

步长 是算法自己学习不出来的,它必须由外界指定。

这种算法不能学习,需要人为设定的参数,就叫做超参数。

梯度下降的难点:

如果目标函数有多个极小值点(多个向下的“弯儿”),那么如果开始位置不妥,很可能导致最终是走到了一个局部极小值就无法前进了。

这种情况下,可以尝试几个不同的起始点。甚至尝试一下大步长,说不定反而能够跨出局部最小值点所在的凸域。

 

10---线性回归——从模型函数到目标函数

从数据反推公式:用美国纽约若干程序员职位的年薪举例

综合利用训练数据,拟合线性回归函数:获得 a, b 两个参数取值

综合利用的原则是什么呢?就是我们要求的这个 a 和 b,在将训练样本的 x 逐个带入后,得出的预测年薪 y’= a + bx 与真实年薪 y 整体的差异最小。

具体的一个样本的 y 和 y’的差异用  来表示。

怎么衡量这个整体差距呢?我们用下面这个公式,我们把它叫做为 Cost Function,形式如(其中 m 为样本的个数):

在 y = a + bx 这个模型函数中,a 和 b 是常量参数,x 是自变量,而 y 是因变量。

但到了 J(a,b) 中, 和 是常量参数(也就是 m 个样本各自的 x 和 y 值),而 a 和 b

成了自变量,J(a,b) 是因变量。能够让因变量 J(a, b) 取值最小的自变量 a 和 b,就是最好的 a和 b。

我们要做的,就是找到最好的 a 和 b。

线性回归模型是:利用线性函数对一个或多个自变量 (x 或 ( ))和因变量(y)之间的关系进行拟合的模型。

线性函数的定义是:一阶(或更低阶)多项式,或零多项式。

特征是一维的,线性模型在二维空间构成一条直线;特征是二维的,线性模型在三维空间中构成一个平面;若特征是三维的,则最终模型在四维空间中构成一个体;以此类推……

用线性回归模型拟合非线性关系:比如把特征从一个“变成”两个。

 

11---线性回归——梯度下降法求解目标函数

代码:

import matplotlib.pyplot as plt

import numpy as np

from sklearn import datasets, linear_model

from sklearn.metrics import mean_squared_error, r2_score

 

experiences = np.array([0,1,2,3,4,5,6,7,8,9,10])

salaries = np.array([103100, 104900, 106800, 108700, 110400, 112300, 114200, 116100,

117800, 119700, 121600])

# 将特征数据集分为训练集和测试集,除了最后5个作为测试用例,其他都用于训练

X_train = experiences[:7]

X_train = X_train.reshape(-1,1)

X_test = experiences[7:]

X_test = X_test.reshape(-1,1)

# 把目标数据(特征对应的真实值)也分为训练集和测试集

y_train = salaries[:7]

y_test = salaries[7:]

# 创建线性回归模型

regr = linear_model.LinearRegression()

# 用训练集训练模型——看就这么简单,一行搞定训练过程

regr.fit(X_train, y_train)

# 用训练得出的模型进行预测

diabetes_y_pred = regr.predict(X_test)

# 将测试结果以图标的方式显示出来

plt.scatter(X_test, y_test, color='black')

plt.plot(X_test, diabetes_y_pred, color='blue', linewidth=3)

plt.xticks(())

plt.yticks(())

plt.show()

 

关于代码:

 

习惯用 import matplotlib.pyplot as plt语句来调用画图模块

import numpy as np   http://www.cnblogs.com/yun1108/p/8989003.html

reshape(-1,1)https://blog.csdn.net/wld914674505/article/details/80460042

regr.fit(X_train, y_train)  https://blog.csdn.net/jingyi130705008/article/details/78163955

scatter 散列图https://blog.csdn.net/pipisorry/article/details/40005163

 

 

操作过程:先再命令行键入python(或者IDLE),回车。

打开界面如下

点击File->New File

界面如下:

然后把代码复制过去。

点击Run ,在下拉列表选择Run Module F5

然后等待程序开始运行。

12—朴素贝叶斯分类器——从贝叶斯定理到分类模型

分类模型 VS 回归模型,最根本的不同:前者是预测一个标签(类型、类别);后者则是预测一个量。

换一个角度来看,分类模型输出的预测值是离散值;而回归模型输出的预测值则是连续值

 

13---朴素贝叶斯分类器:条件概率的参数估计

参数估计(Parameter Estimation)

极大似然估计(Maximum Likelihood Estimation, MLE)

极大似然估计,就是去寻找让似然函数 的取值达到最大的参数值的估计方法。

最大化一个似然函数同最大化它的自然对数是等价的

用代码实现朴素贝叶斯模型

代码:

import pandas as pd

import numpy as np

import time

from sklearn.model_selection import train_test_split

from sklearn.naive_bayes import GaussianNB

 

# Importing dataset.

# Please refer to the 【Data】 part after the code for the data file.

data = pd.read_csv("career_data.csv")

 

# Convert categorical variable to numeric

data["985_cleaned"]=np.where(data["985"]=="Yes",1,0)

data["education_cleaned"]=np.where(data["education"]=="bachlor",1,

                                   np.where(data["education"]=="master",2,

                                            np.where(data["education"

                                                          ]=="phd",3,4)

                                            )

                                   )

data["skill_cleaned"]=np.where(data["skill"]=="c++",1,

                               np.where(data["skill"]=="java",2,3

                                        )

                               )

data["enrolled_cleaned"]=np.where(data["enrolled"]=="Yes",1,0)

# Split dataset in training and test datasets

X_train, X_test = train_test_split(data, test_size=0.1,

                                   random_state=int(time.time()))

# Instantiate the classifier

gnb = GaussianNB()

used_features =[

    "985_cleaned",

    "education_cleaned",

    "skill_cleaned"

    ]

# Train classifier

gnb.fit(

    X_train[used_features].values,

    X_train["enrolled_cleaned"]

    )

y_pred = gnb.predict(X_test[used_features])

 

 

# Print results

print("Number of mislabeled points out of a total {} points : {},performance {:05.2f}%"

      .format(

          X_test.shape[0],

          (X_test["enrolled_cleaned"] != y_pred).sum(),

          100*(1-(X_test["enrolled_cleaned"] != y_pred).sum()/X_test.shape[0])

          ))

下列数据直接存储为 career_data.csv 文件(可以用Excel打开):

no     985  education         skill  enrolled

1       Yes   bachlor     C++  No

2       Yes   bachlor     Java Yes

3       No    master     Java Yes

4       No    master     C++  No

5       Yes   bachlor     Java Yes

6       No    master     C++  No

7       Yes   master     Java Yes

8       Yes   phd  C++  Yes

9       No    phd  Java Yes

10     No    bachlor     Java No

 

我的存储方式:先打开一个空白文本文档,把数据复制过去,把文本文档的名字和后缀改为career_data.csv

 

注意,文档的位置要和py程序的位置在一个目录即统一路径,不然调用不了。

运行脚本,即运行程序,结果应该是:

结果为

Number of mislabeled points out of a total 1 points : 0,performance 100.00%

一致。

import time   导入时间模块http://qinxuye.me/article/details-about-time-module-in-python/

 

14---逻辑回归: 非线性逻辑函数的由来

逻辑函数(LR-Logistic Regression)又称Sigmod函数(S函数),因为表现像S形曲线。

通用形式是:

 一元自变量  

逻辑函数表现的是存量随时间增长渐增的关系。而增长率和时间的关系式存量(逻辑函数)的微分函数。

 

学习理论相对于学习经验具备更长久也更深入的有效性。

15---逻辑回归: 用来做分类的回归模型

LR 典型的应用是二分类问题上

模型函数在y=0.5附近非常敏感。大于0.5,真性,阳性,小于0.5,假性,阴性

 

用线性回归实现代码

代码:

from sklearn.linear_model import LogisticRegression

from sklearn.linear_model import LinearRegression

import pandas as pd

 

# Importing dataset

data = pd.read_csv('quiz.csv', delimiter=',')

used_features = [ "Last Score", "Hours Spent"]

X = data[used_features].values

scores = data["Score"].values

 

X_train = X[:11]

X_test = X[11:]

 

# Linear Regression - Regression

y_train = scores[:11]

y_test = scores[11:]

 

regr = LinearRegression()

regr.fit(X_train, y_train)

y_predict = regr.predict(X_test)

 

print(y_predict)

结果:

[55.33375602 54.29040467 90.76185124]

 

用逻辑回归实现代码

代码:

from sklearn.linear_model import LogisticRegression

from sklearn.linear_model import LinearRegression

import pandas as pd

# Importing dataset

 

data = pd.read_csv('quiz.csv', delimiter=',')

used_features = [ "Last Score", "Hours Spent"]

X = data[used_features].values

scores = data["Score"].values

 

X_train = X[:11]

X_test = X[11:]

 

# Logistic Regression – Binary Classification

passed = []

for i in range(len(scores)):

    if(scores[i] >= 60):

        passed.append(1)

    else:

        passed.append(0)

       

y_train = passed[:11]

y_test = passed[11:]

classifier = LogisticRegression(C=1e5)

classifier.fit(X_train, y_train)

 

y_predict = classifier.predict(X_test)

print(y_predict)

结果:

[1 0 1]

 

16---决策树——既能分类又能回归的模型

一棵决策树(Decision Tree)是一个树结构(可以是二叉树或非二叉树),每个非叶节点对应一个特征,该节点的每个分支代表这个特征的一个取值,而每个叶节点存放一个类别或一个回归函数。

决策节点、特征、分裂特征

分裂特征的目标,是让各个分裂子集尽可能地“纯”。

使得各个分裂子集“纯”:

ID3 算法(Iterative Dichotomiser 3):以信息增益为度量,选择分裂后信息增益最大的特征进行分裂。

信息熵、信息增益、

C4.5 算法

信息增益率(Gain Ratio)、分裂信息(Split Information)、

CART 算法Classification and Regression Tree 分类和回归树

Gini 系数(Gini Coefficient)、劳伦茨曲线、Gini 指数(Gini Index)

 

17---决策树——告诉你 Hello Kitty 是人是猫

后剪枝优化决策树、先剪枝(局部剪枝)、后剪枝(全局剪枝)

 

代码:

from sklearn import tree

from sklearn.model_selection import train_test_split

import numpy as np

 

#9个女孩和8只猫的数据,对应7个feature,yes取值为1,no为0

features = np.array([

    [1, 1, 0, 0, 1, 0, 1],

    [1, 1, 1, 0, 0, 0, 1],

    [0, 1, 0, 0, 0, 0, 1],

    [1, 1, 0, 0, 1, 0, 1],

    [0, 1, 0, 0, 1, 0, 0],

    [0, 1, 0, 0, 1, 0, 1],

    [1, 1, 0, 0, 1, 0, 0],

    [0, 1, 0, 0, 1, 0, 1],

    [0, 1, 0, 1, 1, 1, 1],

    [1, 0, 1, 1, 1, 1, 0],

    [0, 0, 0, 1, 1, 1, 0],

    [1, 0, 1, 1, 1, 1, 0],

    [0, 0, 0, 1, 1, 1, 0],

    [1, 0, 0, 1, 1, 1, 0],

    [0, 0, 1, 0, 1, 1, 0],

    [1, 1, 1, 1, 1, 1, 0],

    [1, 0, 1, 1, 1, 1, 0]

    ])

#1 表示是女孩,0表示是猫

labels = np.array([

    [1],

    [1],

    [1],

    [1],

    [1],

    [1],

    [1],

    [1],

    [1],

    [0],

    [0],

    [0],

    [0],

    [0],

    [0],

    [0],

    [0],

    ])

# 从数据集中取20%作为测试集,其他作为训练集

X_train, X_test, y_train, y_test = train_test_split(

    features,

    labels,

    test_size=0.2,

    random_state=0,

    )

 

# 训练分类树模型

clf = tree.DecisionTreeClassifier()

clf.fit(X=X_train, y=y_train)

 

# 测试

print(clf.predict(X_test))

# 对比测试结果和预期结果

print(clf.score(X=X_test, y=y_test))

 

# 预测HelloKitty

HelloKitty = np.array([[1,1,1,1,1,1,1]])

print(clf.predict(HelloKitty))

 

结果:

[1 1 0 0]

0.75

[0]

 

18---SVM——线性可分 SVM 原理

 

线性可分、超平面(Hyperplane)、线性分类模型、线性分类器

以最大间隔把两类样本分开的超平面,是最佳超平面

支持向量机(Support Vector Machine,SVM)

求最大分割超平面问题其实是一个约束条件下的最优化问题

线性可分 SVM 的目标函数:一个带约束条件的求极值问题

19---SVM——直观理解拉格朗日乘子法

拉格朗日乘子法,一种多元函数在变量受到条件约束时,求极值的方法。可以用来解决 SVM 的目标函数最优化。

函数的梯度与它的等高线垂直。

拉格朗日乘子  

拉格朗日函数也可以通过求导变化成约束条件本身。

原本有约束的优化问题,就可以转化为对拉格朗日函数的无约束优化问题了。

KKT 约束条件

 

20---SVM——对偶学习算法

线性可分 SVM 的目标函数可以通过求解其对偶问题来求解

SMO(sequential minimal optimization)算法

22---SVM——非线性 SVM 和核函数

对于在有限维度向量空间中线性不可分的样本,我们将其映射到更高维度的向量空间里,再通过间隔最大化的方式,学习得到支持向量机,就是非线性 SVM.

这个更高维度的新空间叫做特征空间.

非线性 SVM = 核技巧 + 线性 SVM

核矩阵

多项式核(Polynomial Kernel)

RBF 核(Radial Basis Function Kernel)高斯核 (Gaussian Kernel)Sigmoid 核(Sigmoid Kernel)数据归一化(Data Normalization)

 

23---SVR——一种“宽容”的回归模型

线性回归:在向量空间里用线性函数去拟合样本。

严格的线性回归,所有样本实际位置到该线性函数的综合距离为损失,通过最小化损失来求取线性函数的参数

宽容的支持向量回归(SVR)支持向量回归(Support Vector Regression,SVR)

SVR 和线性回归,却是两个不同的回归模型,计算损失的原则不同,目标函数和最优化算法也不同

SVR 在线性函数两侧制造了一个“间隔带”,对于所有落入到间隔带内的样本,都不计算损失;只有间隔带之外的,才计入损失函数。之后再通过最小化间隔带的宽度与总损失来最优化模型。SVR 巴不得所有的样本点都落在“隔离带”里面,而 SVM 则恰恰希望所有的样本点都在“隔离带”之外!

SVR 的两个松弛变量

SVR 的主问题和对偶问题

SVR 的核技巧

 

 

猜你喜欢

转载自blog.csdn.net/SKY_yiyi_9/article/details/82287524