概述
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]]
最后
以上就是壮观流沙为你收集整理的logistic Regression+doc2vec实现多标签(multi_label)分类的全部内容,希望文章能够帮你解决logistic Regression+doc2vec实现多标签(multi_label)分类所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
发表评论 取消回复