一、条件随机场(CRF)简介:
条件随机域(场)(conditionalrandom fields,简称 CRF,或CRFs),是一种判别式概率模型,是随机场的一种。条件随机场(CRF)由Lafferty等人于2001年提出,结合了最大熵模型和隐马尔可夫模型的特点,是一种无向图模型,近年来在分词、词性标注和命名实体识别等序列标注任务中取得了很好的效果。常用于标注或分析序列资料,如自然语言文字或是生物序列。如同马尔可夫随机场,条件随机场为具有无向的图模型,无向图中的顶点代表随机变量,顶点间的连线代表随机变量间的相依关系,在条件随机场中,随机变量 Y 的分布为条件机率,给定的观察值则为随机变量 X。原则上,条件随机场的图模型布局是可以任意给定的,一般常用的布局是链结式的架构,链结式架构不论在训练(training)、推论(inference)、或是解码(decoding)上,都存在效率较高的算法可供演算。
CRF被用于中文分词和词性标注等词法分析工作,一般序列分类模型常常采用隐马尔可夫模型(HMM),像基于类的中文分词。但隐马尔可夫模型中存在两个假设:输出独立性假设和马尔可夫性假设。其中,输出独立性假设要求序列数据严格相互独立才能保证推导的正确性,而事实上大多数序列数据不能被表示成一系列独立事件。而条件随机场则使用一种概率图模型,具有表达长距离依赖性和交叠性特征的能力,能够较好地解决标注(分类)偏置等问题的优点,而且所有特征可以进行全局归一化,能够求得全局的最优解。
缺点:
模型复杂,算法时间长。
二、条件随机场的应用举例:
(1)定义一个参数解析器,并将C值作为输入参数。 C是一个超参数,该参数控制你想要的模
型的具体程度,而不会失去一般化的能力:
def build_arg_parser():
parser =argparse.ArgumentParser(description='Trains the CRF classifier')
parser.add_argument("--c-value", dest="c_value",required=False, type=float,
default=1.0,help="The C value that will be used for training")
return parser
args = build_arg_parser().parse_args()
c_value = args.c_value
(2)加载字母数据集。这个数据集包括分割的字母以及和其相关的特征向量。因为已经有了
特征向量,所以不需要分析图像。每个单词的首字母都已被去掉,所以剩下的字母都是小写字母。
加载数据和标签到其相应的变量:
letters = load_letters()
X, y, folds = letters['data'], letters['labels'], letters['folds']
X, y = np.array(X), np.array(y)
(3)将数据分割为训练集和测试集:
X_train, X_test = X[folds == 1], X[folds != 1]
y_train, y_test = y[folds == 1], y[folds != 1]
(4)构建模型:
clf=FrankWolfeSSVM(model=ChainCRF(), C=c_value, max_iter=50)
(5)模型器拟合数据, 评价CRF模型的性能:
print("\nTraining the CRF model...")
clf.train(X_train, y_train)
score = clf.evaluate(X_test, y_test)
print("\nAccuracy score =", str(round(score*100, 2)) + '%')
(6)这些字母在编号的数组中被索引。
alphabets = 'abcdefghijklmnopqrstuvwxyz'
output = ''
for i in y_test[0]:
output += alphabets[i]
print("\nTrue label =", output)
(7)预测数据, 输入一个随机测试向量,并用这个模型预测输出:
predicted_output = clf.predict([X_test[0]])[0]
print("Predicted output =", decoder(predicted_output))