SMS Spam Collection Dataset描述
是垃圾短信,不是垃圾短信,这是一个问题。
Link: https://www.kaggle.com/uciml/sms-spam-collection-dataset
题目描述
下面有一个数据集, 它包括了5574条英文短信,短信内容由长短不一的几句话组成。每条短信都标注好了该短信是否为垃圾短信,通过该训练集训练出一个分类器,预测短信内容是否为垃圾短信。
小提示
数据处理:可以使用分词工具,然后将句子转换成词向量,建立词表。简单的,可以通过统计词汇表中词汇出现的次数构建向量。
但是上述这种简单地构建向量的方式,会导致每个词的重要过于均衡,无法体现词向量中词汇的重要性,导致分类结果不理想。改进中,可以采用TF-IDF方式来构建词向量。
此时建立的向量通常是高度稀疏的,我们需要对建立的向量进行降维。方法可以采用主成分分析法等。
这之后,可以使用条件概率来进行分类,实现贝叶斯分类器
先修技能
会数据降维方法,如主成分分析法(pca)
原始数据集可参见链接:http://www.dt.fee.unicamp.br/~tiago/smsspamcollection/
解释术语
SVM分类:支持向量机,一般简称SVM。通俗来讲,它是一种二类分类模型,其基本模型定义为特征空间上的间隔最大的线性分类器,其学习策略便是间隔最大化,最终可转化为一个凸二次规划问题的求解。
贝叶斯(bayes)分类:贝叶斯分类器的分类原理是通过某对象的先验概率,利用贝叶斯公式计算出其后验概率,即该对象属于某一类的概率,选择具有最大后验概率的类作为该对象所属的类。
主成分分析:主成分分析也称主分量分析,旨在利用降维的思想,把多指标转化为少数几个综合指标。
在统计学中,主成分分析(PCA)是一种简化数据集的技术。它是一个线性变换。这个变换把数据变换到一个新的坐标系统中,使得任何数据投影的第一大方差在第一个坐标(称为第一主成分)上,第二大方差在第二个坐标(第二主成分)上,依次类推。主成分分析经常用减少数据集的维数,同时保持数据集的对方差贡献最大的特征。这是通过保留低阶主成分,忽略高阶主成分做到的。这样低阶成分往往能够保留住数据的最重要方面。但是,这也不是一定的,要视具体应用而定。
输入格式
数据文件train.csv
包含5574英文短信。
每条短信占一行,每行由两列构成。第一列是短信相应的标签label
,如果是ham
表示为非垃圾短信,如果是spam
表示为垃圾短信。第二列是短信的具体内容,由长短不一的几句英文组成。如下所示:
Label,Text
ham,Aight should I just plan to come up later tonight?
ham,Was the farm open?
ham,"I sent my scores to sophas and i had to do secondary application for a few schools. I think if you are thinking of applying, do a research on cost also. Contact joke ogunrinde, her school is one me the less expensive ones"
etc...
数据文件test.csv
每行由两列构成。第一列是短信相应的IdSmsId
,第二列是短信的具体内容,由长短不一的几句英文组成。如下所示:
SmsId,Text
4456,Aight should I just plan to come up later tonight?
690,Was the farm open?
944,"I sent my scores to sophas and i had to do secondary application for a few schools. I think if you are thinking of applying, do a research on cost also. Contact joke ogunrinde, her school is one me the less expensive ones"
etc...
输出格式
您的提交文件submission.csv
应采用以下格式:对于测试集中的每条短信,输出一行,其中包含SmsId和您预测其是否为垃圾短信的结果,不是为ham、是为spam。 例如,如果您预测第一条短信是垃圾短信,第二条不是,那么您的提交文件将如下所示:
SmsId,Label
1,spam
2,ham
etc...
评价
使用准确率(accuracy)作为最后评判标准。
TP,True Positive,将正类预测为正类的数目
FP,False Positive,将负类预测为正类数
TN,True Negative,将负类预测为负类数
FN,False Negative,将正类预测为负类数
$$ Accuracy=\frac{TP+TN}{TP+FN+FP+TN} $$
代码与数据
- train:https://github.com/wfnuser/my-kaggle-dataset/blob/master/spam/train.csv
- test:https://github.com/wfnuser/my-kaggle-dataset/blob/master/spam/test.csv
- correct_submission: https://github.com/wfnuser/my-kaggle-dataset/blob/master/spam/correct_submission.csv
- submission: https://gist.githubusercontent.com/chenjinnanjiuzhang/571d8fbf3269ce54828121d070ccc14c/raw/34e3893c03ea7b456300e3ae999a38796ac0b9d5/submission.csv
完整代码
https://www.kaggle.com/jiuzhang/ninechapter-spam-ham-self/notebook
测评配置环境
python
pip install -U numpy
pip install pandas
pip install -U scikit-learn
测评代码
import pandas as pd
import numpy as np
from sklearn.metrics import accuracy_score
y_test = pd.read_csv("./correct_submission.csv").sort_values('SmsId')
y_pred = pd.read_csv("./correct_submission.csv").sort_values('SmsId')
accuracy = accuracy_score(y_test.Label,y_pred.Label)