目录

实施NLP流水线之前干点什么

NLP流水线总览

NLP处理套路无非以下该图中描述

该文的重点则对所有该流水线之前的任务进行补充

数据本身处理

  • 简繁体转换或其他同义转换(中文)
  • 全角半角转换
  • 不在dictionary(正则与替换对照词典)以内的单词就用UNK取代
  • 可以在句首加上,在句末加上
  • url,at,表情符号等统一替换
  • 稀有词替换为 (词频小于某一个阈值)
  • 编码转换
  • 小写转换
  • 去除标点符号(根据具体的任务也可替换)
  • 去除停用词
  • 去除频现词
  • 去除稀疏词
  • 略缩词替换
  • 错词纠正(将词替换为词典中最近的词或者)
  • 单位替换(将文本中的单位替换为统一格式如:将4kgs、4kg统一替换为4 kg,将4k替换为4000,将100或100 100或100100或100替换为100 dollar)
  • 词形还原(lemmatization)
  • 其他语言进行翻译(比如对于中文中的英文单词归一化为<_e_>)
  • 数字归一化(比如将小于10的为<如果在之后的实体识别中需要对应的原始数字则跳过该步骤.1:NUM> 大于10<2:num>)

数据增强

  • 长句截断
  • dropout
  • shuffle
  • 文档裁减(这样我将获得更多的数据。开始的时候我尝试从文档中抽取几个句子并创建10个新文档。这些新创建的文档句子间没有逻辑关系,所以用它们训练得到的分类器性能很差。第二次,我尝试将每篇文章分成若干段,每段由文章中五个连续的句子组成。这个方法就运行得非常好,让分类器的性能提升很大)
  • 文本对齐
  • 同义词替换
  • 回译
  • 迁移学习
  • GAN
  • BERT

实体识别的分类

PERSON People, including fictional.
NORP Nationalities or religious or political groups.
FAC Buildings, airports, highways, bridges, etc.
ORG Companies, agencies, institutions, etc.
GPE Countries, cities, states.
LOC Non-GPE locations, mountain ranges, bodies of water.
PRODUCT Objects, vehicles, foods, etc. (Not services.)
EVENT Named hurricanes, battles, wars, sports events, etc.
WORK_OF_ART Titles of books, songs, etc.
LAW Named documents made into laws.
LANGUAGE Any named language.
DATE Absolute or relative dates or periods.
TIME Times smaller than a day.
PERCENT Percentage, including ”%“.
MONEY Monetary values, including unit.
QUANTITY Measurements, as of weight or distance.
ORDINAL “first”, “second”, etc.
CARDINAL Numerals that do not fall under another type.

参考

Introdecton to pipelines
文本数据处理的终极指南-NLP入门
使用re正则化进行文本清理
自然语言处理时,通常的文本清理流程是什么?
中文自然语言处理时,英文单词和数字怎么处理?
几千条文本库也能做机器学习!NLP小数据集训练指南
知乎“看山杯” 夺冠记


版权声明:本文由littleji.com创作并发表,转载请注明作者及出处,欢迎关注公众号:littleji_com
本文遵守CC BY0SA 4.0
if you have any questions, please leave a message behind or give an issue

本文链接为:https://blog.littleji.com/2019/04/27/20190427SomethingBeforeTheNlpPipline/

目录

Gitlab 入门与 工作流

GitLab 入门

我不想再尴尬下去了

当你在照镜子时

当你觉得在正常地开发用户的需求时

当你作为一个萌新准备接手别人的代码时

当你在准备跟用户进行展示你开发的产品时

当你在咆哮这段恶心的代码是谁写的时候

当你准备跟甲方好好唠嗑的时候

上面到底是什么问题?

  1. 软件开发进度难以预测
  2. 用户对产品功能难以满足
  3. 软件产品质量无法保证
  4. 软件产品难以维护
  5. 软件缺少适当的文档资料

归根结底是因为我们使用了一种小作坊式/游击队式地开发方式

从游击队转向正规军

以前在游击队里面人们在无数次的管理混乱导致项目搁浅(钱没了,什么都没做出来)的教训下,逐渐摸索出了一些“办事流程”,这些办事流程在实践中被证明效果还不错,被广泛采用,借以提高项目的成功率,以及降低掉头发的速率

技术思维得有,工程思维也少不了

工程思维的起点是流程。流程的背后是科学,以既定的步骤、阶段性的输入/输出去完成价值创造,通过过程控制确保最终结果让人满意。

为什么使用GitLab搞这一套东西

GitLab 本身是一个工具,是一个让大家达成共识的工具,帮助各位进行工程化地软件开发与管理,最终目的是拯救程序员们日益稀少的头发

GitLab中的组织结构

主要使用group subgroup project的方式进行组织,一个典型的人员组织结构如下所示:

  • Organization Group - GitLab
    • Category Subgroup - Marketing
      • (project) Design
      • (project) General
    • Category Subgroup - Software
      • (project) GitLab CE
      • (project) GitLab EE
      • (project) Omnibus GitLab
      • (project) GitLab Runner
      • (project) GitLab Pages daemon

group的作用是让团队人员可以一次性授权并访问多个项目

再比如我现在建立的一个示范性的

team

  • 产品/用研user_research/UR
  • 用户体验user_experience/UE
  • 用户界面user_interface/UI
  • 开发develop/DEV
  • 质量quality_assurance/QA
  • 运维operation_maintenance/OP
  • 文档documentation/DOC
  • 开发经理pproject_manager/PM

迭代时间的长度

sprint:译作短跑,指一个迭代,一般包括几个功能和bug修复,开发周期为2-4周

milestone:译作里程碑,为了便于大家进行回顾是否偏离的航道或者进度,一般为3个sprint,也就是之后的一个季度

release:一般是一个产品的deadline

从点子到产品

  • IDEA: 每一个从点子开始的项目,通常来源于一次闲聊。在这个阶段,项目组内的所有人对需求提出自己的想法.
  • ISSUE: 最有效的讨论一个点子的方法,就是为这个点子建立一个工单讨论。你的团队和你的合作伙伴可以在 工单追踪器issue tracker 中帮助你去提升这个点子
  • PLAN: 一旦讨论得到一致的同意,就是开始编码的时候了。首先,我们需要优先考虑组织我们的工作流。对于此,我们可以使用 工单看板Issue Board。
  • CODE: 现在,当一切准备就绪,我们可以开始写代码了。
  • COMMIT: 当我们为我们的初步成果欢呼的时候,我们就可以在版本控制下,提交代码到功能分支了。
  • TEST: 通过 GitLab CI,我们可以运行脚本来构建和测试我们的应用。
  • REVIEW: 一旦脚本成功运行,我们测试和构建成功,我们就可以进行 代码复审code review 以及批准。
  • STAGING:: 现在是时候将我们的代码部署到演示环境来检查一下,看看是否一切就像我们预估的那样顺畅——或者我们可能仍然需要修改。
  • PRODUCTION: 当一切都如预期,就是部署到生产环境的时候了!
  • FEEDBACK: 现在是时候返回去看我们项目中需要提升的部分了。我们使用周期分析 Cycle Analytics来对当前项目中关键的部分进行的反馈。

