美文网首页北漂少年的生活
基于ml-knn的多标签分类

基于ml-knn的多标签分类

作者: 一心一意弄算法 | 来源:发表于2018-07-01 06:15 被阅读1036次

    首先要区别多分类 和多标签的区别。

    多分类问题:一个样本的类别是多个,比如判别一个未知水果,它可能是苹果,也可能是香蕉,也可能是西瓜。水果的种类的是多样的,但是一个样本只可能是其中一类。
    多标签问题:一个样本包含多个类别。例如评价某个人和善,聪明,懒惰,即这个样本包含多个类别标签,既可以是A也可以是B,类别之间不互斥。

    算法原理

    改进版knn :ml-knn (multi-label knn)

    • 1.通过knn 算法寻找和样本最近的K个样本
    • 2.统计k个样本中每个类别的个数
    • 3.根据第二步的统计,采用 native bayes算法计算每个标签的概率
    • 4.输出类别概率

    算法伪代码:

    code

    (1)-(13)步骤是native bayes 模型训练
    步骤一:由(1)-(2) 统计类别L在样本中的概率。
    s :参数,用于数据平滑,
    m:是标准样本个数。
    p(H^l_1):表示标签L的概率
    \sum_{i=0}^my_x{_i}(l): 表示样本中标签L的个数。

    步骤二:(3)-(13)计算每个样本的K个最近邻中,在样本标签为L的条件下,E^l_j(K个样本中有j个L标签的样本数量)的概率。以及在样本不是标签L的条件下,E^l_j的概率

    步骤三:新样本估计
    y_t = argmax_{b\{0,1\}} P(H^l_b)P(E^l_j|H^l_b)  
    (这里native bayes中的分母省略计算,比较分子大小就够了)
    其中:y_t指的是样本类别向量
    伪代码中r_t就是样本每个类的概率。

    算法简单实践:

    MLkNN 来自于scikit-multilearn库
    库安装:

    pip install scikit-multilearn
    

    数据读取

    import scipy
    import pandas as pd
    from scipy.io import arff
    data, meta = scipy.io.arff.loadarff('/app/jupyter_dir/data/yeast-train.arff')
    df = pd.DataFrame(data)
    df.head()
    
        Att1    Att2    Att3    Att4    Att5    Att6    Att7    Att8    Att9    Att10   ... Class5  Class6  Class7  Class8  Class9  Class10 Class11 Class12 Class13 Class14
    0   0.093700    0.139771    0.062774    0.007698    0.083873    -0.119156   0.073305    0.005510    0.027523    0.043477    ... b'0'    b'0'    b'0'    b'0'    b'0'    b'0'    b'0'    b'0'    b'0'    b'0'
    1   -0.022711   -0.050504   -0.035691   -0.065434   -0.084316   -0.378560   0.038212    0.085770    0.182613    -0.055544   ... b'0'    b'0'    b'1'    b'1'    b'0'    b'0'    b'0'    b'1'    b'1'    b'0'
    2   -0.090407   0.021198    0.208712    0.102752    0.119315    0.041729    -0.021728   0.019603    -0.063853   -0.053756   ... b'0'    b'0'    b'0'    b'0'    b'0'    b'0'    b'0'    b'1'    b'1'    b'0'
    3   -0.085235   0.009540    -0.013228   0.094063    -0.013592   -0.030719   -0.116062   -0.131674   -0.165448   -0.123053   ... b'0'    b'0'    b'0'    b'0'    b'0'    b'0'    b'0'    b'1'    b'1'    b'1'
    4   -0.088765   -0.026743   0.002075    -0.043819   -0.005465   0.004306    -0.055865   -0.071484   -0.159025   -0.111348   ... b'0'    b'0'    b'0'    b'0'    b'0'    b'0'    b'0'    b'0'    b'0'    b'0'
    
    

    这里用yeast的数据做测试,可以看出样本数据中有14个类别。

    数据切分

    from sklearn.model_selection import train_test_split
    
    X = df.iloc[:,0:103].values
    y = df.iloc[:,103:117].values
    
    X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=0)
    

    数据类型转换

    import numpy as np
    y_train = y_train.astype(np.float64)
    y_test = y_test.astype(np.float64)
    

    模型训练及预测

    from skmultilearn.adapt import MLkNN
    from sklearn.metrics import accuracy_score 
    classifier = MLkNN(k=20)
    # train
    classifier.fit(X_train, y_train)
    # predict
    predictions = classifier.predict(X_test)
    

    准确率统计

    z = predictions.toarray()
    [rows, cols] = y_test.shape
    zzz = 0
    for i in range(rows - 1):
        for j in range(cols - 1):
            if y_test[i, j] == z[i, j]:
                zzz += 1
    zzz / (rows*cols) 
    

    实验基于jupyter,下载:
    链接:链接:https://pan.baidu.com/s/1SLo5nZjvrVrJwqgoEvOpoQ 密码:qge8

    点个赞呗~老哥们。

    参考文献

    论文地址:http://cse.seu.edu.cn/PersonalPage/zhangml/files/ML-kNN%20a%20lazy%20learning%20approach%20to%20multi-label%20learning.pdf

    相关文章

      网友评论

        本文标题:基于ml-knn的多标签分类

        本文链接:https://www.haomeiwen.com/subject/lulbyftx.html