Title: 多标签分类怎么做?(Python) · Issue #64 · aialgorithm/Blog · GitHub
Open Graph Title: 多标签分类怎么做?(Python) · Issue #64 · aialgorithm/Blog
X Title: 多标签分类怎么做?(Python) · Issue #64 · aialgorithm/Blog
Description: 一、基本介绍 首先简单介绍下,多标签分类与多分类、多任务学习的关系: 多分类学习(Multi-class):分类器去划分的类别是多个的,但对于每一个样本只能有一个类别,类别间是互斥的。例如:分类器判断这只动物是猫、狗、猪,每个样本只能有一种类别,就是一个三分类任务。常用的做法是OVR、softmax多分类 多标签学习(Multi-label ):对于每一个样本可能有多个类别(标签)的任务,不像多分类任务的类别是互斥。例如判断每一部电影的标签可以是多个的,比如有些电影标签...
Open Graph Description: 一、基本介绍 首先简单介绍下,多标签分类与多分类、多任务学习的关系: 多分类学习(Multi-class):分类器去划分的类别是多个的,但对于每一个样本只能有一个类别,类别间是互斥的。例如:分类器判断这只动物是猫、狗、猪,每个样本只能有一种类别,就是一个三分类任务。常用的做法是OVR、softmax多分类 多标签学习(Multi-label ):对于每一个样本可能有多个类别(标签)的任务,不...
X Description: 一、基本介绍 首先简单介绍下,多标签分类与多分类、多任务学习的关系: 多分类学习(Multi-class):分类器去划分的类别是多个的,但对于每一个样本只能有一个类别,类别间是互斥的。例如:分类器判断这只动物是猫、狗、猪,每个样本只能有一种类别,就是一个三分类任务。常用的做法是OVR、softmax多分类 多标签学习(Multi-label ):对于每一个样本可能有多个类别(标签)的任务,不...
Opengraph URL: https://github.com/aialgorithm/Blog/issues/64
X: @github
Domain: github.com
{"@context":"https://schema.org","@type":"DiscussionForumPosting","headline":"多标签分类怎么做?(Python)","articleBody":"\r\n### 一、基本介绍\r\n\r\n首先简单介绍下,多标签分类与多分类、多任务学习的关系:\r\n\r\n- 多分类学习(Multi-class):分类器去划分的类别是多个的,但对于每一个样本只能有一个类别,类别间是互斥的。例如:分类器判断这只动物是猫、狗、猪,每个样本只能有一种类别,就是一个三分类任务。常用的做法是OVR、softmax多分类\r\n\r\n\r\n- 多标签学习(Multi-label ):对于每一个样本可能有多个类别(标签)的任务,不像多分类任务的类别是互斥。例如判断每一部电影的标签可以是多个的,比如有些电影标签是【科幻、动作】,有些电影是【动作、爱情、谍战】。需要注意的是,每一样本可能是1个类别,也可能是多个。而且,类别间通常是有所联系的,一部电影有科幻元素 同时也大概率有动作篇元素的。\r\n\r\n\r\n\r\n- 多任务学习(Multi-task):\r\n基于共享表示(shared representation),多任务学习是通过合并几个任务中的样例(可以视为对参数施加的软约束)来提高泛化的一种方式。额外的训练样本以同样的方式将模型的参数推向泛化更好的方向,当模型的一部分在任务之间共享时,模型的这一部分更多地被约束为良好的值(假设共享是合理的),往往能更好地泛化。某种角度上,多标签分类可以看作是一种多任务学习的简单形式。\r\n\r\n\r\n### 二、多标签分类实现\r\n实现多标签分类算法有DNN、KNN、ML-DT、Rank-SVM、CML,像决策树DT、最近邻KNN这一类模型,从原理上面天然可调整适应多标签任务的(多标签适应法),按同一划分/近邻的客群中各标签的占比什么的做下排序就可以做到了。\r\n\r\n这里着重介绍下,比较通用的多标签实现思路,大致有以下4种:\r\n\r\n#### 方法一:多分类思路\r\n简单粗暴,直接把不同标签组合当作一个类别,作为一个多分类任务来学习。如上述 【科幻、动作】、【动作、爱情、谍战】、【科幻、爱情】就可以看作一个三分类任务。这种方法前提是标签组合是比较有限的,不然标签会非常稀疏没啥用。\r\n\r\n#### 方法二:OVR二分类思路\r\n也挺简单的。将多标签问题转成多个二分类模型预测的任务。如电影总的子标签有K个,划分出K份数据,分别训练K个二分类模型,【是否科幻类、是否动作类....第K类】,对于每个样本预测K次打出最终的标签组合。\r\n\r\n这种方法简单灵活,但是缺点是也很明显,各子标签间的学习都是独立的(可能是否科幻类对判定是否动作类的是有影响),忽略了子标签间的联系,丢失了很多信息。\r\n\r\n对应的方法有sklearn的OneVsRestClassifier方法,\r\n```\r\nfrom xgboost import XGBClassifier\r\nfrom sklearn.multiclass import OneVsRestClassifier\r\nimport numpy as np\r\n\r\nclf_multilabel = OneVsRestClassifier(XGBClassifier())\r\n\r\ntrain_data = np.random.rand(500, 100) # 500 entities, each contains 100 features\r\ntrain_label = np.random.randint(2, size=(500,20)) # 20 targets\r\n\r\nval_data = np.random.rand(100, 100)\r\n\r\nclf_multilabel.fit(train_data,train_label)\r\nval_pred = clf_multilabel.predict(val_data)\r\n\r\n```\r\n\r\n#### 方法三:二分类改良\r\n在方法二的基础上进行改良,即考虑标签之间的关系。 每一个分类器的预测结果将作为一个数据特征传给下一个分类器,参与进行下一个类别的预测。该方法的缺点是分类器之间的顺序会对模型性能产生巨大影响。\r\n\r\n#### 方法四:多个输出的神经网络\r\n这以与多分类方法类似,但不同的是这里神经网络的多个输出,输出层由多个的sigmoid+交叉熵组成,并不是像softmax各输出是互斥的。\r\n\r\n\r\n如下构建一个输出为3个标签的概率的多标签模型,模型是共用一套神经网络参数,各输出的是独立(bernoulli分布)的3个标签概率\r\n\r\n\r\n\r\n\r\n```\r\n## 多标签 分类\r\nfrom keras.models import Model\r\nfrom keras.layers import Input,Dense\r\n\r\ninputs = Input(shape=(15,))\r\nhidden = Dense(units=10,activation='relu')(inputs)\r\noutput = Dense(units=3,activation='sigmoid')(hidden)\r\nmodel=Model(inputs=inputs, outputs=output)\r\nmodel.compile(optimizer='adam', loss='binary_crossentropy', metrics=['accuracy'])\r\nmodel.summary()\r\n\r\n# 训练模型,x特征,y为多个标签\r\nmodel.fit(x, y.loc[:,['LABEL','LABEL1','LABEL3']], epochs=3)\r\n\r\n```\r\n\r\n\r\n通过共享的模型参数来完成多标签分类任务,在考虑了标签间的联系的同时,共享网络参数可以起着模型正则化的作用,可能对提高模型的泛化能力有所帮助的(在个人验证中,测试集的auc涨了1%左右)。这一点和多任务学习是比较有联系的,等后面有空再好好研究下多任务。\r\n\r\n\r\n\r\n\r\n\r\n","author":{"url":"https://github.com/aialgorithm","@type":"Person","name":"aialgorithm"},"datePublished":"2022-12-20T12:29:51.000Z","interactionStatistic":{"@type":"InteractionCounter","interactionType":"https://schema.org/CommentAction","userInteractionCount":0},"url":"https://github.com/64/Blog/issues/64"}
| route-pattern | /_view_fragments/issues/show/:user_id/:repository/:id/issue_layout(.:format) |
| route-controller | voltron_issues_fragments |
| route-action | issue_layout |
| fetch-nonce | v2:c1ca7116-6bcd-45af-5a56-5fa1b6d90524 |
| current-catalog-service-hash | 81bb79d38c15960b92d99bca9288a9108c7a47b18f2423d0f6438c5b7bcd2114 |
| request-id | CFAC:B6892:CCE549:11661EF:6969ECA7 |
| html-safe-nonce | 1c65901e9962c609e08740034d5ceb1064bceb25b899b223df5757e7ed00709e |
| visitor-payload | eyJyZWZlcnJlciI6IiIsInJlcXVlc3RfaWQiOiJDRkFDOkI2ODkyOkNDRTU0OToxMTY2MUVGOjY5NjlFQ0E3IiwidmlzaXRvcl9pZCI6IjE3NjU0MDgzMTEyMTM2ODE4MzEiLCJyZWdpb25fZWRnZSI6ImlhZCIsInJlZ2lvbl9yZW5kZXIiOiJpYWQifQ== |
| visitor-hmac | ef1af450fe2a047edafd38be2d1f700e2b63213a73dcfdd15bff535ac4e90a3e |
| hovercard-subject-tag | issue:1504486322 |
| github-keyboard-shortcuts | repository,issues,copilot |
| google-site-verification | Apib7-x98H0j5cPqHWwSMm6dNU4GmODRoqxLiDzdx9I |
| octolytics-url | https://collector.github.com/github/collect |
| analytics-location | / |
| fb:app_id | 1401488693436528 |
| apple-itunes-app | app-id=1477376905, app-argument=https://github.com/_view_fragments/issues/show/aialgorithm/Blog/64/issue_layout |
| twitter:image | https://opengraph.githubassets.com/7ee1ff347ea84cc20edd13f840d1cf23065effba65c4e6351a5797ae71df5c00/aialgorithm/Blog/issues/64 |
| twitter:card | summary_large_image |
| og:image | https://opengraph.githubassets.com/7ee1ff347ea84cc20edd13f840d1cf23065effba65c4e6351a5797ae71df5c00/aialgorithm/Blog/issues/64 |
| og:image:alt | 一、基本介绍 首先简单介绍下,多标签分类与多分类、多任务学习的关系: 多分类学习(Multi-class):分类器去划分的类别是多个的,但对于每一个样本只能有一个类别,类别间是互斥的。例如:分类器判断这只动物是猫、狗、猪,每个样本只能有一种类别,就是一个三分类任务。常用的做法是OVR、softmax多分类 多标签学习(Multi-label ):对于每一个样本可能有多个类别(标签)的任务,不... |
| og:image:width | 1200 |
| og:image:height | 600 |
| og:site_name | GitHub |
| og:type | object |
| og:author:username | aialgorithm |
| hostname | github.com |
| expected-hostname | github.com |
| None | 7b32f1c7c4549428ee399213e8345494fc55b5637195d3fc5f493657579235e8 |
| turbo-cache-control | no-preview |
| go-import | github.com/aialgorithm/Blog git https://github.com/aialgorithm/Blog.git |
| octolytics-dimension-user_id | 33707637 |
| octolytics-dimension-user_login | aialgorithm |
| octolytics-dimension-repository_id | 147093233 |
| octolytics-dimension-repository_nwo | aialgorithm/Blog |
| octolytics-dimension-repository_public | true |
| octolytics-dimension-repository_is_fork | false |
| octolytics-dimension-repository_network_root_id | 147093233 |
| octolytics-dimension-repository_network_root_nwo | aialgorithm/Blog |
| turbo-body-classes | logged-out env-production page-responsive |
| disable-turbo | false |
| browser-stats-url | https://api.github.com/_private/browser/stats |
| browser-errors-url | https://api.github.com/_private/browser/errors |
| release | bdde15ad1b403e23b08bbd89b53fbe6bdf688cad |
| ui-target | full |
| theme-color | #1e2327 |
| color-scheme | light dark |
Links:
Viewport: width=device-width