机器学习之经典算法(十一) 条件随机场

    一、条件随机场(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))

你可能感兴趣的:(机器之心,机器学习,修炼之路)