为什么说要使用一个issue开始一切

  • 在issue中,通过规范化的模板,项目中的任何人可以知道这个需求或者bug的任何详细信息和讨论以及历史
  • 通过issue中的文档信息,开发者与项目经理可以进行实时交流某一个feature的最新设计思路,这个可以作为一份实时的共享编辑文档
  • 使用issue的label功能可以实现工作流\时间估计等较复杂的功能

issue本身需要包含哪些东西

一个 feature类型 issue基本上长成这个样子

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
## 概述


## feature ID


## 其他相关feature和bug链接


* #XX1
* #XX2


## 估计花费的时间和实际花费的时间

/estimate 1mo 1w 1d 1h 1m

/spend 1mo 1w 1d 1h 1m

## 更新的具体类型

* [ ] 非影响各个接口输出的功能更新(单纯的增加功能,不变更已有的功能)
* [ ] 影响接口的功能更新(已有的部分功能会失效)

## 检查项
* [ ] ~"team-DEV" 代码符合本项目的代码风格
* [ ] ~"team-DEV" 单元测试通过
* [ ] ~"team-DEV" 针对于该功能的概要、详细等设计文档进行更新
* [ ] ~"team-QA" 测试用例通过
* [ ] ~"team-QA" 集成测试通过
* [ ] ~"team-QA" 针对于该功能的相关测试文档进行更新


## 修改的功能



* [ ] 功能1
* [ ] 功能2

## 添加的功能

* [ ] 功能1
* [ ] 功能2

## 删除的功能

* [ ] 功能1
* [ ] 功能2

## 如何对该功能进行验证

issue的type

  • feature:开发功能点
  • bug: 软件缺陷
  • tech debt:不改变功能的情况下增强产品性能
  • ux debt:用户体验需要提升

对issues进行plan

plan说是计划,实则是沟通

  • process-needs confirmed
  • process-reject(拒绝)
  • process-doing

优先级

优先级的意义是便于在同时处理大量需求的时候有一个计划。

  • P1 特高级 目前的sprint搞定
  • P2 高级 下个sprint搞定
  • P3 中级 目前的里程碑再搞定
  • P4 低级 下个里程碑再搞定

严重性

  • S1 完蛋 系统崩溃/数据丢失/数据泄漏/coredump 没有数据可用性
  • S2 严重 无法在前台查询数据,但是数据库完整 部分数据可用性丢失
  • S3 中级 前台显示错位 数据无丢失可用性受损
  • S4 初级 前台颜色显示错误 数据无丢失 可用性也无受损

issue board,工作看板

我们做了这么多准备,都是为了这个,让整个项目组成员清晰的了解到,目前的计划与进度,加快信息的传递

正儿八经的issue应该有三个标签、责任人、截止时间:

  • process-*
  • 优先级
  • 团队,以团队为基础建立起来的看板可以通过拖拽自动加上团队标签

FQA

  • 问:能不能想svn那样单独的文件夹设置权限?

    • 答:不可以,同一个repo的每个文件夹的权限是一致,如果想根据人来设置请使用两个repo
  • 问:分支权限可以做什么?

    • 答:只允许部分人进行merge、只允许部分人进行push。

参考

程序员的那些事儿

奶头乐维基百科

GitLab工作流概览

GitLab Workflow: An Overview

Always start with an issue

scrum-sprint-vs-milestone-vs-release

我们是怎么scrum

別再傻傻分不清,究竟PM, UX, UI, Web designer, Front-End Developer的專業差在哪?


版权声明:本文由littleji.com创作并发表,转载请注明作者及出处,欢迎关注公众号:littleji_com
本文遵守CC BY0SA 4.0
if you have any questions, please leave a message behind or give an issue

本文链接为:https://blog.littleji.com/2019/03/15/20190318HeadFirstForGitLab/

目录

常见的分词方法与文本向量化

[toc]

概述

文本分词作为自然语言处理(NLP)的基本任务之一,是很多上层任务(命名实体识别、情感分析、自动文摘等)的基础,那么从事相关行业的人员自然需要对其中涉及到的一些概念做进一步的了解,本文会从目前主流的分词算法、分词难点等展开进行简要的说明。

分词理论主要包含三个部分:分词算法、中文分词消歧、未登录词识别,而分词算法又包括词典分词、理解分词、统计分词、组合分词等几大类。下面的说明重点就是基于分词算法。

1 词典分词算法

基于词典的分词核心要确定两个内容:分词的算法与词典的结构,其中主要使用的集中基于词典的方法有正向最大匹配、逆向最大匹配、双向最大匹配、最少切分等。

1.1 前向最大匹配算法、后向最大匹配、双向匹配、最小切分

前向最大切词,是以可变滑动窗口对文本进行顺序取词,若改词在词典中存在,则进行一次切分;否则,缩小窗口大小,继续取词与词典库进行搜索,知道窗口词长为1。后向切词原理相似,只不过是从后面开始进行窗口滑动。

1
2
3
4
5
6
7
8
9
10
11
12
ustring = string_need_to_be_segmented
while :
if sentence_len < word_max_len:
word_max_len = sentence_len
for i in range(word_max_len, 0, -1):
if ustring[:i] in word_set or i == 1:
wordList.append(ustring[:i])
ustring = ustring[i:]
break
else:
i -= 1
return wordList

后向匹配与前向类似只不过方向从后往前进行匹配,双向匹配利用了前后两方面的信息,并从中选择词数最少的作为分词依据。

最小切分方法使用这样一条原则即:”每一句中切出的词数最小”

基于这种匹配的方法有这样的优点:

  1. 程序简单易行,开发周期短;
  2. 没有任何复杂计算,分词速度快;

缺点有:

  1. 不能处理歧义;
  2. 不能识别新词;
  3. 分词准确率不高,不能满足实际的需要;

2 基于统计的分词算法

2.1 NGram

基于N-gram语言模型的方法是一个典型的生成式模型,早期很多统计分词均是以它为基本模型,然后配合其他未登录词识别模块进行扩展。其基本思想是:首先根据词典对句子进行简单匹配,找出所有可能的词典词,然后将它们和所有单个字作为结点,构造n元切分词图,图中的结点表示可能的此候选,边表示路径,边上的n元概率表示代价,最后利用相关搜索算法从中找到代价最小的路径作为最后的分词结果。

假设随机变量S为一个汉字序列,W是S上所有可能切分路径,对于分词,实际上就是求解使条件概率P(W|S)最大的切分路径W,即:
W=argmaxWP(W|s)

根据贝叶斯公式:
W=argmaxWP(W)P(S|W)P(S)

由于P(S)为归一化因子,P(S|W)恒为1,因此只需要求解P(W)。P(W)使用N-gram语言模型建模,定义如下(以Bi-gram为例):
P(W)=P(w1w2…wT)=P(w1)P(w2|w1)…P(wT|wT−1)

这样,各种切分路径的好坏程度(条件概率P(W|S))可以求解。简单的,可以根据DAG枚举全路径,暴力求解最优路径;也可以使用动态规划的方法的求解,jieba分词中不带HMM新词发现的分词,就是DAG+Uni-gram语言模型+后向动态规划的方式进行求解的

