一、能够熟练使用Python语言进行开发,有良好的PEP 8编码习惯,掌握Python字典、列表、集合,元组,Python异常捕捉,Python面向对象编程、封装、继承与重写。
集合:可以用来去重。
函数接收不定长参数:*args 用来接收元组,**kwargs用来接收字典。
继承与重写:子类拥有父类的所有属性和方法,当父类的方法不能满足子类的需求时,可以对方法进行重写。
Python面向对象编程:对函数进行分类和封装,让开发更便捷。
面向过程编程:根据业务逻辑直接从上到下写代码。
类属性和类方法:类属性就是给类对象中定义的属性,类方法使用@classmethod来标识, 调用类方法不需要实例化,直接调用即可。 def 类方法名(cls): 其中cls代表的是类名本身,所以在类方法中调用类名也用cls。
静态方法:使用@staticmethod来修饰,常常用来打印一些帮助内容。
del: 对象删除时,自动调用的方法。
str: 返回对象的描述信息,被print默认自动调用。
私有方法和私有属性作用:不希望被外部访问到的属性和方法,直接调用无法访问。在名字前增加两个下划线,就是私有方法或者属性。
多继承继承顺序:可以使用类提供的一个内置属性__mro__来查看方法的搜索顺序。
二、掌握常用数据结构与算法,如栈,队列,链表,二分及哈希查找,八大排序算法,能够熟练使用Python原生sort等。
三、能够熟练使用常用Shell命令,VIM编辑器,查看Linux日志,无秘钥登录,定时任务,虚拟环境配置等
常用shell命令:
1、切换用户:su 用户名
2、修改密码:sudo passwd xionger
3、删除用户:sudo userdel xiongda
4、查看文件详细信息:ll
5、显示当前目录:pwd
6、创建/删除: mkdir/rmdir (文件夹)
7、拷贝/移动: cp/mv
8、删除目录及其下的多个文件: rm -rf
9、改变目录或者是文件的权限: chmod
10、查看文件内容: cat
11、报告或者是删除文件中重复的行:uniq
12、统计指定文件中的行数:wc -l
VIM编辑器:
1、首先VIM编辑器分为命令状态和编辑状态(首先进入的是命令状态):
命令状态:输入命令来操作。
编辑状态:用来编辑文本资料。
2、命令状态常用命令:
文档保存以及退出:wq
放弃文档修改强行退出:q!
切换到编辑状态:i
3、编辑状态:
切换到命令状态:ESC
查看Linux日志:
无密钥登录:
定时任务:
虚拟环境配置:
四、掌握单例模式,工厂模式,装饰器模式,生成器的使用,会使用面向接口编程,面向切面编程
单例模式:一种常用的软件设计模式。
1、某个类只能有一个实例
2、它必须自行创建这个实例
工厂模式:
装饰器:让其他函数在不需要做任何代码变动的前提下增加额外功能,装饰器的返回值也是一个函数对象。
装饰器模式:经常用来插入日志、加入事务处理等。
列表生成式: list = [x*x for x in range(5)]
生成器的使用:把列表生成式的方括号改为圆括号,用next()函数来依次拿到值。或者使用for循环来拿出值,即生成器本来就是一个可迭代对象,是一个可迭代器(但是其他数据类型不是可迭代器,比如说列表、字典等,只是可迭代对象),是一个函数,可以记住上一次的位置。
面向切面编程:面向的是某个步骤或者阶段编程,考虑这个步骤或者阶段的实现。
五、熟练使用Numpy科学计算工具、Pandas数据分析包、Matplotlib数据可视化工具,熟悉各种常用业务指标含义,如何进行埋点采集,能够多角度分析业务;
5-1、Numpy
如何创建ndarray(Numpy类的对象格式):
1、使用array创建:np.array(lis1)
2、使用ones创建:np.ones()
3、使用zeros()创建:np.zeros()
4、使用asarray()创建:与array相比,不会开辟新空间,直接在原空间上进行操作。
5、使用np.arange(10) # arrange是range函数的数组版本。
6、创建后的对象带有的方法:shape,dtype。(维度和数组类型)
注意:当成员当中有一个为float时,那么numpy将会推断成为float64的数据类型。
ndarray基本操作:
1、变形: reshape()
2、转置:transpose()
3、级联:concatenate()、vstack()、hstack()
4、切分:np.split()、vsplit、hsplit
5、副本:copy()
6、强制类型转换:astype(np.int32)
7、条件逻辑:where(condition,y,z)
8、随机数组: random.randn(4,6)
# 举例 import numpy as np # 生成一个四行六列的ndarray数组 ls = np.random.randn(4,6) # 将满足条件的元素进行替换 lk = np.where(ls>0,1,-1)
numpy的文件操作:
(默认情况下数据是以未压缩的原始二进制格式保存在扩展名为.npy的文件)
1、文件保存: save(file_name, data)
2、文件加载:load(file_name.npy)
5-2、Pandas
Pandas的两种数据结构(pandas是基于Numpy来进行构建的,让以Numpy为中心的应用变得更加的简单):
5-2-1、Series(类似一维数组的对象,由values和index组成,及由数据和索引构成):
1、切片:
名字索引: loc[]
数字索引: iloc[]
2、使用
import pandas as pd from pandas import Series,DataFrame obj = Series(['a', 'b', 'c'], index=[1, 2, 3]) # 我们也可以把Series当作字典来使用,这时候,Series中的索引就是字典中的键。
5-2-2、DataFrame(是一个表格型的数据结构,索引既有行索引也有列索引):
构建:
import pandas as pd from pandas import Series,DataFrame # 左边是列索引。 data = { '60年代': {'狗子', '嘎子', '秀儿'}, '70年代': {'卫国', '建国', '爱国'}, } frame_data = DataFrame(data) # T:转置操作。 frame_data.T
查询操作:
1、单个label值查询:df.loc[行名,列名]
2、使用值列表批量查询: df.loc[[多行名],列名]
3、使用数值区间范围查询:df.loc[起始行名:结尾行名,列名]
4、使用条件表达式查询:df.loc[行名判断筛选,列名]
备注:如果有多个条件的话,可以使用添加与或非连接他们。
5、调用函数查询:
pandas新增数据列:
1、直接赋值
2、apply(函数): 映射,赋予某种函数关系。
3、assign
4、分条件赋值
处理丢失数据:
1、判断是否非空 isnull() 例如:pd.isnull(要判断的数据)
2、notnull()
3、过滤函数 dropna()
4、填充函数 fillna()
其他注意:
1、None与NaN
pandas中None和np.nan都视为np.nan。
numpy中None不参与运算。
2、填充方式
均值填充
向前填充、向后填充(使用到了fillna里的参数method)
线性差值填充 (np.linspace(开始值,结束值,分为多少份))
分组和合并、过滤:
1、分组:groupby()
2、过滤:filter()
3、汇总操作:aggregate()
表格匹配与拼接:
1、concatenate(concat()函数)
2、append
3、合并:merge()
4、join()
文件读取(csv、excell):
# 默认分隔符为逗号 import pandas as pd # skiprows:跳过哪一行数据 # header: 默认把第一行当作头部,如果指定header为None,则自动生成头部。 # nrows: 指定读取行数,只读取几行。(针对比较大的文件) dd = pd.read_csv('dd.csv', skiprows=[0], header=None, nrows=5) # sheet_name: 指定工作表 # plot根据excel绘制图表, # kind: 绘制模式 excel = pd.read_excel('data_excel.xlsx', sheet_name='工作表') excel.plot(kind = 'scatter', x='age', y='place').get_figure()
结果保存:
df: 读取的DataFrame格式的文件。
注意:经过验证,通常情况下来说csv格式的文件要比excel格式类型的文件大的多。
sep: 指定分隔符是什么。
df.to_csv(文件名, ecnoding=‘utf-8’, sep= ‘|’)
df.to_excel(文件名)
其他操作:
1、重新索引:reindex(新的索引列表, fill_value=空值填充成什么)
其他参数: method: (ffill 前向值填充 bfill 后向填充)
2、排序: sort_values(), sort_index()
3、日期生成:data_range(‘20200101’, periods=6)
# shift+tab查看函数源码 datas = pd.date_range('20211222', periods=7) pd.DataFrame(np.random.randn(7,4), index=datas, columns=['a', 'c', 'b', 'f'])
Matplotlib:
1、绘图函数:plot()
2、网格线:grid()
3、设置坐标轴范围:xlim、ylim
4、添加图例: legend()
实战项目:
1、数据导入
2、数据合并 concat merge
3、数据清洗
4、数据转换
5、数据筛选 groupby() sum()
6、离散化和分箱处理
六、熟悉数据集的基本处理方法(空值处理, 数据归一化和标准化),jieba分词,欠拟合、过拟合产生的原因及解决办法,模型超参数的调优,常用损失函数和梯度下降算法的优化
《特征工程——充分挖掘特征》
特征处理分为:数值型、类别型、时间型、文本型、统计型、组合特征。
数值型:归一化、标准化、离散化(连续值分为几段)。
类别型:one-hot编码/哑变量,Hash技巧
时间型:既可以看做连续值,也可以看做离散值。
文本型:使用TF-idf(倒排索引)
空值处理:
数据归一化:把幅度调整到【0,1】范围内,对行做处理(因为数值差别太大会使结果不准确)
标准化:对列做处理。
jieba分词:
欠拟合特点:模型在训练集和验证集上的效果都差。
1、添加更多的特征项。
2、增加模型的复杂度。比如说把低维不可分的数据映射到高维空间。
3、集成学习方法boosting(比如说GBDT)。
过拟合特点:随着训练过程的进行,模型在训练数据上的拟合效果越来越好,而在验证集上的效果则越来越差。
解决方法:
1、正则化:
L1正则化:逼迫更多w为0,变得稀疏。
L2正则化:逼迫所有w尽可能趋向于0但是不为0,顾及到了每一个点。
2、随机失活(dropout):让神经元以一定概率被激活。
3、逐层归一化(batch normalization):这个方法给每层的输出都做一次归一化。使得下一层的输入接近正态分布。
4、提前终止:不去过分的追求精确的最小值,根据交叉验证来提前终止训练。
5、减少特征个数:将与结果没什么关系的特征删除,防止噪声干扰模型。
6、集成学习方法Bagging。
超参数调优:
常用损失函数:
梯度下降算法:通过迭代找到目标函数的最小值,一般到不了最小的值,只能无限的收敛接近最小值,学习率不能太大,也不能太小,如果学习率太大的话会导致错过最低点,可能会在最低点附近反复横跳,而学习率太小的话会导致太慢。
梯度下降算法优化:
1、随机梯度下降(SGD):随机选择一个样本来进行学习,优点是训练速度很快,缺点是每次更新参数可能不会是正确的方向,而且波动极大。
2、全量梯度下降(BGD):每次使用全量的样本来更新参数,大方向是对的,可以保证一定收敛到最低点,但是每次训练速度太慢。
3、小批量梯度下降(MBGD):综合以上两种算法。
正负样本不平衡处理办法:
1、随机采样、分层采样
2、采集更多数据使得样本均衡
3、如果是图像数据,使用数据增强生成数据。
备注:对数据本身的理解更加重要,去掉赃的数据。
七、熟悉Scikit-learn机器学习框架,熟练掌握KNN、LinearRegression、Ridge Regression,LogisticsRegression, Decision Tree、随机森林, K-Means等经典机器学习算法
KNN:
LinearRegression(线性回归):回归,损失函数是平方损失函数。
优化=损失函数+优化算法
LR和RR的区别:都是线性回归的延伸,岭回归是带有正则化的线性回归(L2正则化),逻辑回归一般适用于分类问题(二分类),使用sigmoid函数把值映射到0到1之间。
Decision Tree:根据特征的重要程度所绘制出的一棵树。
划分决策树的几种原则:
1、ID3:信息增益
信息熵(纯度指标)-条件熵=信息增益,例子如下:
2、C4.5:信息增益率,首先使用ID3算法计算出信息增益高于平均水平的候选属性,接着C4.5计算这些候选属性的增益率。
来由:使用信息增益的话,信息熵会偏向于那些取值数目比较多的属性,所以推出了信息增益率;
3、CART算法:基尼指数。
基尼值:从数据集中随机抽取两个样本,其类别不一致的概率。
是信息增益的简化版本,只能处理二叉树,而前面两个不仅可以处理二叉树,也可以处理多分类树。
随机森林:
K-Means:
梯度下降:
1)批量梯度下降法(BGD):更新参数时使用所有的样本来进行更新。(即求梯度时用了所有的样本数据)。训练速度慢,但准确度较高。
2)随机梯度下降法(SGD):更新参数时只用一个样本来进行更新。训练速度快,但是准确度不稳定,有可能陷入局部最优解。
3)小批量梯度下降法(MBGD):是对于随机梯度下降法和批量梯度下降法的一个折中。
八、掌握Tensorflow 2.0 keras使用,熟练使用dataset及tfrecord,能够搭建多层神经网络解决分类及回归问题,会使用批归一化,dropout,网格搜索,自定义损失函数,自定义层,自定义求导对模型进行调优
批归一化:
dropout:
网格搜索:
自定义损失函数:
自定义层:
自定义求导:
九、掌握图片预处理,能够使用CNN实现图片分类,掌握文本预处理方法,能够使用RNN(lstm,gru)实现文本分类及文本生成,同时熟悉如何调整参数对模型进行优化
Embedding: 嵌入层Embedding的特点是低维、密集,可以用来降维。Embedding层把稀疏矩阵通过线性变换变为密集矩阵。将整数索引映射为密集向量。它接收整数作为输入,并在内部字典中查找这些整数,然后返回相关联的向量。Embedding层实际上是一种字典查找。相比于one-hot编码的好处是它可以表示词语之间的相关性。(词向量之间的几何关系应该表示这些词之间的语义关系)
one-hot编码:用稀疏矩阵来表示一句话,即每一个字都对应一个列表的向量。计算方便快捷、表达能力强,但是缺点也很明显,那就是过度占用资源。
RNN定义:主要是由输入层、隐藏层、输出层构成,RNN可以看做是同一神经网络的多次复制,每个神经网络模块会把消息传递给下一个。所以具有“记忆”功能。注意:每一个神经网络模块所用的权重参数都是共享的,即权重共享。
RNN的缺点:
1、受到短时记忆的影响,如果一条序列足够长,那它们将很难将信息从较早的时间步传送到后面的时间步。
2、梯度可能会随着时间的推移不断下降减少,而梯度变的非常小的时候,就不会再继续学习,可能会发生梯度消失。
LSTM定义:
1、是循环神经网络特特殊的类型。
2、LSTM的细胞可以决定哪些之前的信息和状态需要保留/记住,而哪些要被抹去。只是保留比较重要的信息。
3、细胞中包含四个交互层,三个Sigmoid和一个tanh层,Sigmoid层可以压缩信息到0~1之间,有助于记住或者忘记信息。
4、LSTM拥有的门结构:遗忘门、输入门、输出门来保护和控制细胞状态,即过滤机制。(详细解释遗忘门、输入门、输出门)
遗忘门:前一个状态输出和当前输入进行sigmoid,遗忘前面一句话的主语。
输入门:前一个状态输出和当前输入进行sigmoid,记入a,前一个状态输出和当前输入进行tanh,记为b,a和b进行点积运算,针对一句话给与新的信息。
输出门:
输出门就是给句子做一些额外的处理。
5、参数数量是rnn的四倍。
相对于RNN的优点:
6、这种方式可以弥补RNN短时记忆的缺点,可以有效地保存很长时间之前的关联信息。
7、可以减少梯度消失和梯度爆炸问题。
GRU定义:
相关文章:http://www.atyun.com/30234.html
十、机器翻译项目
是什么?
seq2seq:
1、 Seq2Seq模型是输出的长度不确定时采用的模型,这种情况一般是在机器翻译的任务中出现,将一句中文翻译成英文,那么这句英文的长度有可能会比中文短,也有可能会比中文长,所以输出的长度就不确定了。
2、seq2seq属于encoder-decoder结构的一种,这里看看常见的encoder-decoder结构,基本思想就是利用两个RNN,一个RNN作为encoder,另一个RNN作为decoder。或者是使用RNN的变种。
为什么?
怎么做?
一、准备数据、数据预处理
1、加载数据
2、分割数据:因为数据集里西班牙语和英语在同一行里,需要切割开,一共有11万条数据。
3、数据处理:全部转化为小写、去掉首尾多余的空格、删除特殊字符、标点符号前后都要添加空格、给每个句子添加一个开始标记和结束标记。
4、数据id化:单词级别的数据id化,把一条句子转化为数字序列,并且后续做一个padding处理。
二、build model:
三、encoder构建:通过学习输入,将其编码成一个固定大小的中间状态向量,再将中间状态向量传递给decoder。这个过程称其为编码。
四、decoder构建:decoder通过对中间状态向量的学习来进行输出,得到输出序列,这个过程称其为解码。需要注意的是:中间状态向量只是作为初始状态参与decoder的构建,后面的运算都和中间状态向量无关。
五、attention机制的构建:
1、如果不引入attention机制的话,Encoder-Decoder结构在编码和解码阶段始终由一个中间状态向量来联系,这就造成了在编码阶段由于信息压缩到中间状态向量中而导致的部分信息丢失,在解码阶段时,在后边的序列容易丢失细节信息。
2、在编码阶段加入Attention模型,它不再要求编码器将所有输入信息都编码进一个固定长度的向量之中。此时编码器对源数据序列进行数据加权变换编码成一个向量的序列,而在解码的时候,每一步都会选择性的从向量序列中挑选一个子集进行进一步处理。
3、Bahdanau注意力公式:
EO: (Encoder_Output) encoder各个位置的输出。
H: (Hidden_State) decoder某一步的隐含状态。
FC: 全连接层
X: decoder的一个输入
score = FC(tanh(FC(EO)+FC(H)))
4、总结:加入了Attention机制以后,encoder不仅仅是把encoder最后一个节点的hidden state提供给decoder,而是提供了更多的数据给到了decoder,它采取了一种选择机制,把最符合的hidden state选出来,这就是注意力公式要干的事情。
六、损失、优化器:
七、train
八、评估
seq2seq:
1、Encoder-Deconder结构
缺点:
1、定长编码是信息瓶颈
2、长度越长,前面输入RNN的信息就被越稀释。
Transformer结构:
1、Transformer整体结构:
Transformer也是一个基于Encoder-Decoder框架的模型。
2、Inputs输入
输入分词后的向量,比如说word2vec, GloVe, one-hot编码。输入inputs embedding后需要给每个word的词向量添加位置编码,这样可以更好的理解句子的意思。位置编码与词向量相加,因为拼接的话维度变得特别大,影响效率,而且和相加的效果差不多,所以选择相加。
3、Encoder部分
Encoder block由6个encoder堆叠而成。每一个Encoder的内部结构如上图所示,主要是由多头注意力和全连接神经网络构成的。多头注意力机制是使用多组Wq,Wk,Wv得到多组Query,Keys,Values,而self-Attention只使用了一组。
word2vec:
参考文章:
Bahdanau Attention与Luong Attention.
十一、常用的一些评价指标
实习、
文本分类小项目:
文本表示常用方法:是在分词后进行的步骤。
0ne-hot编码、 0和1组成的稀疏高阶矩阵,浪费空间,效率低下,无法表达相似性。
tf-idf、使用tf-idf(词频–逆文件频率)处理,评估一个词对于一个文件集中的一个文件的重要程度。
核心思想:一个词语在一篇文章中出现次数越多, 同时在所有文档中出现次数越少, 越能够代表该文章,认为该词具有很好的类别区分能力,可以用来分类。
TF:词频,表现词条在文本中出现的频率,被归一化,防止偏向长的文件。
tf = 某一类中词条w出现的数目/某一类中所有的词条数目
IDF:逆文件频率
idf = log(文档总数/(包含该词的文档数+1)) —防止出现全0的情况。
某一特定词语的IDF,可以由总文件数目除以包含该词语的文件的数目,再将得到的商取对数得到。
公式: TF*IDF
API:from sklearn.feature_extraction.text import TfidfVectorizer
缺点:
每次增加语料时,需要重新计算,不适合增量编写
没有考虑特征词的位置对文本的区分程度,词条出现在不同位置,其重要性程度是不一样的。
Word2vec。