Focal loss主要是为了解决one-stage目标检测中正负样本比例严重失衡的问题。该损失函数降低了大量简单负样本在训练中所占的权重,也可理解为一种困难样本挖掘。
损失函数形式:Focal loss是在交叉熵损失函数基础上进行的修改,首先回顾二分类交叉上损失:
是经过激活函数的输出,所以在0-1之间。可见普通的交叉熵对于正样本而言,输出概率越大损失越小。对于负样本而言,输出概率越小则损失越小。此时的损失函数在大量简单样本的迭代过程中比较缓慢且可能无法优化至最优。
首先在原有的基础上加了一个因子,其中gamma>0使得减少易分类样本的损失。使得更关注于困难的、错分的样本。
例如gamma为2,对于正类样本而言,预测结果为0.95肯定是简单样本,所以(1-0.95)的gamma次方就会很小,这时损失函数值就变得更小。而预测概率为0.3的样本其损失相对很大。对于负类样本而言同样,预测0.1的结果应当远比预测0.7的样本损失值要小得多。对于预测概率为0.5时,损失只减少了0.25倍,所以更加关注于这种难以区分的样本。这样减少了简单样本的影响,大量预测概率很小的样本叠加起来后的效应才可能比较有效。
此外,加入平衡因子alpha,用来平衡正负样本本身的比例不均:
只添加alpha虽然可以平衡正负样本的重要性,但是无法解决简单与困难样本的问题。
lambda调节简单样本权重降低的速率,当lambda为0时即为交叉熵损失函数,当lambda增加时,调整因子的影响也在增加。实验发现lambda为2是最优。
正则化(L1正则化,L2正则化),扩增数据集,特征的筛选,early stopping,dropout
1.预测后一半;2.日向前链
解析:传统的交叉验证由于假定样本独立同分布,因此随机打乱分为训练集和验证集。但是对于时间序列来讲,需要考虑序列间的时间依赖。
上下采样法。
好的指标:ROC和AUC、F值、G-Mean;不好的指标:Precision、Recall
迁移学习就是把之前训练好的模型直接拿来用,可以充分利用之前数据信息,而且能够避免自己实验数据量较小等问题。简单来讲就是给模型做初始化,初始化的数据来自于训练好的模型。
使用正确的评估标准,当数据不平衡时可以采用精度,调用度,F1得分,MCC,AUC等评估指标。
重新采样数据集,如欠采样和过采样。欠采样通过减少冗余类的大小来平衡数据集。当数据量不足时采用过采样,尝试通过增加稀有样本的数量来平衡数据集,通过使用重复,自举,SMOTE等方法生成新的样本。
以正确的方式使用K-fold交叉验证,组合不同的重采样数据集,对多数类进行聚类。
Auc体现出容忍样本倾斜的能力,只反应模型对正负样本排序能力的强弱,而其直观含以上是任意取一个正样本和负样本,正样本的得分大于负样本的概率。
M为正样本数,N为负样本数。Rank的值代表能够产生前大后小这样的组合数,但是其中包含了(正,正)的情况,所以要减去正例的个数所以可得上述公式。
生成模型是先从数据中学习联合概率分布,然后利用贝叶斯公式求得特征和标签对应的条件概率分布。判别模型直接学习条件概率分布,直观的输入什么特征就预测可能的类别。
正则化(L1正则化,L2正则化),扩增数据集,特征的筛选,earlystopping,dropout
特征选择是一个重要的数据预处理过程,主要有两个原因:一是减少特征数量、降维,使模型泛化能力更强,减少过拟合;二是增强对特征和特征值之间的理解。
常见的特征选择方式:
1)、去除方差较小的特征
2)、正则化。L1正则化能够生成稀疏的模型。L2正则化的表现更加稳定,由于有用的特征往往对应系数非零。
3)、随机森林,对于分类问题,通常采用基尼不纯度或者信息增益,对于回归问题,通常采用的是方差或者最小二乘拟合。一般不需要feature engineering、调参等繁琐的步骤。它的两个主要问题,1是重要的特征有可能得分很低(关联特征问题),2是这种方法对特征变量类别多的特征越有利(偏向问题)。
4)、稳定性选择。是一种基于二次抽样和选择算法相结合较新的方法,选择算法可以是回归、SVM或其他类似的方法。它的主要思想是在不同的数据子集和特征子集上运行特征选择算法,不断的重复,最终汇总特征选择结果,比如可以统计某个特征被认为是重要特征的频率(被选为重要特征的次数除以它所在的子集被测试的次数)。理想情况下,重要特征的得分会接近100%。稍微弱一点的特征得分会是非0的数,而最无用的特征得分将会接近于0。
1).在训练和建立模型的时候,从相对简单的模型开始,不要一开始就把特征做的非常多,模型参数跳的非常复杂。
2).增加样本,要覆盖全部的数据类型。数据经过清洗之后再进行模型训练,防止噪声数据干扰模型。
3).正则化。在模型算法中添加惩罚函数来防止过拟合。常见的有L1,L2正则化。
4).集成学习方法bagging(如随机森林)能有效防止过拟合
5).减少特征个数(不是太推荐)注意:降维不能解决过拟合。降维只是减小了特征的维度,并没有减小特征所有的信息。
L范数(L1 norm)是指向量中各个元素绝对值之和,也有个美称叫“稀疏规则算子”(Lasso regularization)。比如 向量A=[1,-1,3],那么A的L1范数为 |1|+|-1|+|3|.简单总结一下就是: L1范数: 为x向量各个元素绝对值之和。 L2范数:为x向量各个元素平方和的1/2次方,L2范数又称Euclidean范数或者Frobenius范数Lp范数:为x向量各个元素绝对值p次方和的1/p次方.在支持向量机学习过程中,L1范数实际是一种对于成本函数求解最优的过程,因此,L1范数正则化通过向成本函数中添加L1范数,使得学习得到的结果满足稀疏化,从而方便人类提取特征,即L1范数可以使权值稀疏,方便特征提取。 L2范数可以防止过拟合,提升模型的泛化能力。L1和L2的差别,为什么一个让绝对值最小,一个让平方最小,会有那么大的差别呢?看导数一个是1一个是w便知, 在靠进零附近, L1以匀速下降到零, 而L2则完全停下来了. 这说明L1是将不重要的特征(或者说, 重要性不在一个数量级上)尽快剔除, L2则是把特征贡献尽量压缩最小但不至于为零. 两者一起作用, 就是把重要性在一个数量级(重要性最高的)的那些特征一起平等共事(简言之, 不养闲人也不要超人)。
基于信息增益最大的作为最优特征,以此为决策树的根节点
特征工程包括数据与特征处理、特征选择和降纬三部分。数据与特征处理包括:
1.数据选择、清洗、采样
数据格式化;
数据清洗,填充缺失值、去掉脏数据,将不可信的样本丢掉,缺省值极多的字段考虑不用;
采样:针对正负样本不平衡的情况,当正样本远大于负样本时,且量都很大时,使用下采样,量不大时,可采集更多的数据或oversampling或修改损失函数;采样过程中可利用分层抽样保持不同类别数据的比例。
2.不同类型数据的特征处理
数值型:幅度调整/归一化、log等变化、统计值(例如max、min、mean、std)、离散化、分桶等
类别型:one-hot编码等
时间型:提取出连续值的持续时间和间隔时间;提取出离散值的“年”、“月”、“日”、“一年中哪个星期/季度”、“一周中的星期几”、“工作日/周末”等信息
文本型:使用If-idf特征
统计型:加减平均、分位线、次序、比例
意义:
对数据进行预处理,可提高数据质量,提高挖掘质量。对数据进行清洗可填充缺失值、光滑噪声数据,识别和删除离群点数据,保证数据的一致性;
使用正确的采样方法可解决因数据不平衡带来的预测偏差;
对不同的数据类型进行不同的特征处理有助于提高特征的可用性,例如对数值型数据进行归一化可将数据转化到统一量纲下;对类别型数据,可用one-hot编码方法将类别数据数字化,数字化特征之后可更用来计算距离、相似性等;可从时间型数据当中提取中更多的时间特征,例如年、月和日等,这些特征对于业务场景以及模型的预测往往有很大的帮助。统计型特征处理有助于从业务场景中挖掘更丰富的信息。
特征选择包括:
1.Filter:使用方差、Pearson相关系数、互信息等方法过滤特征,评估单个特征和结果值之间的相关程度,留下Top相关的特征部分。
2.Wrapper:可利用“递归特征删除算法”,把特征选择看做一个特征子集搜索问题,筛选各种特征子集,用模型评估效果。
3.Embedded:可利用正则化方式选择特征,使用带惩罚项的基模型,除了选择出特征外,同时也进行了降纬。
意义:
-剔除对结果预测不大的特征,减小冗余,选择有意义的特征输入模型,提高计算性能。
降维:
方法:主成分分析法(PCA)和线性判别分析(LDA)
意义:通过PCA或LDA方法,将较高纬度样本空间映射到较低维度的样本空间,从而达到降纬的目的,减少模型的训练时间,提高模型的计算性能。
收集数据
总所周知,数据挖掘模型中非常重要的部分是训练模型,训练集与测试集便是整个数据挖掘过程中花费时间最多的过程。数据集通过有如下的一些途径获得:
经典数据集:Python NLTK 便提供了非常多经典的数据集。很多数据集都是手工标注而成,所以使用的时候不得不感叹工程的浩大。例如NLP中使用的Penn TreeBank,有兴趣的同学可以看看他们的论文《Building a Large Annotated Corpus of English: The Penn TreeBank》,那简直就是一部辛酸史啊!
从网页上抓取:直接动手写一个爬虫爬取特定的网页不难,通过正则表达式就能够将有效的内容提取出来;当然,发扬拿来主义精神的话,我们可以使用Python中一些优秀的库,比如scrapy,beautifulsoup 等等。
从日志、已有文件中分析:如果是海量数据的话可以使用hadoop这样的系统。结合传统SQL中的一些特殊功能,例如Partition,有时会有不错的效果,不过最多压缩空间、缩减特征再用SQL处理。
其他网络数据集:Stanford Large Network Dataset Collectionm,100+ Interesting Data Sets for Statistics
预处理
如果是网页内容,首先需要去掉Html Tag,lxml和html5lib是比较有名的Python库,beautifulsoup也对他们做了一层封装。不过别忘了,Python本身也自带了sgmllib这样的基本可扩展的解析器。如果是有特别的处理,其实正则表达式也是不错的选择。
处理编码,由于我主要是处理英文的数据,这一步基本也跳过了。
将文档分割成句子(可选)。很多时候我们采用的是词袋模型(bag of words),所以是否分割成句子也无所谓。比较简单的方法就是Python NLTK中的sent_tokenize()函数,用的是punkt算法,论文在这里。
将句子分割成词。首先用正则表达式可以自己完成;如果要利用已有工具,Python NLTK中的word_tokenize(),这个方式就是前文提到的Penn TreeBank语料库所使用的分词方法。听起来是不是很高大上,我是不会告诉你其实它也是正则表达式实现的,想知道具体实现,戳这里。分词其实主要干了这么几个事:1)将’分开. don't -> do n't, they'll -> they 'll; 2)将大部分标点当作单独的一个词; 3)将后一位是逗号或者引号的词分开; 4)单独出现在一行的句号分开。中文分词区别比较大,可以采用斯坦福或者ICTCLAS(中科院背景)的方案。
拼写错误纠正。推荐pyenchant,非常喜欢,因为简洁到四句语句就能完成。Windows 8中操作系统也直接提供了拼写检查的COM端口,不过就得多花时间研究啦。
POS Tagging(根据实际应用)。还是Nltk,首页就有介绍;斯坦福也提供了这类工具。这一块属于NLP的范畴,还是Parsing等应用,要了解NLP原理推荐Coursera上一门不错的课程Natural Language Processing
去掉标点。正则表达式即可,有的时间非常短的单词也可以一起去掉,len<3的常见的选择
去掉非英文字符的词(根据实际应用决定)。
转换成小写。
去掉停用词。就是在各种句子中都经常出现的一些词,I、and什么的。NLTK有一个Stopwords。Matthew L. Jockers提供了一份比机器学习和自然语言处理中常用的停词表更长的停词表。中文停用词戳这里。什么?你问我停用词怎么找到的,我想大概是IDF这样的算法吧。
词型转换。简单来讲,我们希望do、did、done都能统一的返回do。第一种方法叫stem,Porter是比较常见的一种基于规则的算法,网页有snowball工具,也是它的论文。Porter的结果差强人意,单词末尾有e、y的,基本上stem之后都不间了,例如replace->replac;末尾有重复单词的,基本只剩一个了,例如ill->il。NLTK中也有Stem库,算法应该是类似的。第二种方法叫lemmatization,就是基于词典做词型转换,NLTK的Stem库中便有WordNetLemmatizer可以使用。
去掉长度过小的词(可选)。如果之前做了,这里要再做一次,因为stem会改变词型。
重新去停用词。理由同上。
特征提取:
1、TF-IDF:
2、词频方法(Word Frequency):
3、文档频次方法(Document Frequency):
4、互信息(Mutual Information):
5、期望交叉熵(Expected Cross Entropy):
6、二次信息熵(QEMI):
7、信息增益方法(Information Gain):
8、x2统计量方法:
9、文本证据权(The Weight of Evidence forText):
10、优势率(Odds Ratio):
11、遗传算法(Genetic Algorithm, GA):
12、主成分分析法(Principal Component Analysis,PCA):
13、模拟退火算法(Simulating Anneal,SA):
14、N—Gram算法
文本建模:
LDA、pLSA、LSA
考虑一个多分类问题,即预测变量y可以取k个离散值中的任何一个.比如一个邮件分类系统将邮件分为私人邮件,工作邮件和垃圾邮件。由于y仍然是一个离散值,只是相对于二分类的逻辑回归多了一些类别。下面将根据多项式分布建模。
考虑将样本共有k类,每一类的概率分别为,由于
,所以通常我们只需要k-1个参数
即可
,
为了推导,引入表达式:
上面T(y)是k-1维列向量,其中y = 1, 2, ...k.
T(y)i 表示向量T(y)的第i个元素。
还要引入表达式,如果大括号里面为真,则真个表达式就为1,否则为0.例如:1{2=3} = 0和1{3=3} = 1.
则上面的k个向量就可以表示为
以为y只能属于某一个类别,于是T(y)中只能有一个元素为1其他元素都为0,可以求出k-1个元素的期望:
其中i = 1,2,...k.则有:
也就容易得出:,由该式和上面使得等式:
一起可以得到:
这个函数就是softmax函数。
然后假设和
具有线性关系,即
于是从概率的角度出发:
其中这个模型就是softmax回归(softmax regression), 它是逻辑回归的泛化。
这样我们的输出:
就是输出了x属于(1,2,...k-1)中每一类的概率,当然属于第k类的概率就是:
下面开始拟合参数
同样使用最大化参数θ的对数似然函数:
这里使用梯度下降和牛顿法均可。
考虑一个多分类问题,即预测变量y可以取k个离散值中的任何一个.比如一个邮件分类系统将邮件分为私人邮件,工作邮件和垃圾邮件。由于y仍然是一个离散值,只是相对于二分类的逻辑回归多了一些类别。下面将根据多项式分布建模。
考虑将样本共有k类,每一类的概率分别为,由于
,所以通常我们只需要k-1个参数
即可
,
为了推导,引入表达式:
上面T(y)是k-1维列向量,其中y = 1, 2, ...k.
T(y)i 表示向量T(y)的第i个元素。
还要引入表达式,如果大括号里面为真,则真个表达式就为1,否则为0.例如:1{2=3} = 0和1{3=3} = 1.
则上面的k个向量就可以表示为
以为y只能属于某一个类别,于是T(y)中只能有一个元素为1其他元素都为0,可以求出k-1个元素的期望:
其中i = 1,2,...k.则有:
就容易得出:,由该式和上面使得等式:
一起可以得到:
这个函数就是softmax函数。
然后假设和
具有线性关系,即
于是从概率的角度出发:
其中这个模型就是softmax回归(softmax regression), 它是逻辑回归的泛化。
这样我们的输出:
就是输出了x属于(1,2,...k-1)中每一类的概率,当然属于第k类的概率就是:
下面开始拟合参数
同样使用最大化参数θ的对数似然函数:
这里使用梯度下降和牛顿法均可。