日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

【论文复现与改进】针对弱标注数据多标签矩阵恢复问题,改进后的MCWD算法,让你的弱标注多标签数据赢在起跑线上

發布時間:2025/3/8 编程问答 9 豆豆
生活随笔 收集整理的這篇文章主要介紹了 【论文复现与改进】针对弱标注数据多标签矩阵恢复问题,改进后的MCWD算法,让你的弱标注多标签数据赢在起跑线上 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

改進后的MCWD算法,讓你的弱標注多標簽數據贏在起跑線上

  • 前言
  • MCWD算法
    • 算法展示
      • 算法改進
      • 實現代碼
  • 實驗結果
  • 總結


前言

最近刷完了李航老師的《統計學習與方法》,手癢到又想復現幾個算法,正好碰上在云音樂的云村視頻標簽運維標注不完全問題,也算是弱標注數據吧,之前這比數據作了多標簽分類,盡管特征上線后各項數據都有所提升,但總感覺用神經網絡直接對弱標簽數據進行多標簽分類很不舒服。
基于以下兩個思考點:

  • 存在標簽缺失的問題,神經網絡的意識在于我竟可能相信你給我的數據都是準確的,某個樣本有某個標簽是準確的,沒有某個標簽也是準確的。這會導致對于一些有缺失的標簽,盡管網絡見過相似的特征,但擬合的標簽組卻大不相同,無法有效學習到標簽與特征的關系。
  • 當標簽缺失情況較少,而樣本數據量足夠多時,神經網絡確實能比較好的應付臟數據帶來的錯誤信息,但是對于那些本來就很少被標注,而且缺失情況較多的標簽,最后模型在推理時,該類標簽的產出也會非常稀有,預測不準確。盡管我們在最后加入了先驗:即有效標注越少的標簽越有可能被遺漏,對每個標簽結果都乘以其IDF來糾正,但效果不是非常明顯。這就導致最后輸出的樣本標簽區分度較低,作為特征效果較差。
  • 比較明顯的問題:無法考慮標簽之間的關聯性,在MLOG方面,舉例來說:風景標簽與拍攝標簽具有較強的關聯性,女團標簽與舞蹈、演唱等關聯性較強,而神經網絡無法利用這一信息。這個問題對于文本多標簽分類任務已經有了一些解決方案,詳情見論文:A Deep Reinforced Sequence-to-Set Model for Multi-Label Text Classification

  • MCWD算法

    其實在尋找辦法的過程中也看到了周志華團隊的《Learning from Semi-Supervised Weak-Label Data》無奈其中數學公式復雜,盡管看懂了原理,但用python實現起來還是有一定的難度。

    最后將目標鎖定在了《針對弱標記數據的多標簽分類算法(王晶晶,楊有龍)》(原文請大家自行搜索)文章利用了樣本間的加權KNN + 標簽相關性的二階策略 對弱標注數據的標簽矩陣進行恢復,再通過多標簽分類算法進行標注。

    算法展示

    原論文中算法具體步驟如下:

    算法改進

  • 引入先驗,適當增加隨機的不相關標簽數量: 在算法初始化第二步中,論文對于初始標簽矩陣 C 中的每個標簽 j ,在 C中隨機選擇 pj 個 Cij = 0 的實例,同時將選定實例的 Cij 值由原來的0變為?1,其中 pj 是每個標簽 j 中所有相關標簽的總數目。目的是為了,在訓練數據的標簽信息中添加一些不相關的標簽信息,從而將缺失標簽和不相關標簽進行有效區分。但在復現過程中,發現對于稀疏的標簽,往往由于初始的不相關標簽信息不足,容易導致在迭代過程中過分補全。根據上述即有效標注越少的標簽其本身先驗概率也越低,我將該Pj值調整為—不包含該標簽的樣本數量 / n ( n為超參數,在實驗過程中以 4 為佳)
  • 在整體迭代結束后根據權重矩陣Wij來有選擇的對Cij進行恢復,而是不論文中直接取sign(Cij),Wij * Cij 值高說明該標簽越置信,而對于 Wij*Cij 值較低的,傾向于重置為0,讓之后的標簽相關矩陣去學習。較好的抑制算法過擬合。此處加入 閾值w(超參)
  • 以及部分對原論文不合理之處的修改,詳情見代碼。
  • 實現代碼

    import numpy as np import pandas as pd from sklearn.metrics import f1_score,hamming_lossdef data_get_2(path,p):data = pd.read_csv(path)feature = np.array(data.iloc[:,:103])tag = np.array(data.iloc[:,103:])real_tag = tag.copy()for i in range(len(tag)):if len(np.where(tag[i,:] == 1)[0]) > p:index_list = np.random.choice(np.where(tag[i,:] == 1)[0],len(np.where(tag[i, :] == p)[0])-p,replace=False)tag[i,:][index_list] = 0'''隨機drop掉每個樣本的標簽,至每個樣本最多擁有p個標簽。'''return feature,tag,real_tagdef data_get_3(path,p):data = pd.read_csv(path)feature = np.array(data.iloc[:,1:1187])tag = np.array(data.iloc[:,1187:])real_tag = tag.copy()for i in range(len(tag)):if len(np.where(tag[i,:] == 1)[0]) > p:index_list = np.random.choice(np.where(tag[i,:] == 1)[0],len(np.where(tag[i, :] == p)[0])-p,replace=False)tag[i,:][index_list] = 0return feature,tag,real_tagclass MCWD:def __init__(self,e=0.8,c=0.2,k_t=10,s=1,w_e=0.3,rate=0.5):self.e = eself.c = cself.k_t = k_tself.s = sself.w_e = w_eself.rate = ratedef standetlize(self):'''涉及到距離計算,需要將特征標準化'''for i in range(self.feature_dim):mean = np.mean(self.feature[:,i])sii = 1/(self.sample_num-1) * np.sum((self.feature[:,i] - mean)**2)self.feature[:,i] = (self.feature[:,i]-mean)/siidef add_nagtive_tag(self):'''訓練數據的標簽信息中添加一些不相關的標簽信息'''for j in range(self.tag_c):zeros_way = np.where(self.old_tag_list[:,j] == 0)[0]pj = int(len(zeros_way) * self.rate)if len(zeros_way) < pj:index_list = zeros_wayelse:index_list = np.random.choice(np.where(self.old_tag_list[:,j] == 0)[0],pj,replace=False)self.tag_list[:,j][index_list] = -1def cauclate_dis(self,x1,x2):return np.sum(abs(x1-x2)**2)**(1/2)def get_dis_matrix(self):# self.dis_matrix = np.zeros((self.sample_num,self.sample_num))# for i in range(self.sample_num):# print(i)# for j in range(self.sample_num):# if i < j:# dis = self.cauclate_dis(self.feature[i],self.feature[j])# self.dis_matrix[i][j] = dis# self.dis_matrix[j][i] = dis'''快速計算樣本之間的距離矩陣'''G = np.dot(self.feature, self.feature.T)H = np.tile(np.diag(G), (self.sample_num, 1)) # n rows, 1 for each rowD = H + H.T - G * 2self.dis_matrix = np.sqrt(D)def one_iter(self,t):n_near = t * self.k_tfor index in range(self.sample_num):k_near_index = self.dis_matrix[index].argsort()[1:n_near+1]l_w = np.abs(self.tag_W[k_near_index])t_l = self.tag_list[k_near_index]self.tag_list[index] = np.sum(l_w * t_l,0)/(np.sum(l_w,0)+1e-8) #[-1,1]for index in range(self.sample_num):for j in range(self.tag_c):qij = self.tag_list[index,j]wij = self.tag_W[index,j]if np.sign(qij) == np.sign(wij) and np.abs(qij) > self.e and np.abs(wij) > self.e:self.tag_W[index,j] = np.sign(qij)elif np.sign(qij) == -1 and np.sign(self.old_tag_list[index,j]) == 1:self.tag_W[index, j] = self.c * (qij - np.min(self.tag_list[:,j]))/(np.max(self.tag_list[:,j]) - np.min(self.tag_list[:,j]))else:self.tag_W[index, j] = qijif qij > 0:self.tag_list[index, j] = 1elif qij < 0:self.tag_list[index, j] = -1else:self.tag_list[index, j] = 0self.tag_list[np.where(self.old_tag_list == 1)] = 1def compute(self):'''迭代結束后,根據W和C矩陣對標簽矩陣進行恢復和補充'''for index in range(self.sample_num):for j in range(self.tag_c):if self.tag_list[index, j] * self.tag_W[index, j] > self.w_e:self.tag_list[index, j] = np.sign(self.tag_list[index, j])else:self.tag_list[index, j] = 0self.tag_list[np.where(self.old_tag_list == 1)] = 1def get_L_matricx(self):'''計算標簽相關矩陣'''self.L_matricx = np.zeros((self.tag_c,self.tag_c))for i in range(self.tag_c):for j in range(self.tag_c):if i >= j:a = np.sum((self.tag_list[:,i] == 1)*(self.tag_list[:,i] == 1)) + self.sb = np.sum(self.tag_list[:,i] == 1) + 2 * self.sc = np.sum(self.tag_list[:,j] == 1) + 2 * self.sself.L_matricx[i][j] = a/bself.L_matricx[j][i] = a/cdef re_20_p(self):'''根據標簽相關矩陣補全剩余標簽'''self.get_L_matricx()for i,j in zip(np.where(self.tag_list == 0)[0],np.where(self.tag_list == 0)[1]):qij = self.tag_list[i].T.dot(self.L_matricx[:,j])qij = (qij - np.min(self.tag_list[:, j])) / (np.max(self.tag_list[:, j]) - np.min(self.tag_list[:, j]))if qij > 0.5:self.tag_list[i][j] = 1else:self.tag_list[i][j] = -1def fit(self,feature,tag_list,max_iter=100,if_s=True):self.feature = np.array(feature,dtype=float)self.tag_list = np.array(tag_list,dtype=float)self.old_tag_list = np.array(tag_list)self.feature_dim = self.feature.shape[1]self.sample_num = self.feature.shape[0]self.tag_c = self.tag_list.shape[1]if if_s:print('standetlizing')self.standetlize()print('finish')print('add_nagtive_tag')self.add_nagtive_tag()print('finish')self.tag_W = self.tag_list.copy()print('get_dis_matrix')self.get_dis_matrix()print('finish')for iter in range(max_iter):print(iter)self.one_iter(iter+1)num = len(np.where((self.tag_list * self.tag_W) <= self.w_e)[0])print(num/(self.sample_num * self.tag_c))if num < self.sample_num * self.tag_c * 0.2:self.compute()breakself.re_20_p()def main():# ------Yeast數據集--------------------------------------------------feature,tag,real_tag = data_get_2('./yeast.csv',1)mcwd = MCWD(e=0.8,c=0.2,k_t=10,s=1,w_e=0.5,rate=0.25)mcwd.fit(feature,tag)pred_tag = mcwd.tag_listpred_tag[np.where(pred_tag == -1)] = 0print(np.sum(real_tag) - np.sum(tag))print(np.sum(pred_tag[np.where(real_tag==1)]) - np.sum(tag[np.where(real_tag==1)]))print(np.sum(pred_tag[np.where(real_tag==0)]))print("f1_macro")print(f1_score(real_tag,tag, average='macro'))print(f1_score(real_tag,pred_tag,average='macro'))print("f1_micro")print(f1_score(real_tag,tag, average='micro'))print(f1_score(real_tag,pred_tag,average='micro'))print("hamming_loss")print(hamming_loss(real_tag,tag))print(hamming_loss(real_tag,pred_tag))#------genbase數據集--------------------------------------------------feature, tag, real_tag = data_get_3('./file27546ea66c1.csv', 1)mcwd = MCWD(e=0.8, c=0.2, k_t=5, s=1, w_e=0.5, rate=0.25)mcwd.fit(feature,tag,if_s=False)pred_tag = mcwd.tag_listpred_tag[np.where(pred_tag == -1)] = 0print(np.sum(real_tag) - np.sum(tag))print(np.sum(pred_tag[np.where(real_tag == 1)]) - np.sum(tag[np.where(real_tag == 1)]))print(np.sum(pred_tag[np.where(real_tag == 0)]))print("f1_macro")print(f1_score(real_tag,tag, average='macro'))print(f1_score(real_tag,pred_tag,average='macro'))print("f1_micro")print(f1_score(real_tag,tag, average='micro'))print(f1_score(real_tag,pred_tag,average='micro'))print("hamming_loss")print(hamming_loss(real_tag,tag))print(hamming_loss(real_tag,pred_tag))if __name__ == '__main__':main()

    實驗結果


    總結

    根據實驗結果可以發現,經過算法的補全,與補全前的標簽矩陣比,F1值、hamming_loss等指標都有不同程度提升,證明了該算法的有效性。
    特別的:

  • 在Genbase數據集上,算法補全了近2/3的標簽,而僅產生了3個錯誤標簽,表現驚人,且各項評估指標都有非常大的提升
  • 對于標簽缺失嚴重的數據,該算法能控制錯誤生成在可以接受的程度內,盡可能的補全標簽。
  • 但必須要考慮到錯誤生成帶來的代價,有可能會影響之后的模型訓練。但對于像短視頻等內容,其標簽多而雜,一個短視頻所帶的標簽本沒有一個真正準確的標準,因此,這種在內容相關性的邏輯下導致的錯誤生成,對于問題的解決其實并沒有那么嚴重。
  • 該算法改進,純屬本人摸索而出,能否應用于工作實踐,還請各位斟酌嘗試。
  • 總結

    以上是生活随笔為你收集整理的【论文复现与改进】针对弱标注数据多标签矩阵恢复问题,改进后的MCWD算法,让你的弱标注多标签数据赢在起跑线上的全部內容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。

    主站蜘蛛池模板: 九七伦理电影 | 亚洲三级久久 | 合欢视频在线观看 | www一级片 | 成人在线免费视频 | 色婷婷社区 | 日韩一区二区三区不卡视频 | 女性裸体不遮胸图片 | 嫩草99 | 性欧美video另类hd尤物 | 99热思思| a毛片| 伊人伦理| 一级毛片基地 | 爱操在线| 欧洲金发美女大战黑人 | 欧美精品成人一区二区三区四区 | 免费萌白酱国产一区二区三区 | 国产欧美一区二区三区国产幕精品 | 久久成人黄色 | 欧美日韩综合网 | 国产精久久久久 | 激情亚洲色图 | 伊人福利在线 | 中文在线一区 | 国产成人无码a区在线观看视频 | 色猫咪av| 亚洲一区视频在线播放 | 精品国产乱码久久久久久郑州公司 | 免费看成人 | 在线观看亚洲av每日更新 | 久久精品国产一区 | 免费观看成年人视频 | 男人久久| 日韩精品国产AV | 韩国视频一区二区三区 | 国产精品久久久久久久久久久久久久 | 亚洲精品 欧美 | 喷水视频在线观看 | 91精品国产综合久久久蜜臀图片 | www.五月婷婷.com | 久久女同互慰一区二区三区 | 亚洲女人18毛片水真多 | 91中文视频 | 一级黄网 | 免费看a级黄色片 | 男人和女人做爽爽视频 | 国产区一区二区 | 欧美性猛交xxxx乱大交hd | 亚洲国产精品欧美久久 | 国产一区二区啪啪啪 | 韩国中文三级hd字幕 | 久久久人 | 桃色视频网站 | 91激情在线观看 | 强辱丰满人妻hd中文字幕 | 日日舔夜夜摸 | 中文在线а√在线8 | 国产一区二区三区四区五区在线 | 国产精品xxx视频 | 粉嫩久久99精品久久久久久夜 | 91精品国产福利在线观看 | 精品久久久久久久 | www.伊人.com | 国产天堂久久 | 特级毛片在线观看 | 国产aaa大片| 欧美大片免费观看网址 | 色在线视频观看 | 亚洲综合免费观看高清完整版在线 | 精品国产一区二区三区久久久 | 一级特黄高清 | 亚洲精品视频久久久 | 少妇做爰免费理伦电影 | 国产欧美一区二区三区精品酒店 | 色婷婷av一区二区三区四区 | 人人看超碰| 无码免费一区二区三区 | 米奇久久| 人与动物2免费观看完整版电影高清 | 女futa攻玩遍整个后宫 | 91亚洲精品在线观看 | av操操操 | 亚洲成人黄色网址 | a午夜| 香港三级韩国三级日本三级 | 欧美久久久久久久久久久久 | 日本一级大片 | 日本不卡一二三区 | 国产精品自拍在线 | 亚洲色图美腿丝袜 | 免费观看一级黄色片 | 免费观看成人毛片 | 怡红院av久久久久久久 | 中国毛片基地 | 99热在线这里只有精品 | 国产情侣一区 | 五月天精品视频 | 蜜臀aⅴ国产精品久久久国产老师 |