logistic Regression+doc2vec实现多标签(multi_label)分类

1.导入需要的各种模块

from sklearn.linear_model import LogisticRegression
from tqdm import tqdm
import gensim
from sklearn.preprocessing import MultiLabelBinarizer
from sklearn.multiclass import OneVsRestClassifier
from sklearn.metrics import f1_score,accuracy_score

2.导入数据文件
我有四个数据文件,train.csv和test.csv为英语段落(已经去掉了各种特殊符号,只剩字符串),label_train.csv和label_test.csv为标签文件(85%为单标签,15%为多标签,均为数字,每一行代表一个段落的标签)。
trian.csv,test.csv数据格式如下,取一行(每一行代表一个段落):

I am a boy She is a cute girl

label_train.csv,label_test.csv数据格式如下,取一行(每一行代表一个标签):

2 3 5
train_csv=open("./Sample_data/train.csv","r")
l_train_csv=open("./Sample_data/label_train.csv","r")
test_csv=open("./Sample_data/test.csv","r")
l_test_csv=open("./Sample_data/label_test.csv","r")

tr=train_csv.readlines()
l_tr=l_train_csv.readlines()
te=test_csv.readlines()
l_te=l_test_csv.readlines()

train_csv.close()
l_train_csv.close()
test_csv.close()
l_test_csv.close()

//doc2vec.TaggedDocument处理后的训练集集合
train=[]
//训练集和测试集的数据划分为字符格式
train2=[]
test2=[]
//训练集和测试集标签
label_train = []
label_test=[]
count=0


for fline in tqdm(l_tr,desc="Loading label_train data"):
    sl = [int(cat) for cat in fline.strip("\n").split("\n")[0].split(" ")]
    label_train.append(sl)


for fline in tqdm(l_te,desc="Loading label_test data"):
    s = [int(cat) for cat in fline.strip("\n").split("\n")[0].split(" ")]
    label_test.append(s)


for fline in tqdm(te,desc="Loading test data"):
   str = fline.strip("\n").split("\n")[0].split(" ")
   st = list(filter(None, str))
   test2.append(st)


for fline in tqdm(tr,desc="Loading train data"):
   str = fline.strip("\n").split("\n")[0].split(" ")
   st = list(filter(None, str))
   train.append(gensim.models.doc2vec.TaggedDocument(st,label_train[count]))
   train2.append(st)
   count+=1

3.利用Doc2Vec得到段落的向量表示,然后利用向量表示来进行多标签分类

model = gensim.models.Doc2Vec(size=100, window=10, min_count=5, workers=11,alpha=0.025, min_alpha=0.025)

//建立字典
model.build_vocab(train)
for epoch in range(10):
    model.train(train,total_examples=model.corpus_count, epochs=model.iter)
    model.alpha -= 0.002

//得到训练集的向量表示放在列表中
doc_train=[]
for i in range(len(train)):
    invec1 = model.infer_vector(train2[i], alpha=0.1, min_alpha=0.0001, steps=5)
    doc_train.append(invec1)


//得到测试集的向量表示放在列表中
doc_test=[]
for i in range(len(test2)):
    invec1 = model.infer_vector(test2[i], alpha=0.1, min_alpha=0.0001, steps=5)
    doc_test.append(invec1)
//利用MultiLabelBinarizer()将标签转换成二进制形式,便于比较与区分标签

m_label_train=MultiLabelBinarizer().fit_transform(label_train)
m_label_test=MultiLabelBinarizer().fit_transform(label_test)

4.利用sklearn的OneVsRestClassifier分类策略和LogisticRegression方法预测测试集的标签

l2=OneVsRestClassifier(LogisticRegression(random_state=0))
//训练分类器
l2.fit(doc_train,m_label_train)
t2=l2.predict(doc_test)

print(accuracy_score(m_label_test, t2))
print(f1_score(m_label_test,t2,average='micro'))
print(f1_score(m_label_test,t2,average='macro'))

5,部分结果展示

(1)doc2vec.TaggedDocument处理后的训练集中每行数据结果
train:

[ [“I”,“am”,“a”,“boy”,“she”,“is”,“a”, “cute”,“girl”],tags=[3,5] ]

(2)利用MultiLabelBinarizer()将标签转换成二进制形式(所有行)

m_label_train:

[[0 0 0 … 0 0 0]
[0 0 0 … 0 0 0]
[0 1 0 … 0 1 0]

[0 1 0 … 0 0 0]
[0 0 0 … 0 1 0]
[0 0 0 … 0 0 1]]

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值