机器学习——垃圾邮件识别——SVM、MNB模型使用

本次案例采用SVM、MNB模型进行对比

用Accuracy、F1 Score进行评估

话不多说直接上代码包括数据集下载

CSDNicon-default.png?t=M276https://mp.csdn.net/mp_download/manage/download/UpDetailed


# 读取数据并用空字符串替换空值
df1 = pd.read_csv("spamham.csv")
df = df1.where((pd.notnull(df1)), '')

# 将垃圾邮件分类为 0,将非垃圾邮件分类为 1
df.loc[df["Category"] == 'ham', "Category",] = 1
df.loc[df["Category"] == 'spam', "Category",] = 0
# 将数据拆分为标签和文本。系统应该能够根据文本预测标签
df_x = df['Message']
df_y = df['Category']
# 拆分表格 - 80% 用于训练,20% 用于测试大小
x_train, x_test, y_train, y_test = train_test_split(df_x, df_y, train_size=0.8, test_size=0.2, random_state=4)

# 使用 Tfidf 矢量化器 进行特征提取、小写转换和停用词去除
tfvec = TfidfVectorizer(min_df=1, stop_words='english', lowercase=True)
x_trainFeat = tfvec.fit_transform(x_train)
x_testFeat = tfvec.transform(x_test)

# SVM 用于建模
y_trainSvm = y_train.astype('int')
classifierModel = LinearSVC()
classifierModel.fit(x_trainFeat, y_trainSvm)
predResult = classifierModel.predict(x_testFeat)

# GNB 用于建模
y_trainGnb = y_train.astype('int')
classifierModel2 = MultinomialNB()
classifierModel2.fit(x_trainFeat, y_trainGnb)
predResult2 = classifierModel2.predict(x_testFeat)

# 计算精度,转换为 int - 解决 - 无法处理未知和二进制的混合
y_test = y_test.astype('int')
#actual_Y = y_test.as_matrix()

print("~~~~~~~~~~SVM RESULTS~~~~~~~~~~")
#使用 SVM 的准确度得分
print("Accuracy Score : {0:.4f}".format(accuracy_score(y_test, predResult)*100))
#使用 SVM 的 FScore
print("F Score: {0: .4f}".format(f1_score(y_test, predResult, average='macro')*100))
cmSVM=confusion_matrix(y_test, predResult)
#“[真阴性假阳性\假阴性真阳性]”
print("Confusion matrix:")
print(cmSVM)


print("~~~~~~~~~~MNB RESULTS~~~~~~~~~~")
#使用 MNB 的准确度得分
print("Accuracy Score: {0:.4f}".format(accuracy_score(y_test, predResult2)*100))
#使用 MNB 的 FScore
print("F Score:{0: .4f}".format(f1_score(y_test, predResult2, average='macro')*100))
cmMNb=confusion_matrix(y_test, predResult2)
#“[真阴性假阳性\假阴性真阳性]”
print("Confusion matrix:")
print(cmMNb)

运行结果: 

机器学习——垃圾邮件识别——SVM、MNB模型使用_第1张图片

总结:

标称型:标称型目标变量的结果只在有限目标集中取值,如真与假(标称型目标变量主要用于分类)

数值型:数值型目标变量则可以从无限的数值集合中取值,如0.100,42.001等 (数值型目标变量主要用于回归分析)

朴素贝叶斯

优点:在数据较少的情况下仍然有效,可以处理多类别问题。
缺点:对于输入数据的准备方式较为敏感。
适用数据类型:标称型数据

一般流程:
(1) 收集数据:可以使用任何方法。
(2) 准备数据:需要数值型或者布尔型数据。
(3) 分析数据:有大量特征时,绘制特征作用不大,此时使用直方图效果更好。
(4) 训练算法:计算不同的独立特征的条件概率。
(5) 测试算法:计算错误率。
(6) 使用算法:一个常见的朴素贝叶斯应用是文档分类。可以在任意的分类场景中使用朴
素贝叶斯分类器,不一定非要是文本。

支持向量机

优点:泛化错误率低,计算开销不大,结果易解释。
缺点:对参数调节和核函数的选择敏感,原始分类器不加修改仅适用于处理二类问题。
适用数据类型:数值型和标称型数据。

一般流程:
(1) 收集数据:可以使用任意方法。 
(2) 准备数据:需要数值型数据。 
(3) 分析数据:有助于可视化分隔超平面。 
(4) 训练算法:SVM的大部分时间都源自训练,该过程主要实现两个参数的调优。 
(5) 测试算法:十分简单的计算过程就可以实现。 
(6) 使用算法:几乎所有分类问题都可以使用SVM,值得一提的是,SVM本身是一个二类
分类器,对多类问题应用SVM需要对代码做一些修改。

你可能感兴趣的:(机器学习,python,sklearn,机器学习,人工智能)