3 词袋模型与文本向量化

3.1 词袋模型

Bag-of-words model (BoW model) 最早出现在自然语言处理(Natural Language Processing)和信息检索(Information Retrieval)领域.。该模型忽略掉文本的语法和语序等要素,将其仅仅看作是若干个词汇的集合,文档中每个单词的出现都是独立的。BoW使用一组无序的单词(words)来表达一段文字或一个文档.。近年来,BoW模型被广泛应用于计算机视觉中。

基于文本的BoW模型的一个简单例子如下:

首先给出两个简单的文本文档如下:

    John likes to watch movies. Mary likes too.

    John also likes to watch football games.

基于上述两个文档中出现的单词,构建如下一个词典 (dictionary):

   {"John": 1, "likes": 2,"to": 3, "watch": 4, "movies": 5,"also": 6, "football": 7, "games": 8,"Mary": 9, "too": 10}

上面的词典中包含10个单词, 每个单词有唯一的索引, 那么每个文本我们可以使用一个10维的向量来表示。如下:
[1, 2, 1, 1, 1, 0, 0, 0, 1, 1]
[1, 1,1, 1, 0, 1, 1, 1, 0, 0]

该向量与原来文本中单词出现的顺序没有关系,而是词典中每个单词在文本中出现的频率。

一个bow与ngram的python例子:

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
#!/usr/bin/env python3

from __future__ import print_function

from collections import deque
from itertools import islice
from itertools import tee

try:
from itertools import izip as zip
except ImportError:
pass

#
def ngram(iterable, n=2):
"""s -> (s0,s1), (s1,s2), (s2, s3), ..."""
assert n > 0, 'Cannot create negative n-grams.'
l = tee(iterable, n)
for i, s in enumerate(l):
for _ in range(i):
next(s, None)
return zip(*l)


def ngram_generator(words, n=2):
"s -> (s0,s1), (s1,s2), (s2, s3), ..."
assert n > 0, "n is not in (0,inf)"
for i in range(len(words)-n+1):
yield tuple(words[i:i+n])

def cbow(iterable, window=1):
"s -> ((s0,s2), s1), ((s1,s3), s2), ((s2, s4), s3), ..."
context = [consume(s, i) for i, s in enumerate(tee(iterable, 2*window+1))]
target = context[window]
del context[window]
return zip(zip(*context), target)

参考

奉国和, 郑伟. 国内中文自动分词技术研究综述. 图书情报工作, 2011, 54(02): 41-45.
自然语言处理综述
结巴分词
谈分词算法(2)基于词典的分词方法
中文分词算法简介
BoW(词袋)模型详细介绍
自然语言处理基础-中文分词


版权声明:本文由littleji.com创作并发表,转载请注明作者及出处,欢迎关注公众号:littleji_com
本文遵守CC BY0SA 4.0
if you have any questions, please leave a message behind or give an issue

本文链接为:https://blog.littleji.com/2019/03/05/20190305DataWhaleNLPTask2/

目录

windows下TensorFlow安装与imdb文本分类

windows下进行TensorFlow GPU版本安装(不适用于CPU版本)

基于各种原因,本次的实验环境在windows下进行。
其中本机的配置如下:

1
2
3
4
5
6
硬件:
- CPU:Intel Xeon E3-1505M
- RAM:64GB
- GPU:NVIDIA Quadro M2000M
软件:
- OS:Windows 10 专业工作站 1809 x64

正确的步骤如下所示:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
1. 请务必保证安装的 `Python` 版本为 `3.6.X`, `TensorFlow` 对于 `3.7.X`还未支持完全
2. 安装 Cuda 10.0, 目前不要使用Cuda 10.1的版本,因为还未支持
3. 安装 cudnn for 10.0
4. 安装 tensorflow-gpu
5. 添加对应的环境变量
SET PATH=C:\Program Files\NVIDIA GPU Computing Toolkit\CUDA\v10.0\bin;%PATH%
SET PATH=C:\Program Files\NVIDIA GPU Computing Toolkit\CUDA\v10.0\extras\CUPTI\libx64;%PATH%
SET PATH=C:\tools\cuda\bin;%PATH%
6. 验证(在输入下面的代码并运行后,会出现3min的等待,目前原因不明)
python -c "import tensorflow as tf; tf.enable_eager_execution(); print(tf.reduce_sum(tf.random_normal([1000, 1000])))"
7. 结果
2019-03-03 17:28:53.391788: I tensorflow/core/platform/cpu_feature_guard.cc:141] Your CPU supports instructions that this TensorFlow binary was not compiled to use: AVX2
2019-03-03 17:28:53.569006: I tensorflow/core/common_runtime/gpu/gpu_device.cc:1433] Found device 0 with properties:
name: Quadro M2000M major: 5 minor: 0 memoryClockRate(GHz): 1.137
pciBusID: 0000:01:00.0
totalMemory: 4.00GiB freeMemory: 3.34GiB
2019-03-03 17:28:53.600653: I tensorflow/core/common_runtime/gpu/gpu_device.cc:1512] Adding visible gpu devices: 0
2019-03-03 17:28:54.903988: I tensorflow/core/common_runtime/gpu/gpu_device.cc:984] Device interconnect StreamExecutor with strength 1 edge matrix:
2019-03-03 17:28:54.921578: I tensorflow/core/common_runtime/gpu/gpu_device.cc:990] 0
2019-03-03 17:28:54.932974: I tensorflow/core/common_runtime/gpu/gpu_device.cc:1003] 0: N
2019-03-03 17:28:54.946509: I tensorflow/core/common_runtime/gpu/gpu_device.cc:1115] Created TensorFlow device (/job:localhost/replica:0/task:0/device:GPU:0 with 3048 MB memory) -> physical GPU (device: 0, name: Quadro M2000M, pci bus id: 0000:01:00.0, compute capability: 5.0)
tf.Tensor(1187.2697, shape=(), dtype=float32)

使用 imdb数据集进行文本分类

首先使用下属的代码下载数据集

1
2
imdb = keras.datasets.imdb
(train_data, train_labels), (test_data, test_labels) = imdb.load_data(num_words=10000)

下载完之后我们可以看到该数据集包含了25000条训练数据和25000条测试数据

1
print("Training entries: {}, labels: {}".format(len(train_data), len(test_data)))

我们查看某一条具体的imdb影评是什么样的格式

