HMM VS CRF

一、区别

  1. HMM是生成模型(由数据学习联合概率分布P(X,Y), 然后由P(Y|X)=P(X,Y)/P(X)求出概率分布P(Y|X)作为预测的模型),CRF是判别模型(由数据直接学习决策函数Y=f(X)或条件概率分布P(Y|X)作为预测模型)
  2. HMM是概率有向图CRF是概率无向图
  3. CRF由于得分进行全局softmax归一化,所以得到的是全局最优值;并且解决了最大熵马尔可夫模型(MEMM)中的标注偏置问题(MEMM只去除了观测独立性假设,没有去除齐次马尔科夫链假设 Thus, states with a single outgoing transition effectively ignore their observations. More generally, states with low-entropy next state distributions will take little notice of observations)。
      局部归一化,局部最优。
  • CRF打破了HMM的两种假设:
    • 齐次马尔科夫链假设。即任意时刻的隐藏状态只依赖于它前一个隐藏状态;
    • 观测独立性假设。即任意时刻的观察状态只仅仅依赖于当前时刻的隐藏状态
  • CRF可以定义数量更多,种类更丰富的特征函数,并且加权求和(score)
  • CRF在特征函数中还包含了整条观测序列的信息,都可以被利用
  • 任意的HMM都可以由CRF表达出来

二、HMM

隐马尔可夫模型 HMM

三、CRF

CRF条件随机场

四、Refs

生成模型和判别模型

0

生成模型和判别模型

一、判别方法

1.定义

由数据直接学习决策函数Y=f(X)或者条件概率分布P(Y|X)作为预测的模型,即判别模型。基本思想是有限样本条件下建立判别函数,不考虑样本的产生模型,直接研究预测模型。典型的判别模型包括线性回归逻辑回归K近邻决策树支持向量机、条件随机场最大熵模型提升方法、感知机

  • 决策函数Y=f(X):你输入一个X,它就输出一个Y,这个Y与一个阈值比较,根据比较结果判定X属于哪个类别。例如两类(w1和w2)分类问题,如果Y大于阈值,X就属于类w1,如果小于阈值就属于类w2。这样就得到了该X对应的类别了。
  • 条件概率分布P(Y|X):你输入一个X,它通过比较它属于所有类的概率,然后输出概率最大的那个作为该X对应的类别。例如:如果P(w1|X)大于P(w2|X),那么我们就认为X是属于w1类的。
2.优缺点
  • 优点
    • 直接面对预测,往往学习的准确率更高
    • 由于直接学习 P(Y|X) 或 f(X),可以对数据进行各种程度的抽象,定义特征并使用特征,以简化学习过程
  • 缺点
    • 不能反映训练数据本身的特性。

二、生成模型

1.定义

由数据学习联合概率密度分布P(X,Y),然后求出条件概率分布P(Y|X)作为预测的模型,即生成模型:P(Y|X)= P(X,Y)/ P(X)。典型的生成模型包括朴素贝叶斯、贝叶斯网络隐马尔可夫模型、马尔可夫随机场混合高斯模型

2.优缺点
  • 优点
    • 可以还原出联合概率分布 P(X,Y),判别方法不能
    • 学习收敛速度更快——即当样本容量增加时,学到的模型可以更快地收敛到真实模型
    • 当存在“隐变量”时,只能使用生成模型
  • 缺点
    • 学习和计算过程比较复杂

三、联系

  • 由生成模型可以得到判别模型,但由判别模型得不到生成模型。
  • 当存在“隐变量”时,只能使用生成模型

四、Example

  • 生成式模型举例:利用生成模型是根据山羊的特征首先学习出一个山羊的模型,然后根据绵羊的特征学习出一个绵羊的模型,然后从这只羊中提取特征,放到山羊模型中看概率是多少,在放到绵羊模型中看概率是多少,哪个大就是哪个。
  • 判别式模型举例:要确定一个羊是山羊还是绵羊,用判别模型的方法是从历史数据中学习到模型,然后通过提取这只羊的特征来预测出这只羊是山羊的概率,是绵羊的概率。

五、Refs

0

超参搜索

