发现问题
最早使用的是0.15 版本的sklearn 后来更换的开发环境,使用了0.17版本,但是出现了无法运行的问题,在一番搜索之后在stackoverflow上找到了答案
DeprecationWarning: Directsupport for sequence of sequences multilabel representation will be unavailable from version 0.17. Use sklearn.preprocessing.MultiLabelBinarizer to convert to a label indicator representation.
之前的代码是这样写的,直接使用提取出来的标签进行fit
cvt = CountVectorizer(tokenizer=self.tokenizer, min_df=4, stop_words=self.stop_words)
self.classifier = Pipeline([('vectorizer', cvt),
('clf', OneVsRestClassifier(SGDClassifier(loss='hinge', alpha=1e-5, eta0=0.25, n_iter=50,), n_jobs=12))])
words, tags = self.inputData(self.train_file)
self.classifier.fit(words, tags)
pickle.dump(self.classifier, open("zzz.pickle", 'wb'))
解决方案
使用 MultiLabelBinarizer 先将多标签进行多标签二值化,然后将转换的编码表存储下来
然后再使用之前的方式,使用训练数据对模型进行fit,然后再把真正的模型dump下来,这样就可以成功运行了。
感觉是sklearn升级时候不再支持使用原始的数据格式进行fit,必须要提前进行多标签二值化
words, tags_unique, tags_normal = self.inputData(self.train_file)
tags_handled = list(tags_unique)
print "\t".join(tags_handled)
mlb = MultiLabelBinarizer(classes=tags_handled)
tags_train_mlb = mlb.fit_transform(tags_normal)
pickle.dump(mlb, open("mlb_ind.pickle", 'wb'))
# text.CountVectorizer:将文本转换为每个词出现的个数的向量
# text.TfidfVectorizer:将文本转换为tfidf值的向量
# text.HashingVectorizer:文本的特征哈希
cvt = CountVectorizer(tokenizer=self.tokenizer, min_df=4, stop_words=self.stop_words)
# OneVsRestClassifier:1 - rest多分类(多标签)策略
# OneVsOneClassifier:1 - 1 多分类策略
# OutputCodeClassifier:1个类用一个二进制码表示
clf = OneVsRestClassifier(SGDClassifier(loss='hinge', alpha=1e-5, eta0=0.25, n_iter=50, n_jobs=12))
self.classifier = Pipeline([
('vectorizer', cvt),
# ('tfidf', TfidfTransformer()),
('clf', clf)])
self.classifier.fit(words, tags_train_mlb)
pickle.dump(self.classifier, open("zzz17.pickle", 'wb'))
print("#### classifier dumped!")
此外有一点需要注意,使用上面训练的模型进行predict之后,要使用多标签二值化的编码表进行反向转换从而得到真正的计算值
predict = model.predict([company])
mlb = pickle.load(open("mlb_ind.pickle","rb"))
result = mlb.inverse_transform(predict)