Scikit学习垃圾邮件预测代码总是预测相同的结果



代码:垃圾邮件预测


import numpy as np
import pandas as pd
from sklearn.feature_extraction.text import TfidfVectorizer
from sklearn.model_selection import train_test_split
from sklearn.linear_model import LogisticRegression
import matplotlib.pyplot as plt
from sklearn.metrics import accuracy_score

raw_mail_data=pd.read_csv("mail_data.csv")
mail_data=raw_mail_data.where( (pd.notnull(raw_mail_data)),"" )

mail_data.loc[mail_data["Category"]=="spam","Category"]=0
mail_data.loc[mail_data["Category"]=="ham","Category"]=1

X=mail_data["Message"]        
Y=mail_data["Category"]       
X_train, X_test, Y_train, Y_test = train_test_split(X, 
Y, 
test_size=0.2,  
random_state=42)

feature_extraction= TfidfVectorizer(min_df=1,stop_words="english",lowercase="True")


X_train_features=feature_extraction.fit_transform(X_train) 
X_test_features=feature_extraction.transform(X_test) 


Y_train=Y_train.astype('int')
Y_test=Y_test.astype('int')

model = LogisticRegression()
model.fit(X_train_features,Y_train)

prediction_on_training_data=model.predict(X_train_features)
accuracy_on_training_data=accuracy_score(Y_train,prediction_on_training_data)
print("Accuracy on training data:",accuracy_on_training_data)

prediction_on_test_data=model.predict(X_test_features)
accuracy_on_test_data=accuracy_score(Y_test,prediction_on_test_data)
print("Accuracy on test data:",accuracy_on_test_data)

inputs=input("please type a message.")
input_mail=[str(inputs)]
input_data_features=feature_extraction.transform(input_mail)
print("input_data_features:",input_data_features)
prediction=model.predict(input_data_features)
print("prediction:",prediction)
if prediction[0]==1:
print("Normal mail",prediction[0])
elif  prediction[0]==0:
print("spam mail",prediction[0])
else:
print("unknown condition")

即使我输入垃圾邮件内容作为输入(折扣等(,我也无法得到0的结果。(垃圾邮件(代码猜不准。它总是给出1个结果。这是什么原因?训练和测试集的准确率分数看起来正常(%96(。代码编写中的一个错误会一次又一次地导致相同的结果吗?还是应该尝试另一种算法,比如决策树?

我对你的问题有不同的看法。垃圾邮件类在整个数据集中约占13%,这对于训练目的来说绰绰有余,并且可能在垃圾邮件检测问题中很常见。

第一个也是主要的问题是缺乏数据预处理。我浏览了您的数据集,发现有很多拼写错误,这增加了字符数,甚至将整个电子邮件清晰地呈现为垃圾邮件的单词通常拼写不同(FreeMsg,WINNER!!(,这意味着它们将被算法编码为不同的。你需要应用一个引理器并删除标点符号。

其次,我会使用交叉验证来检查具有分层k折叠的模型的结果,该模型考虑了类不平衡,而不是随机的训练/测试划分。另一种选择是对数据集进行欠采样/过采样,但这会产生同样的结果,需要做更多的工作。

在查找其他分类器之前,请尝试这两个建议。逻辑回归应该能够很容易地解决这个

与其使用模型评估的准确性,不如使用一种能很好地处理类不平衡的度量。

看看https://scikit-learn.org/stable/modules/generated/sklearn.metrics.balanced_accuracy_score.html

如果平均每个类的精度,那么也会优化具有少量样本的类。

只使用准确性,你的分类器能学到的最好的东西就是总是说:没有垃圾邮件。(因为毕竟,大多数邮件都不是垃圾邮件。(

最新更新