首页 > 其他分享 >【Kaggle】Spam/Ham Email Classification

【Kaggle】Spam/Ham Email Classification

时间:2023-10-16 17:36:13浏览次数:45  
标签:Ham df Kaggle tokens train test import model Email

基本思想

需求是对垃圾邮件进行分类。

思路1:使用LSTM、GRU等自带的时序模型进行分类。

思路2:使用spacy这个NLP库,里面的textcat可直接用来文本分类

实际上,思路2比思路1更优。由于是入门题,就只使用思路1了。

思路2代码参考:https://blog.csdn.net/qq_21201267/article/details/109109237

代码实现

读取数据

import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
import seaborn as sns
# 忽略警告提示
import warnings
warnings.filterwarnings('ignore')
# 导入数据
# 训练数据集
trainf = open('train.csv',encoding='utf-8')
train_df =pd.read_csv(trainf)
# 测试数据集
testf = open('test.csv',encoding='utf-8')
test_df = pd.read_csv(testf)
print('训练数据集:',train_df.shape,"测试数据集:",test_df.shape)
train_df.head()

数据清洗

#数据清洗
train_df = train_df.fillna(" ")
test_df = test_df.fillna(" ")
print(np.sum(np.array(train_df.isnull()==True), axis=0))
print(np.sum(np.array(test_df.isnull()==True), axis=0))

from sklearn.model_selection import train_test_split
# 假设 X 包含特征,y 包含目标变量
X = train_df["subject"]+" "+train_df["email"]  # 使用你希望的特征列
y = train_df['spam']  # 用于预测的目标变量

# 将数据拆分为训练集和测试集
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42)

#文本转token
from keras.preprocessing.text import Tokenizer
max_words = 300
tokenizer = Tokenizer(num_words=max_words, lower=True, split=' ')
# 只给频率最高的300个词分配 id,其他的忽略
tokenizer.fit_on_texts(list(X_train)+list(X_test)) # tokenizer 训练
X_train_tokens = tokenizer.texts_to_sequences(X_train)
X_test_tokens = tokenizer.texts_to_sequences(X_test)

# 样本 tokens 的长度不一样,pad
maxlen = 100
from keras.preprocessing import sequence
X_train_tokens_pad = sequence.pad_sequences(X_train_tokens, maxlen=maxlen,padding='post')
X_test_tokens_pad = sequence.pad_sequences(X_test_tokens, maxlen=maxlen,padding='post')

模型训练

#模型训练
embeddings_dim = 30 # 词嵌入向量维度
from keras.models import Model, Sequential
from keras.layers import Embedding, LSTM, GRU, SimpleRNN, Dense
model = Sequential()
model.add(Embedding(input_dim=max_words, # Size of the vocabulary
                    output_dim=embeddings_dim, # 词嵌入的维度
                    input_length=maxlen))
model.add(GRU(units=64)) # 可以改为 SimpleRNN , LSTM
model.add(Dense(units=1, activation='sigmoid'))
model.summary()

model.compile(optimizer='adam',
              loss='binary_crossentropy',
              metrics=['accuracy']) # 配置模型
history = model.fit(X_train_tokens_pad, y_train,
                    batch_size=128, epochs=10, validation_split=0.2)
model.save("email_cat_lstm.h5") # 保存训练好的模型

训练过程可视化

#训练过程可视化
from matplotlib import pyplot as plt
pd.DataFrame(history.history).plot(figsize=(8, 5))
plt.grid(True)
plt.show()

输出答案 

#输出答案
ansX=test_df["subject"]+" "+test_df["email"]  # 使用你希望的特征列

tokenizer.fit_on_texts(list(X_train)+list(X_test)) # tokenizer 训练
ans_tokens = tokenizer.texts_to_sequences(ansX)
ans_tokens_pad = sequence.pad_sequences(ans_tokens, maxlen=maxlen,padding='post')

pred_prob = model.predict(ans_tokens_pad).squeeze()
pred_class = np.asarray(pred_prob > 0.5).astype(np.int32)
id = test_df['id']
output = pd.DataFrame({'id':id, 'Class': pred_class})
output.to_csv("submission_gru.csv",  index=False)

  

 

 

 

 

 