1
2
3
print(train_data[0])
----
[1, 14, 22, 16, 43, 530, 973, 1622, 1385, 65, 458, 4468, 66, 3941, 4, 173, 36, 256, 5, 25, 100, 43, 838, 112, 50, 670, 2, 9, 35, 480, 284, 5, 150, 4, 172, 112, 167, 2, 336, 385, 39, 4, 172, 4536, 1111, 17, 546, 38, 13, 447, 4, 192, 50, 16, 6, 147, 2025, 19, 14, 22, 4, 1920, 4613, 469, 4, 22, 71, 87, 12, 16, 43, 530, 38, 76, 15, 13, 1247, 4, 22, 17, 515, 17, 12, 16, 626, 18, 2, 5, 62, 386, 12, 8, 316, 8, 106, 5, 4, 2223, 5244, 16, 480, 66, 3785, 33, 4, 130, 12, 16, 38, 619, 5, 25, 124, 51, 36, 135, 48, 25, 1415, 33, 6, 22, 12, 215, 28, 77, 52, 5, 14, 407, 16, 82, 2, 8, 4, 107, 117, 5952, 15, 256, 4, 2, 7, 3766, 5, 723, 36, 71, 43, 530, 476, 26, 400, 317, 46, 7, 4, 2, 1029, 13, 104, 88, 4, 381, 15, 297, 98, 32, 2071, 56, 26, 141, 6, 194, 7486, 18, 4, 226, 22, 21, 134, 476, 26, 480, 5, 144, 30, 5535, 18, 51, 36, 28, 224, 92, 25, 104, 4, 226, 65, 16, 38, 1334, 88, 12, 16, 283, 5, 16, 4472, 113, 103, 32, 15, 16, 5345, 19, 178, 32]

说明所有的影评根据词典已经转化为相应的数字,我们尝试将对应的数字转换为真实的词

1
2
3
4
5
6
7
8
9
10
11
12
13
# 构建一个词与数字的映射字典
word_index = imdb.get_word_index()
# 创建一个数字与词的映射字典
word_index = {k:(v+3) for k,v in word_index.items()}
word_index[""] = 0
word_index[""] = 1
word_index[""] = 2 # unknown
word_index[""] = 3

index_word = dict([(value, key) for (key, value) in word_index.items()])

def decode_review(text):
return ' '.join([index_word.get(i, '?') for i in text])

现在我们就可以通过decode_review(train_data[0])来获得原始的影评了

1
" this film was just brilliant casting location scenery story direction everyone's really suited the part they played and you could just imagine being there robert  is an amazing actor and now the same being director  father came from the same scottish island as myself so i loved the fact there was a real connection with this film the witty remarks throughout the film were great it was just brilliant so much that i bought the film as soon as it was released for  and would recommend it to everyone to watch and the fly fishing was amazing really cried at the end it was so sad and you know what they say if you cry at a film it must have been good and this definitely was also  to the two little boy's that played the  of norman and paul they were just brilliant children are often left out of the  list i think because the stars that play them all grown up are such a big profile for the whole film but these children are amazing and should be praised for what they have done don't you think the whole story was so lovely because it was true and was someone's life after all that was shared with us all"

为了更好的进行下一步的神经网络处理,我们将对应的影评数据进行向量化,向量的长度为256

1
2
3
4
5
6
7
8
9
train_data = keras.preprocessing.sequence.pad_sequences(train_data,
value=word_index[""],
padding='post',
maxlen=256)

test_data = keras.preprocessing.sequence.pad_sequences(test_data,
value=word_index[""],
padding='post',
maxlen=256)

构建模型

1
2
3
4
5
6
7
8
9
10
# 初始化10000词的词典
vocab_size = 10000

model = keras.Sequential()
model.add(keras.layers.Embedding(vocab_size, 16))#每个词的向量长度为16
model.add(keras.layers.GlobalAveragePooling1D())
model.add(keras.layers.Dense(16, activation=tf.nn.relu))
model.add(keras.layers.Dense(1, activation=tf.nn.sigmoid))

model.summary()

创建优化器

1
2
3
4
5
6
7
8
9
10
# 使用adam算法
model.compile(optimizer='adam',
loss='binary_crossentropy',
metrics=['acc'])
# 创建一个验证集
x_val = train_data[:10000]
partial_x_train = train_data[10000:]

y_val = train_labels[:10000]
partial_y_train = train_labels[10000:]

开始进行训练

1
2
3
4
5
6
history = model.fit(partial_x_train,
partial_y_train,
epochs=40,
batch_size=512,
validation_data=(x_val, y_val),
verbose=1)

评估对应的结果

1
2
results = model.evaluate(test_data, test_labels)
print(results)

使用到的相关的术语

  1. ROC(Receiver Operating Characteristic)的操作方式与之前的P-R图类似,并提出了两个概念,真正利率TPR,假正利率FPR
  2. ACC 精确度,即正确与全集之比
  3. 召回率,即正确的与集合中所有真正正确的数据集之比

参考

使用keras进行文本分类


版权声明:本文由littleji.com创作并发表,转载请注明作者及出处,欢迎关注公众号:littleji_com
本文遵守CC BY0SA 4.0
if you have any questions, please leave a message behind or give an issue

本文链接为:https://blog.littleji.com/2019/03/03/20190303DataWhaleNLPTask1/

目录

软件项目交接清单

1 项目交接的场景

  • 由于同事离职,将工作交接给自己。
  • 由于自己离职,将工作交接给同事。
  • 由于项目变动,将工作交给其他项目组。

2 文档相关注意点

  • 确定每一期的产品需求文档,PRD文档,概要设计文档,详细设计文档(流程图、设计框架图、上下游组件交互图),接口设计文档。
  • 确定开发过程中可能使用到的PSD等视觉稿或切图。
  • 确定每一期的测试覆盖文档,单元测试文档,遗留Bug。
  • 确定目前这一期的开发进度文档,包括尚未开发,开发过程中,开发完成。
  • 确定每一期的使用说明文档。
  • 确定FAQ文档。
  • 确定每一期的产品人员,开发人员,测试人员。
  • 确定每一期的开始开发时间,提测时间,上线时间。
  • 确定之前所编写的专利、软件著作权等文档。
  • 了解相关程序风险,遗留问题等。
  • 其他的一些约定如Scrum、XP、瀑布等软件开发方法。

3 项目源码相关注意点

  • 将开发人员最后修改的代码提交。
  • 确定项目源码且需要有规范的详细注释。
  • 确定源码目录结构说明,明确结构中各个部分的意义。
  • 确定项目对外API。
  • 确定项目定时脚本。
  • 确定项目日志查看平台。
  • 开通SVN的权限。
  • 开通GIT的权限。
  • 开通涉及交接的任何系统权限。
  • 了解上线部署脚本、流程。
  • 了解代码规范。

4 数据库相关注意点

  • 相关数据库与数据表结构
  • 查看是否有未注释的库名、表名、字段名,将其确定。
  • 最好了解每一个数据库、表、字段的意义,更新到文档。
  • 最好将每一个表涉及到哪一个模块进行确认,更新到文档。

5 环境相关注意点

5.1 本地开发环境配置

  • 在自己本地电脑上配置环境,将项目在自己机器上运行成功。
  • 确认是否有其他的扩展,如需账号、端口,记得做记录。
  • 确认是否有配置文件,如果有则对于所有的配置项进行说明。

5.2 测试环境

开通测试账号。

5.3 预上线环境

  • 开通预上线环境账号
  • 确定预上线环境的域名地址,是否需要指定的Host等等。

5.4 正式环境

开通正式环境账号

6 对接人相关注意点

  • 确定测试对接人。
  • 确定产品对接人。
  • 确定项目跨部门对接人。
  • 确定运维和DBA对接人。

7 交接的形式

  • 具体的形式最好为举行一个交接会议,叫上相关产品、开发、测试,对于交接人员提出的问题,仔细逐一讲解、解答。
  • 使用交接双方共同参与,代码讲解的方式

