kaggle----NLP线性回归---Real or Not? NLP with Disaster Tweets

依然是按照老样子拿到了我们的训练集测试集还有提交模板
竞赛网站:
https://www.kaggle.com/c/nlp-getting-started/overview/description

数据初步可视化

import numpy as np
import pandas as pd
from sklearn import feature_extraction, linear_model, model_selection, preprocessing
train = pd.read_csv('路径/train.csv')
test = pd.read_csv('路径/test.csv')

此处以keyword作为例子,查看不同的度量对于预测结果的影响

#划分数据集,查看相应变量中的
target1=train.keyword[train.target == 1].value_counts()
target0=train.keyword[train.target == 0].value_counts()
df=pd.DataFrame({'target1':target1,'target0':target0})
df.plot(kind='bar',stacked=True,title='keyword')

当然呢,这个图可能略显的凌乱,但我们可以发现有的蓝色条尤其长是说明其中有的keyword是对于判断文本是否是有显著影响的,我们可以点开详情查看统计
kaggle----NLP线性回归---Real or Not? NLP with Disaster Tweets_第1张图片
发现了次数的统计,那么这几个keyword就可以作为后续的限制条件
kaggle----NLP线性回归---Real or Not? NLP with Disaster Tweets_第2张图片

本例只做了简单样例,各位老板做参考就可

向量构筑

每条 tweet中包含的单词都是一个很好的指标,表明它们是否是真正的Disaster (可能并不完全正确)。
使用scikit learn中的countvector对每条tweet中的单词进行计数,并将它们转换为机器学习模型可以处理的数据。

注:在这种情况下,向量是机器学习模型可以使用的一组数字

用前五条为例

count_vectorizer = feature_extraction.text.CountVectorizer()
# count_vectorizer.get_feature_names() 可以查看生成的字典名

# count_vectorizer.vocabulary_  字典形式呈现,key:词,value:词频
# 让我们计算一下数据中前5条tweets的单词数量
example_train_vectors = count_vectorizer.fit_transform(train["text"][0:5])
## 我们在这里使用.todense(),因为这些向量是“离散的”(只保留非零元素以节省空间)
print(example_train_vectors[0].todense().shape)
print(example_train_vectors[0].todense())

参考:sklearn——CountVectorizer详解
kaggle----NLP线性回归---Real or Not? NLP with Disaster Tweets_第3张图片

上面告诉我们:
前五条 tweets中有54个独特的单词(或“标记”)。
第一条tweet([0])只包含其中一些唯一的标记——上面所有的非零计数都是第一条tweet中存在的标记。

现在为所有的tweets创建向量:

train_vectors = count_vectorizer.fit_transform(train_df["text"])

## 注意,这里没有使用.fit_transform(),只是用了.transform()确保列向量中的标记是映射到测试向量的唯一标记
# 也就是说,训练集向量和测试集向量使用同一组变化
test_vectors = count_vectorizer.transform(test_df["text"])

线性模型

正如前面提到的,每条tweet中包含的文字是一个很好的指标,可以判断它们是否是Disaster。tweet中特定单词(或一组单词)的出现可能直接链接到该tweet是否真实。

假设这是一个线性关系,建立一个线性模型看看!

我们的向量很大,所以我们想推进模型的权重趋近于0但不完全消除,ridge regression是一个很好的方式

clf = linear_model.RidgeClassifier()

使用交叉验证,我们对已知数据的一部分进行训练,然后使用其他数据对其进行验证。

这次竞赛的评价标准是F1,所以我们的模型也选用这个标准
kaggle----NLP线性回归---Real or Not? NLP with Disaster Tweets_第4张图片

scores = model_selection.cross_val_score(clf, train_vectors, train_df["target"], cv=3, scoring="f1")

在这里插入图片描述

预测并提交模型

clf.fit(train_vectors, train_df["target"])

在这里插入图片描述

sample_submission = pd.read_csv("路径/sample_submission.csv")
sample_submission["target"] = clf.predict(test_vectors)
sample_submission.head()

kaggle----NLP线性回归---Real or Not? NLP with Disaster Tweets_第5张图片

sample_submission.to_csv("路径/submission.csv", index=False)

完成,可以提交

你可能感兴趣的:(Python)