一、RandomizedSearchCV(常用

每个参数设置都是从可能的参数值的分布中进行取样,优势是:

  • 可以选择独立于参数个数和可能值的预算
  • 添加不影响性能的参数不会降低效率
import numpy as np
import pandas as pd
import xgboost as xgb
from sklearn.grid_search import RandomizedSearchCV
 
 
#导入训练数据
traindata = pd.read_csv("/traindata.txt",sep = ',')
traindata = traindata.set_index('instance_id')
trainlabel = traindata['is_trade']
del traindata['is_trade']
print(traindata.shape,trainlabel.shape)
 
 
#分类器使用 xgboost
clf1 = xgb.XGBClassifier()
 
#设定搜索的xgboost参数搜索范围,值搜索XGBoost的主要6个参数
param_dist = {
        'n_estimators':range(80,200,4),
        'max_depth':range(2,15,1),
        'learning_rate':np.linspace(0.01,2,20),#等差数列
        'subsample':np.linspace(0.7,0.9,20),
        'colsample_bytree':np.linspace(0.5,0.98,10),
        'min_child_weight':range(1,9,1)
        }
 
#RandomizedSearchCV参数说明,clf1设置训练的学习器
#param_dist字典类型,放入参数搜索范围
#scoring = 'neg_log_loss',精度评价方式设定为“neg_log_loss“
#n_iter=300,训练300次,数值越大,获得的参数精度越大,但是搜索时间越长
#n_jobs = -1,使用所有的CPU进行训练,默认为1,使用1个CPU
grid = RandomizedSearchCV(clf1,param_dist,cv = 3,scoring = 'neg_log_loss',n_iter=300,n_jobs = -1)
 
#在训练集上训练
grid.fit(traindata.values,np.ravel(trainlabel.values))
#返回最优的训练器
best_estimator = grid.best_estimator_
print(best_estimator)
#输出最优训练器的精度
print(grid.best_score_)

二、GridSearchCV

遍历多种参数组合,通过交叉验证确定最佳效果参数(平均精度)

import numpy as np
import pandas as pd
import xgboost as xgb
from sklearn.grid_search import GridSearchCV
 
 
#导入训练数据
traindata = pd.read_csv("/traindata_4_3.txt",sep = ',')
traindata = traindata.set_index('instance_id')
trainlabel = traindata['is_trade']
del traindata['is_trade']
print(traindata.shape,trainlabel.shape)
 
 
#分类器使用 xgboost
clf1 = xgb.XGBClassifier()
 
#设定网格搜索的xgboost参数搜索范围,值搜索XGBoost的主要6个参数
param_dist = {
        'n_estimators':range(80,200,4),
        'max_depth':range(2,15,1),
        'learning_rate':np.linspace(0.01,2,20),
        'subsample':np.linspace(0.7,0.9,20),
        'colsample_bytree':np.linspace(0.5,0.98,10),
        'min_child_weight':range(1,9,1)
        }
 
#GridSearchCV参数说明,clf1设置训练的学习器
#param_dist字典类型,放入参数搜索范围
#scoring = 'neg_log_loss',精度评价方式设定为“neg_log_loss“
#n_iter=300,训练300次,数值越大,获得的参数精度越大,但是搜索时间越长
#n_jobs = -1,使用所有的CPU进行训练,默认为1,使用1个CPU
grid = GridSearchCV(clf1,param_dist,cv = 3,scoring = 'neg_log_loss',n_iter=300,n_jobs = -1)
 
#在训练集上训练
grid.fit(traindata.values,np.ravel(trainlabel.values))
#返回最优的训练器
best_estimator = grid.best_estimator_
print(best_estimator)
#输出最优训练器的精度
print(grid.best_score_)
*、自定义评价函数
import numpy as np
from sklearn.metrics import make_scorer
 
def logloss(act, pred):
    epsilon = 1e-15
    pred = sp.maximum(epsilon, pred)
    pred = sp.minimum(1-epsilon, pred)
    ll = sum(act*sp.log(pred) + sp.subtract(1, act)*sp.log(sp.subtract(1, pred)))
    ll = ll * -1.0/len(act)
    return ll
 
#这里的greater_is_better参数决定了自定义的评价指标是越大越好还是越小越好
loss  = make_scorer(logloss, greater_is_better=False)
score = make_scorer(logloss, greater_is_better=True)

三. 启发式搜索

四. 贝叶斯搜索

五. 参考

  1. GridSearchCV 与 RandomizedSearchCV 调参
  2. python机器学习库sklearn——参数优化
  3. RandomizedSearchCV APIGridSearchCV API
  4. Comparing randomized search and grid search for hyperparameter estimation
0