备注

  • 最好能在员工提离职的时候就开始项目交接,而不是员工走的时候再做交接。
  • 离职要提前与上级领导沟通,给领导留出找对接人的时间。
  • 交接过程中遇到有疑问的地方,一定要确认清楚,做好记录。

参考

程序员如何做好交接
项目交接小总结
文档交接说明书
前端项目交接文档


版权声明:本文由littleji.com创作并发表,转载请注明作者及出处,欢迎关注公众号:littleji_com
本文遵守CC BY0SA 4.0
if you have any questions, please leave a message behind or give an issue

本文链接为:https://blog.littleji.com/2019/02/19/20190219HandoverMemoList/

目录

用gitlab来优化我们的软件开发流程

1 向领导汇报(内在驱动)

员工为什么不愿意做优化

  1. 人本身是懒惰的,员工也是如此,他们才不会把事做好的,他们只会做相应报酬的工作量,还可能基本还达不到其相应的报酬,大多数人都在混日子啊。
  2. 人的天性是不喜欢改变的,人的天性是习惯于一些按部就般的事的,也许那样做令人讨厌,但是人家还是能干点东西出来。如果你逼着人家改变,你就是在压迫人家,人家自然会反抗。
  3. 真正了解业务的那帮人根本不可能加入项目团队,那些人谁TMD愿意和苦逼的技术人员加班啊。 那些人喜欢和我们的用户吃吃喝喝,花天酒地的,根本不会和你们那些奇怪的东西(如:backlog)或是那堆ugly的内向古怪的技术人员打交道,更别说什么技术了。
  4. 销售什么都干得出来,让你去做项目是因为你是廉价劳动力,而且,他们会不断地加需求,因为软件合同谈好的价格时候,连需求都没有,你去做了才有,还是模糊和不确定或根本就是错的,然后需求是越来越多,越改越多。等你精疲力尽的时候,你才意识到,销售早就把你卖了。

2 向开发人员讲解(外在驱动)

代码审查的好处

  1. 代码实现清晰易读,无法阅读自然无法审查。
  2. 快速学习他人的代码思路提高自身水平。
  3. 你确定真的开发完功能了?开发的是不是想要的功能?
  4. AT & T 的一个 200 多人的部门在开始执行 code review 后,开发效率提高了 14%,而错误减少了 90% 左右。

建立看板(scrum)开发流程的好处

  1. 现在让你说有三个大功能分别是(重新设计网站首页,增加用户登录功能,增加日志审计功能)问你什么时候大概能完成?帮助你评估项目的时间节点
  2. 一个项目上百个点,有bug、有需求,怎么开发最有效率?按照优先级来排序指定的需求
  3. 无休止的加需求,不干没这单,干了以后又没用,那到底干还是不干?团队审核制,不干没用的事儿
    等等

建立wiki(知识管理)的好处

  1. 可以相当于是错题本,加速可以共同进步和提高

git的好处

持续集成的好处

  1. 大型重构完,如果不跑冒烟测试、回归测试你怕不怕?自动化构建和发布项目

使用gitlab的好处

涵盖了上述的所有功能

3 实施计划

思考

上来做持续集成和自动化测试显然是不现实的(假设20个人和他们的领导根本不知道自己正在开发什么的那种团队)。

  1. 比较现实的是先弄清楚现在在开发哪些功能和任务,并建立一个迭代式开发的框架。否则甚至没办法弄清楚大家的工作是否可以集成。
  2. 但如果只做这些工作,很容易出现问题:人们渐渐地开始降低迭代交付的标准(在进度的压力下),并期待着在测试期力挽狂澜,等等。
  3. 这时候,比较容易的是先定一些迭代交付标准,先用这些标准来卡一下质量问题。
  4. 若干个迭代过后,在任何一次Release的时候,一定会出问题的!抓住这个机会,提升迭代交付标准,并采用持续集成来保证不会到Release才会出问题。
  5. 有了持续集成,自然会有自动化测试,因为手工集成是不可能的。
  6. 等持续集成和自动化测试具备后,人们已经习惯于在这个技术体系下获得Build和Release版本,任何压力已经很难让团队绕近道了。
    当然,如果老板很早就意识到应该帮助我们而非被我们说服来做革命,我们也可以加快一点进度,在早期就引入持续集成和自动化测试。
    但是三原则仍然是必须遵守的指导方针,换言之,即使老板是改革派,我们也别一步实现共产主义。应该以敏捷的思想逐步改变并展示回报,坚定管理者的信心,最终彻底成功。

阶段1

  • git工作流
  • gitlab的简单使用(人员 代码管理 常用的issue label,issue模板 )
  • 使用gitlab进行git工作流
  • gitlab上进行wiki制作从而知识分享
  • 了解TDD开发
  • 部署脚本

阶段2

  • 迭代标准建立(代码覆盖率,功能点覆盖率,冒烟测试)
  • 基于 gitlab 代码审核
  • 基于 gitlab + jenkins持续集成、发布

阶段3

  • 基于scrum的软件开发流程
  • 基于gitlab的敏捷开发实践
  • gitlab上看板(board)的建立
  • gitlab上里程碑(milestone、小版本)建立
  • gitlab上组织划分

参考

