• keras 的svm做分类


    SVC继承了父类BaseSVC

    SVC类主要方法:

    ★__init__() 主要参数:

    C: float参数 默认值为1.0

    错误项的惩罚系数。C越大,即对分错样本的惩罚程度越大,因此在训练样本中准确率越高,但是泛化能力降低,也就是对测试数据的分类准确率降低。相反,减小C的话,容许训练样本中有一些误分类错误样本,泛化能力强。对于训练样本带有噪声的情况,一般采用后者,把训练样本集中错误分类的样本作为噪声。

    kernel: str参数 默认为‘rbf’

    算法中采用的核函数类型,可选参数有:

    ‘linear’:线性核函数

    ‘poly’:多项式核函数

    ‘rbf’:径像核函数/高斯核

    ‘sigmod’:sigmod核函数

    ‘precomputed’:核矩阵

    具体这些核函数类型,请参考上一篇博客中的核函数。需要说明的是,precomputed表示自己提前计算好核函数矩阵,这时候算法内部就不再用核函数去计算核矩阵,而是直接用你给的核矩阵。核矩阵为如下形式:

    还有一点需要说明,除了上面限定的核函数外,还可以给出自己定义的核函数,其实内部就是用你自己定义的核函数来计算核矩阵。

    degree:int型参数 默认为3

    这个参数只对多项式核函数有用,是指多项式核函数的阶数n

    如果给的核函数参数是其他核函数,则会自动忽略该参数。

    gamma:float参数 默认为auto

    核函数系数,只对‘rbf’,‘poly’,‘sigmod’有效。

    如果gamma为auto,代表其值为样本特征数的倒数,即1/n_features.

    coef0:float参数 默认为0.0

    核函数中的独立项,只有对‘poly’和‘sigmod’核函数有用,是指其中的参数c

    probability:bool参数 默认为False

    是否启用概率估计。 这必须在调用fit()之前启用,并且会fit()方法速度变慢。

    shrinking:bool参数 默认为True

    是否采用启发式收缩方式

    tol: float参数  默认为1e^-3

    svm停止训练的误差精度

    cache_size:float参数 默认为200

    指定训练所需要的内存,以MB为单位,默认为200MB。

    class_weight:字典类型或者‘balance’字符串。默认为None

    给每个类别分别设置不同的惩罚参数C,如果没有给,则会给所有类别都给C=1,即前面参数指出的参数C.

    如果给定参数‘balance’,则使用y的值自动调整与输入数据中的类频率成反比的权重。

    verbose :bool参数 默认为False

    是否启用详细输出。 此设置利用libsvm中的每个进程运行时设置,如果启用,可能无法在多线程上下文中正常工作。一般情况都设为False,不用管它。

    max_iter :int参数 默认为-1

    最大迭代次数,如果为-1,表示不限制

    random_state:int型参数 默认为None

    伪随机数发生器的种子,在混洗数据时用于概率估计。

    ★fit()方法:用于训练SVM,具体参数已经在定义SVC对象的时候给出了,这时候只需要给出数据集X和X对应的标签y即可。

    ★predict()方法:基于以上的训练,对预测样本T进行类别预测,因此只需要接收一个测试集T,该函数返回一个数组表示个测试样本的类别。

    ★属性有哪些:

    svc.n_support_:各类各有多少个支持向量

    svc.support_:各类的支持向量在训练样本中的索引

    svc.support_vectors_:各类所有的支持向量

     

    # -*- coding:utf-8 -*-

    from sklearn.svm import SVC

    import matplotlib.pyplot as plt

    import numpy as np

    X=np.array([[1,1],[1,2],[1,3],[1,4],[2,1],[2,2],[3,1],[4,1],[5,1],

           [5,2],[6,1],[6,2],[6,3],[6,4],[3,3],[3,4],[3,5],[4,3],[4,4],[4,5]])

    Y=np.array([1]*14+[-1]*6)

    T=np.array([[0.5,0.5],[1.5,1.5],[3.5,3.5],[4,5.5]])

    svc=SVC(kernel='poly',degree=2,gamma=1,coef0=0)

    svc.fit(X,Y)

    pre=svc.predict(T)

    print pre

    print svc.n_support_

    print svc.support_

    print svc.support_vectors_

    运行结果:

    [ 1  1 -1 -1]      #预测结果

    [2 3]            #-1类和+1类分别有2个和3个支持向量

    [14 17  3  5 13] #-1类支持向量在元训练集中的索引为14,17,同理-1类支持向量在元训练集中的索引为3,5,13

    [[ 3.  3.]    #给出各支持向量具体是哪些,前两个是-1类的

     [ 4.  3.]

     [ 1.  4.]   #后3个是+1的支持向量

     [ 2.  2.]

     [ 6.  4.]]

    结果如图所示。

     

    #参数的网格扫描

    # Train a SVM classification model
     
    print("Fitting the classifier to the training set")
    t0 = time()
    param_grid = {'C': [1e35e31e45e41e5],
                  'gamma': [0.00010.00050.0010.0050.010.1], }
    clf = GridSearchCV(SVC(kernel='rbf', class_weight='balanced'), param_grid)
    clf = clf.fit(X_train_pca, y_train)
    print("done in %0.3fs" % (time() - t0))
    print("Best estimator found by grid search:")
    print(clf.best_estimator_)
     
     
     

    Keras + 预训练好Word2Vec模型做文本分类核心解释

    现在网上有一些预先训练好的Word2Vec模型, 比如Glove, Google-News以及我最喜欢的FastText,都有各自使用大数据训练出来的Word2Vec模型。 根据不同的业务, 也可以自己搜集语料库训练Word2Vec.

    关于如何使用Keras加上预训练好的W2V模型, 具体可以参考官网教程: Using pre-trained word embeddings in a Keras model

    篇幅比较长, 写得“太详细”了。 不过核心就在下面一行代码: ( Example Code on GitHub )

    keras.layers import Embedding
     
    embedding_layer = Embedding(len(word_index) + 1,
                                EMBEDDING_DIM,
                                weights=[embedding_matrix],
                                input_length=MAX_SEQUENCE_LENGTH,
                                trainable=False)

    我们一点点来解释:

    len(word_index)+1

    word_index : 表示从语料库之中保留多少个单词。 因为Keras需要预留一个全零层, 所以+1

    有的代码使用num_words来表示len(word_index)

    word_index 又是如何得到的?

    tokenizer = Tokenizer(num_words=MAX_NB_WORDS)
    tokenizer.fit_on_texts(texts)
    sequences = tokenizer.texts_to_sequences(texts)
     
    word_index = tokenizer.word_index
    

    即:使用Tokenizer,从语料库之中训练(fit_on_texts)之后得到的

    EMBEDDING_DIM

    即Word2Vec模型的维度。 比如你使用的是Glove_840B_300d, 那么EMBEDDING_DIM=300

    weights=[embedding_matrix]

    这一个参数, 应该是最关键的地方了。 weights,即权重。 权重的来源,embedding_matrix又是如何得来的?

    思路大致如下:

    (1) 构建一个[num_words, EMBEDDING_DIM]的矩阵

    (2) 遍历word_index。 将word在W2V模型之中对应vector复制过来。

    换个方式说:

    • embedding_matrix 是原始W2V的子集
    • 排列顺序按照Tokenizer在fit之后的词顺序。作为权重喂给Embedding Layer

    input_length=MAX_SEQUENCE_LENGTH

    我们输入的语料,长短不一。 有的比较长, 有的比较短。

    在预处理的时候, 我们必经的一个步骤就是pad_sequence:

    data = pad_sequences(sequences, maxlen=MAX_SEQUENCE_LENGTH)
    

    上面的解释只是为了更好的让自己以及给位读者能更清楚的知道Keras是如何跟Pre-trained Word Embedding 对接的。

    其实最好的方式还是亲自把原文博客之中的代码跑一遍, 然后可以按照笔者刚才的思路回过头来看代码。

    本文并不能代替各位读者的亲身实践。

    本文原创, 原文链接:

    http://www.flyml.net/2017/11/26/deepnlp-keras-pre-trained-word2vec-explaination

     
  • 相关阅读:
    vim中字符串的替换
    利用nginx 来实现内网yum源(反向代理)
    linux下分卷压缩,合并解压的3种方法
    Lua io.lines()
    Springboot入门:
    GitHub起步---创建第一个项目
    常用的git命令
    Linux下安装Git
    Mysql连接报错:1130-host ... is not allowed to connect to this MySql server如何处理
    windows下开启远程连接Mysql
  • 原文地址:https://www.cnblogs.com/www-caiyin-com/p/8099885.html
Copyright © 2020-2023  润新知