标签:Ham,df,Kaggle,tokens,train,test,import,model,Email
From: https://www.cnblogs.com/railgunRG/p/17766585.html

相关文章

  • 学习shamir秘密分享
    介绍1979年Shamir在下文提出基于拉格朗日插值多项式的\((r,n)\)秘密共享方案(\(0<r\leqn\))。秘密拥有者通过构建一元多项式将秘密分为\(n\)份,接收方收集大于等于\(r\)份的子秘密即可重构多项式恢复秘密。方案\((r,n)\)秘密共享方案分为秘密分享和秘密重构两步:秘密分享假......
  • nodemailer实现发送邮件后跳转静态页面
    写了一个静态展示页面,并通过node.js中的nodemailer实现发送邮件服务,发送结束后跳转到其他静态页面。点击查看代码constexpress=require('express');constnodemailer=require('nodemailer');constapp=express();//解析url-encoded格式的表单数据app.use(express......
  • 【DP】ABC273F Hammer 2 题解
    ABC273F一道比较板的区间\(\text{dp}\)。先对坐标离散化,令离散化数组为\(v\)。令\(f_{i,j}\)表示能走到区间\([v_i,v_j]\)的最短路程,显然\(f\)数组初始为\(inf\)。但发现这样无法转移,可以再增加一维\(k\in\{0,1\}\),表示此时在\([v_i,v_j]\)的\(v_i/v_j\)处。......
  • Japanese Student Championship 2019 Qualification
    A-TakahashiCalendar枚举\(m\),再枚举\(d_1\),判断一下是否合法即可。#include<iostream>#include<cstdio>usingnamespacestd;intm,d;intmain(){ scanf("%d%d",&m,&d); intans=0; for(inti=1;i<=m;i++) { for(intd10=2;d10<......
  • 哪个JavaScript混淆工具更好用?测评葡萄牙的JScrambler和中国的JShaman
    两款顶级JavaScript混淆工具测评:JScrambler和JShaman出于JavaScript代码安全需求,JavaScript混淆已经被广泛使用。在这个领域中,有免费的小工具,也有专业、商业级的产品。商业产品在功能强度、保护效果、稳定性等各方面都是全优于免费小工具的。本文将对两款专业、商业JavaScript......
  • 网络拥塞控制算法总结-Chameleon自动调参工具
    快手联合东南大学、清华大学在SIGCOMM'23提交了一篇poster:《Chameleon:AutomaticandAdaptiveTuningforDCQCNParametersinRDMANetworks》,描述了一种可自动调节DCQCN流控参数的工具,企图将复杂、枯燥而又漫长(据文章所属,调参过程可能需要数周)的RDMA调参过程自动化。具体实......
  • 基于pHash+hammingdistance的图片相似度比较
    参考文献图片相似度计算方法总结-知乎(zhihu.com)PythonOpenCV视觉特征提取和匹配-知乎(zhihu.com)图像相似度中的Hash算法-Yumeka-博客园(cnblogs.com)汉明距离及其高效计算方式(zhihu.com)开源仓库https://github.com/python-pillow/Pillowhttps://github.com/cybe......
  • Go每日一库之13:email
    简介程序中时常有发送邮件的需求。有异常情况了需要通知管理员和负责人,用户下单后可能需要通知订单信息,电商平台、中国移动和联通都有每月账单,这些都可以通过邮件来推送。还有我们平时收到的垃圾邮件大都也是通过这种方式发送的......
  • VScode使用git,设置了user.name和user.email,但是仍无法推送代码到仓库的解决办法
    问题写自己项目的时候,想推送一份新的上去,突然间就推送不上去,提示需要设置user.name和user.email解决使用下面的命令检查(如果没值请先设置值):##目标仓库检查(你需要在项目文件夹下打开git)gitconfiguser.namegitconfiguser.email##全局仓库检查gitconfig--globaluser.n......
  • CentOS6.4邮件配置一: postfix + dovecot + mysql + postfixadmin + Roundcubemail
    参考文章:----------------------------[size=large][color=red]可以考虑:[/color][/size]Posty——Postfix和Dovecot的管理工具[url][/url]Posty是一款基于Web的Postfix&Dovecot管理工具,功能模块包括:API、CLI和WebUI。基于Centos6.2X64系......