https://www.kaggle.com/jhoward/nb-svm-strong-linear-baseline
介绍
该内核展示了如何使用NBSVM(朴素贝叶斯-支持向量机)为“有毒评论分类挑战赛”创建强大的基准。 NBSVM是Sida Wang和Chris Manning在《基线与双轨:简单,良好的情感和主题分类》一文中介绍的。 在此内核中,我们使用sklearn的逻辑回归,而不是SVM,尽管实际上两者几乎相同(sklearn在幕后使用liblinear库)。
如果您不熟悉朴素的贝叶斯和成语的单词矩阵,我已经提供了fast.ai即将发布的实用机器学习课程视频之一的预览,其中介绍了此主题。 这里是视频部分的链接,该部分对此进行了讨论:朴素贝叶斯视频。
train['comment_text'][2]
"Hey man, I'm really not trying to edit war. It's just that this guy is constantly removing relevant information and talking to me through edits instead of my talk page. He seems to care more about the formatting than the actual info."
lens = train.comment_text.str.len()
lens.mean(), lens.std(), lens.max()
(394.0732213246768, 590.7202819048923, 5000)
lens.hist();
我们将创建所有要预测的标签的列表,还将创建“无”标签,以便我们查看有多少注释没有标签。 然后我们可以汇总数据集。
label_cols = ['toxic', 'severe_toxic', 'obscene', 'threat', 'insult', 'identity_hate']
train['none'] = 1-train[label_cols].max(axis=1)
train.describe()
我们需要删除一些空的注释,否则sklearn会抱怨。
COMMENT = 'comment_text'
train[COMMENT].fillna("unknown", inplace=True)
test[COMMENT].fillna("unknown", inplace=True)
建立模型
我们将首先创建一袋单词表示形式,作为术语文档矩阵。 正如NBSVM论文中所建议的,我们将使用ngram。
import re, string
re_tok = re.compile(f'([{string.punctuation}“”¨«»®´·º½¾¿¡§£₤‘’])')
def tokenize(s): return re_tok.sub(r' \1 ', s).split()
事实证明,与本文中使用的二值化功能相比,使用TF-IDF可以提供更好的先验。 我认为以前没有在任何论文中提到这一点,但是它会将排行榜得分从0.59提高到0.55。
n = train.shape[0]
vec = TfidfVectorizer(ngram_range=(1,2), tokenizer=tokenize,
min_df=3, max_df=0.9, strip_accents='unicode', use_idf=1,
smooth_idf=1, sublinear_tf=1 )
trn_term_doc = vec.fit_transform(train[COMMENT])
test_term_doc = vec.transform(test[COMMENT])
这将创建仅具有少量非零元素(在下面的表示形式中存储的元素)的稀疏矩阵。
这是基本的朴素贝叶斯特征方程式:
def pr(y_i, y):
p = x[y==y_i].sum(0)
return (p+1) / ((y==y_i).sum()+1)
x = trn_term_doc
test_x = test_term_doc
def get_mdl(y):
y = y.values
r = np.log(pr(1,y) / pr(0,y))
m = LogisticRegression(C=4, dual=True)
x_nb = x.multiply(r)
return m.fit(x_nb, y), r
preds = np.zeros((len(test), len(label_cols)))
for i, j in enumerate(label_cols):
print('fit', j)
m,r = get_mdl(train[j])
preds[:,i] = m.predict_proba(test_x.multiply(r))[:,1]
fit toxic fit severe_toxic fit obscene fit threat fit insult fit identity_hate
创建csv文件
submid = pd.DataFrame({'id': subm["id"]})
submission = pd.concat([submid, pd.DataFrame(preds, columns = label_cols)], axis=1)
submission.to_csv('submission.csv', index=False)
来源:CSDN
作者:哗啦cl
链接:https://blog.csdn.net/qq_43439240/article/details/103578676