无烟会议室:CMMI vs. Scrum vs. XP(QCon 2010 感受
为什么我们迫切需要持续集成


版权声明:本文由littleji.com创作并发表,转载请注明作者及出处,欢迎关注公众号:littleji_com
本文遵守CC BY0SA 4.0
if you have any questions, please leave a message behind or give an issue

本文链接为:https://blog.littleji.com/2019/02/12/20190212OptimizeTheDevelopmentProcess/

目录

七天算法梳理之决策树

信息论基础

信息论的基础由香农博士于1948年奠定.下面说明关于信息论的一些基本概念.

上表示一个随机变量不确定的数量.如果一个随机变量的熵越大,那么其不确定也就越大.
如果$X$为离散型变量,取值为$\mathbb R$,其概率分布为$p(x)=P(X=x),x\in \mathbb R$,那么X的熵$H(X)$定义为:

联合熵

联合熵其实就是描述一对随机变量平均所需要的信息量.
如果$X,Y$是一对离散型随机变量 $X,Y ~ p(x,y),X,Y$的联合熵为$H(X,Y)$为:

条件熵

条件熵$H(Y|X)$的意思是,在X发生的条件下,Y的不确定性有

将联合概率进行展开后发现:

信息增益

现在有属性a, 其可能有v个可能的取值,如果使用属性a来对样本D进行划分的话,易知会产生v个节点,那么所有属性为$a_v$的样本可记为$D^v$.,这时候再根据各个节点对应所占的比例$|D^v|/|D|$分配权重,就可以知道使用属性a对D进行划分的时候所获得的信息增益,也就是说使用整个样本的信息熵,减去通过属性a划分的信息熵之和就是信息增益.

现在假设样本D的信息熵为

那么信息增益为:

基尼不纯度

基尼不纯度是CART算法划分属性所使用的度量方法,其直观上的理解是从一个数据集D中任意抽取两个样本,其类别不一致的概率.其具体的公式如下:

决策树的不同分类算法

ID3算法

流程具体如下:

  1. 首先考虑样本中只有一个类或者没有属性的情况
  2. 计算各个属性的信息增益后
  3. 选择信息增益最多的属性进行节点分类,建立各个节点分支
  4. 再依次的再各个节点中进行选择计算信息增益,返回步骤2重复迭代
  5. 到达指定的退出条件,没有特征或者信息增益较小
    由于ID3 算法只有生成树的过程,没有剪枝等过程,所以可能过拟合.

C4.5

首先,信息增益比的定义是信息增益G(D,a)与训练数据集熵H(D)的比

该C4.5算法则是针对于ID3算法的改进,在生成树的过程中使用了信息增益比来选择,而不是单纯的使用信息增益
算法过程如下:
假设 数据集D 特征集A 阀值ε

  1. 如果数据中均为同一个类,则返回,算法结束
  2. 如果 $A=\varnothing$, 则返回一个单节点的树,并选择实例数最多的类,为该节点的类别,算法结束
  3. 选择其中信息增益比最大的节点
  4. 再依次选择各个节点,计算当前节点的内的信息增益比,进行迭代
  5. 最终达到指定的退出条件,即信息增益比过低,或者没有更多的特征时退出算法

上面的构建的节点树都是分类树,只不过节点划分的方式不同.那么什么是回归树呢?

回归树原理

回归树对于样本的划分,通过遍历所有输入变量,找到最优的切分变量j和最优的切分点s,即选择第j个特征$x^j$和它的取值s将输入空间划分为两部分,然后重复这个操作,对于连续性的样本值非常有效.
具体算法如下

  1. 选择最优的切分变量j和最优的切分点s,求解
  2. 遍历所有特征,对固定的特征扫描所有取值,找到使上式达到最小值的对(j,s).
  3. 用选定的对 (j,s)划分区域,并确定该区域的预测值;
  4. 继续对两个字区域调用上述步骤,直至满足停止条件;

CART分类树

CART分类树的全称是分类与回归树,主要的原理思想是将内部的节点特征取值为”是”或”否”两个值,左分支为是,右分支为否,这样整个决策树就可以在整个样本空间中求取对应的条件概率分布.
算法由特征选择和生成树以及前面两种算法所没有的剪枝构成,算法主要包括两个部分:树的生成与剪枝

CART的生成

从根节点开始,对节点计算现有特征的基尼指数,对每一个特征,例如AA,再对其每个可能的取值如aa,根据样本点对A=aA=a的结果的”是“与”否“划分为两个部分,利用

进行计算;在所有可能的特征AA以及该特征所有的可能取值a中,选择基尼指数最小的特征及其对应的取值作为最优特征和最优切分点。然后根据最优特征和最优切分点,将本节点的数据集二分,生成两个子节点
对两个字节点递归地调用上述步骤,直至节点中的样本个数小于阈值,或者样本集的基尼指数小于阈值,或者没有更多特征后停止;

CART的剪枝

剪枝就是对生成的树进行裁剪简化的过程,其一般是通过极小化决策树整体的损失函数或代价函数来实现.
CART的剪枝是通过两个步骤:

  1. 从树的底部不断地剪枝直到根节点,形成对应的子树序列
  2. 通过交叉验证法,对子树的序列进行测试,并从中选取最优的子树

决策树防止过拟合手段

决策树过拟合主要有两个手段,分别为early stopping与剪枝.

  1. earlystopping:限制选取的分类节点的总数,树的深度,节点中的实例数,阈值等
  2. 剪枝,即当前节点的划分无法带来决策树泛化性能的提升,增删除对应的节点

模型评估

可以使用之前梳理的AUC ROC 交叉验证 随机抽样等方法,这里就不再赘述了.

python可视化决策树与对应的函数实现

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
import pydotplus
from sklearn.datasets import load_iris
from sklearn import tree
import collections
# Data Collection
X = [ [180, 15,0],
[177, 42,0],
[136, 35,1],
[174, 65,0],
[141, 28,1]]

Y = ['man', 'woman', 'woman', 'man', 'woman']

data_feature_names = [ 'height', 'hair length', 'voice pitch' ]
# Training
clf = tree.DecisionTreeClassifier()
clf = clf.fit(X,Y)
# Visualize data
dot_data = tree.export_graphviz(clf,
feature_names=data_feature_names,
out_file=None,
filled=True,
rounded=True)
graph = pydotplus.graph_from_dot_data(dot_data)

colors = ('turquoise', 'orange')
edges = collections.defaultdict(list)

for edge in graph.get_edge_list():
edges[edge.get_source()].append(int(edge.get_destination()))

for edge in edges:
edges[edge].sort()
for i in range(2):
dest = graph.get_node(str(edges[edge][i]))[0]
dest.set_fillcolor(colors[i])

graph.write_png('tree.png')

主要的函数为

参考

统计自然语言处理-宗成庆
机器学习-周志华
统计学习方法-李航
决策树(分类树、回归树
Decision tree visual example


版权声明:本文由littleji.com创作并发表,转载请注明作者及出处,欢迎关注公众号:littleji_com
本文遵守CC BY0SA 4.0
if you have any questions, please leave a message behind or give an issue

本文链接为:https://blog.littleji.com/2018/12/25/20181225MLReview3/

目录

七天算法梳理之逻辑回归

逻辑回归与线性回归的联系与区别

逻辑回归事实上是将线性回归的输出进行了非线性函数的映射,而这个映射即是:

逻辑回归的原理

逻辑回归的主要原理是将之前的线性空间通过非线性函数进行再输出,让对应的输出范围集中在要么靠近0,要么靠近1的区域内,从而完成将对应的数据分类的目的

3、逻辑回归损失函数推导及优化
假设
P(y=1|x,θ)=hθ(x)
P(y=0|x,θ)=1−hθ(x)
则有
P(y|x,θ)=hθ(x)y(1−hθ(x))1−y
很容易得到似然函数表达式:
L(θ)=∏i=1m(hθ(x(i)))y(i)(1−hθ(x(i)))1−y(i)
取对数得:
J(θ)=−lnL(θ)=−∑i=1m(y(i)log(hθ(x(i)))+(1−y(i))log(1−hθ(x(i))))

4、 正则化与模型评估指标
逻辑回归也需要处理过拟合的问题那么正则化的方法提供了一个很好地思路
逻辑回归的L1正则化的损失函数表达式如下,相比普通的逻辑回归损失函数,增加了L1的范数做作为惩罚,超参数α作为惩罚系数,调节惩罚项的大小。

二元逻辑回归的L1正则化损失函数表达式如下:
J(θ)=−Y⊙loghθ(X)−(E−Y)⊙log(E−hθ(X))+||θ||1
其中||θ||1为θ的L1范数。

二元逻辑回归的L2正则化损失函数表达式如下:
J(θ)=−Y⊙loghθ(X)−(E−Y)⊙log(E−hθ(X))+12α||θ||22
其中||θ||2为θ的L2范数。

5、逻辑回归的优缺点
优点:可以给出概率,解释性较好
缺点:容易欠拟合,对于非线性的特征还需要进一步的转化,

6、样本不均衡问题解决办法
类别不平衡问题指的是当正反例的数目偏差过大的时候,所造成的困扰
类别不平衡的一个基本策略是-再缩放(rescaling)
主要有三个途径:

  1. 对训练集中的反类样例进行欠采样,去除一些反例
  2. 对训练集里的正例进行过采样
  3. 直接学习但在预测的时候进行阀值的改变
    类别不平衡学习通常是较小类的代价更高,

  4. sklearn参数
    逻辑回归具体的位置在:
    from sklearn.linear_model import LogisticRegression
    主要有C penalty tol solver 等几个参数
    C:正则化系数的倒数,默认为1
    penalty:用来指定正则化的参数
    tol:迭代终止的误差范围
    solver:决定使用什么样的优化方法


版权声明:本文由littleji.com创作并发表,转载请注明作者及出处,欢迎关注公众号:littleji_com
本文遵守CC BY0SA 4.0
if you have any questions, please leave a message behind or give an issue

本文链接为:https://blog.littleji.com/2018/12/22/20181222MLReview2/

目录

七天算法梳理之线性回归

1 机器学习的一些概念

1.1 什么是机器学习?

计算机系统能够通过现有的数据,不断地改进其解决某一问题的性能,称为机器学习。

1.2 什么是有监督与无监督学习?

对于机器学习的过程中,对于所要学习的数据,如果其为标注的数据则称为有监督学习,否则称为无监督学习。

1.3 什么是泛化能力?

泛化能力指一个经过学习后的模型,能够适应与处理新样本的能力,这也是机器学习的主要目标。

1.4 什么是过拟合与欠拟合?

  • 过拟合:过拟合指在学习的过程中,模型把样本本身的特点而非目标模型的特点进行了学习,导致整体性能下降的情况。
  • 欠拟合:欠拟合则是对目标模型的一般性质还没有习得,主要是由于模型本身的学习与表达能力不够。

1.5 过拟合与欠拟合如何解决?

  • 欠拟合的解决:通过增加模型的学习能力,如:增加学习轮数、增加神经网络的复杂度以提升其表现能力等。
  • 过拟合的解决:过拟合一般来说是只可缓解无法彻底解决,通过对学习使用的模型进行改进,如 :减少相应的模型参数、降低神经网络复杂度等。

1.6 什么是方差Variance和偏差Bias?

方差与偏差是解释学习算法泛化性能的一种重要的工具,下面我们来说明二者的侧重点。
首先,我们将所得到的训练数据等分成A,B,C3份,再借由这3份训练数据分别得出3个训练模型,那么”方差”指的是向这3个模型输入同样的测试样本,得出的输出结果的方差,借此来判断我们选择的模型对于不同的学习样本展现出的”模型本身训练的稳定性”.

其次,如果我们将上面的所有训练数据进行训练,并输入同样的测试样本,得到对应的输出结果X,将输出结果与真实的结果T进行比较,得到的差值就为偏差, 偏差则侧重于”模型本身预测的精准度”的衡量.

方差,偏差,噪声三者共同主导了学习模型的误差,在学习初期由于模型的拟合能力不强,这个时候主要是由偏差主导了误差,当学习后期模型的拟合能力增强后,微小的数据扰动都会被模型所捕捉到,此时由方差来主导模型的误差.

1.7 交叉验证

为了能够具体的衡量模型的性能,交叉验证提供了这样一种性能评测的手段.

交叉验证的思想是重复的利用数据,把数据进行切分为训练数据集与测试数据集,并在这个基础上进行反复的训练与测试,选取具有较好性能指标的模型.

具体的思想是,在数据集上划分k个大小相同且互斥的子集,使用k-1个子集进行训练,最后一个进行测试,得出结果后,再选择不同的k-1个自己训练,最后一个进行测试,容易看出上面可最终得到k个模型,通过求取其平均误差得到该模型的测试误差.

其中典型的k值为10.

2 线性模型

2.1 线性回归的原理

  • 线性模型:即通过将给定的一些特征进行线性组合所得到的模型.
  • 线性回归:通过学习得到一个线性的模型能够尽可能准确的预测输入数据的真实标记.
  • 线性回归的原理:使用了均方误差最小化的方法也就是常说的最小二乘法,即试图找到这么一条直线,使样本到直线上的欧氏距离之和最小.

2.2 线性回归损失函数、代价函数、目标函数

  1. 损失函数指的是单一训练集上产生的误差.
  2. 代价函数则值得是模型在整个训练集上产生的平均误差.
  3. 设学习后的模型f,面对测试样本X,模型对应的模拟输出f(X)以及X实际的输出Y,拟合的程度.有如下的表示方式

  4. 但是仅仅通过损失函数来就纠正拟合误差并非我们的目标,我们的是目标是是让模型精确地同时,又尽量的减少模型的复杂度,于是就引入了正则化函数来衡量模型的复杂度,最终我们的目标函数是最小化误差与最小化模型复杂度之和也就是

    前者是最小化经验风险,后者则是最小化结构风险

3 线性模型的优化方法

当我们得到了对应目标函数后,那么就需要具体的对该模型各个参数求最优解,也就是常见的最优化问题,这里有以下这么几个主要的算法.

3.1 梯度下降法

梯度下降法的优化思想是用当前位置负梯度方向作为搜索方向,因为该方向为当前位置的最快下降方向.

3.2 随机梯度下降法

由于梯度下降法使用了固定步长的,这样带来了后期收敛慢,其进入极小点的情况,这里通过选用随机梯度的下降,更容易突破局部极小点,从而收敛至全局极值点,不过也有迭代次数增加等缺点.

3.3 牛顿法

牛顿法不同于梯度向量,而是使用了二阶海森矩阵的逆矩阵来求解,相对来说比普通的梯度下降算法收敛速度更快,但是其要求必须具有二阶海森矩阵的逆矩阵条件,其计算非常复杂,该条件在大规模数据下往往无法保证.

3.4 拟牛顿法

拟牛顿法则是通过找到一个与海森矩阵类似性质的矩阵来替代,从而让计算更为容易.
其中DFP BFGS L-BFGS都是比较重要的拟牛顿方法.

3.5 其他自适应学习方法

adagrad,adadelta,rmsprop,adam等一系列adaptive learning rate方法

4 线性回归的评估指标

4.1查准率 全查率与F1

二分类问题有四种预测的情况:
真正例:true positive
假正例:false positive
真反例:true negative
假反例:false negative
查准率P与全查率R为

二者一般矛盾,因为查全率高意味着查的个数多,这样又会导致查准率下降
由查全率作为横轴,查准率作为纵轴形成P-R曲线,比较学习期的的性能时,比较该曲线的面积是一个方法
平衡点(Break-Event Point)是查准率等于查全率的取值,这样可以权衡查全率和查准率
BEP还是有些简化,更常用的是F1度量,目的是为了找出更好的学习器
F1:基于查准率和查全率的调和平均值(harmonic mean):

其中β>0, β=1时就退化为标准的F1,β<1时则查准更重要,β>1则查全更重要
很多时候我们有多个二分类混淆矩阵,例如进行多次训练和测试,每次都有一个,或者执行多分类任务,每每两个组合都对应一个混淆矩阵
一种直接的做法是在所有的混淆矩阵都计算,然后计算所有的平均值也就是宏查重率macro-P和macro-R以及对应的macro F1

4.2 ROC与AUC

学习预测就是将样本进行排序,最可能是正例的排在前面
神经网络一般情形下对每个测试样本预测出一个0-1的实值,然后将这个值作为截断点,大于这个截断点的样本为正例,其他的为反例,如果更重视查准率则可选择排序中靠前的位置,重视查全率则选择较后的截断点
排序本身的质量好环则是体现了学习器在不同任务下的期望泛化性能,ROC曲线就是从这个角度来研究学习器泛化性能

ROC(Receiver Operating Characteristic)的操作方式与之前的P-R图类似,并提出了两个概念,真正利率TPR,假正利率FPR

4.3 ROC绘制过程

设正例数目为m+ 反例数目为m-

  1. 均是先对所有的样例根据学习器的结果进行排序,然后将分类的阀值设置为最大,这时候均是反例,TPR=FPR=0
    2.调整阀值为依次每个样例的值,然后观察次样本是否为真正例,如果是坐标为(x,y+1/m+),如果不是坐标为(x+1/m-,y)
  2. 比较ROC曲线的面积也就是AUC

AUC更考虑的是样本预测的排序质量

5 sklearn参数详解

下面对于一个最普通的sklearn 线性模型的使用方式进行说明

1
2
3
4
5
6
7
8
9
10
11
# 创建一个普通的线性模型
regr = linear_model.LinearRegression()

# 输入对应的训练数据x,以及对应的标签数据y
regr.fit(datasets_train_x, datasets_train_y)

# 输入对对应的测试数据x,得出模型的预测输出
pred_y = regr.predict(datasets_test_x)

# 最终使用下面的命令轲输出对应的w 与 b
reg.coef_

除了上面的模型还有包括 lasso ridge等回归模型在linear_model包内

讨论

如何提升泛化能力?

参考

scikit-learn 0.20 document
azure machine-learning-reference
deeplearning
机器学习-周志华
统计学习方法-李航
机器学习中的Bias(偏差,Error(误差)和Variance(方差))有什么区别与联系
理解机器学习中常用优化方法
机器学习中的目标函数\损失函数\代价函数
梯度下降or拟牛顿法?
梯度下降法\牛顿法和拟牛顿法


版权声明:本文由littleji.com创作并发表,转载请注明作者及出处,欢迎关注公众号:littleji_com
本文遵守CC BY0SA 4.0
if you have any questions, please leave a message behind or give an issue

本文链接为:https://blog.littleji.com/2018/12/18/20181218MLReview1/

目录

Gnerative VS Discriminative

“one should solve
the [classification] problem directly and never solve a more general problem as an
intermediate step [such as modeling p(xly)].” —-Vapnik

背景

笔者在 NLP 概率图学习的过程中,发现解决同一种问题可以使用若干种模型,而大多数的 NLP 模型的种类主要集中在有监督学习.
通过概率图,我们自然会联想到对应的概率问题,而每当概率问题出现,无可避免的会有频率学派与贝叶斯派的竞争,两派为了解决同一个问题开发出了不同的概率图模型,自然在这些概率图的模型分类中也出现了对应分支,分别为判别式与生成式.
两个模型本身是解释同一种问题的不同角度,笔者最近对于该两个模型之间的对比与解释进行了学习,整理如下:

二个模型在分类问题上的处理方式

判别模型不关心数据是如何生成的,它只是对给定数据进行分类。
因此,判别算法试图直接从数据中学习P(y | x),然后尝试对数据进行分类。
另一方面,生成模型试图学习p(x,y),后来根据条件概率公式,可以将其转换为p(y | x)来对数据进行分类。

为了便于理解这里举两个例子

第一个例子

当我们需要判断两种不同的语言(比如中文和英文)的时候:

  1. 生成式模型:先去学习这两种不同的语言,再根据语言的输入去判断语言的种类
  2. 判断式模型:直接根据输入判断到底属于哪种语言

第二个例子

假设有

以及

以及对应的几个数据:

那么根据定义就可以求出联合概率分布为

p(x,y) y=0 y=1
x=1 1/2 0
x=2 1/4 1/4

对应的条件分布概率则为

p(y\ x) y=0 y=1
x=1 1 0
x=2 1/2 1/2

一张图理解生成模型与判别模型的关系

学习的目标是正确的将未知的数据进行分类,从图中我们可以很容易的看出:

  1. 判别模型学习得到的是那条分类的曲线,其关注点在于分类的边界学习
  2. 生成模型则学习得到的则是两类数据的具体分布情况

生成模型与判别模型的优缺点

生成模型的优点

  1. 在不平衡的数据样本上,表现依然优异
  2. 可输出所有类别下的估算概率
  3. 更好的模型解释性
  4. 更像是通用型 AI,可以产生有语法错误答案 有口音的语音等,可以使用 p(x,y)生成类似于现有数据的新数据
  5. 当样本数量较多时,生成模型能更快地收敛于真实模型
  6. 生成模型能够应付存在隐变量的情况,比如混合高斯模型就是含有隐变量的生成方法
  7. 只有生成模型能检测异常值。由于生成模型完全学习了所有的分布,所以它可以用来检测某个值是否异常:P(X)是否太小

生成模型的缺点

  1. 联合分布是能提供更多的信息,但也需要更多的样本和更多计算,尤其是为了更准确估计类别条件分布,需要增加样本的数目,而且类别条件概率的许多信息是我们做分类用不到,因而如果我们只需要做分类任务,就浪费了计算资源

判别模型的优点

  1. 在拥有大量的数据集的时候,相对于生成式模型,其准确度更高
  2. 由于直接学习P(\tilde{c}|\tilde{x} ),而不需要求解类别条件概率,所以允许我们对输入进行抽象(比如降维、构造等),从而能够简化学习问题
  3. 相对于生成模型来说,其计算资源大大地节省了,性能较好
  4. 所需要的样本数量少于生成模型

判别模型的缺点

  1. 不适合应用在不平衡的数据集中
  2. 只能应用在监督学习的任务中
  3. 模型的解释性差
  4. 尽管判别模型不需要对观察到的变量的分布进行建模,但它们通常不能表达观察变量和目标变量之间的复杂关系。在分类和回归任务中,它们不一定比生成模型表现更好。

主要的生成模型

  1. LDA
  2. HMM
  3. 朴素贝叶斯
  4. 混合高斯模型
  5. 概率上下无关文法
  6. 变分自动编码器
  7. GAN

主要的判别模型

  1. LR
  2. SVM
  3. CRF
  4. Boosting
  5. Decision tree
  6. K-neighbor
  7. 最大熵模型
  8. 感知机
  9. 神经网络

参考

知乎:机器学习“判定模型”和“生成模型”有什么区别?
Generative model


版权声明:本文由littleji.com创作并发表,转载请注明作者及出处,欢迎关注公众号:littleji_com
本文遵守CC BY0SA 4.0
if you have any questions, please leave a message behind or give an issue

本文链接为:https://blog.littleji.com/2018/11/27/20181127GenerativeVSDiscriminative/