机器学习(六)-- 支持向量机(SVM)、比较神经网络、支持向量机、贝叶斯三个模型

比较神经网络、支持向量机、贝叶斯三个模型

数据集说明

数据下载地址:UCI Machine Learning Repository
data文件为数据,由逗号分开,names文件为数据说明。data文件可以用excel打开。
70%数据用于训练集,30%是测试集。

WINE数据集

这些数据包括了三种酒中13种不同成分的数量。13种成分分别为:Alcohol,Malicacid,Ash,Alcalinity of ash,Magnesium,Total phenols,Flavanoids,Nonflavanoid phenols,Proanthocyanins,Color intensity,Hue,OD280/OD315 of diluted wines,Proline。在 “wine.data”文件中,每行代表一种酒的样本,共有178个样本;一共有14列,其中,第一列为类标志属性,共有三类,分别记为“1”,“2”,“3”;后面的13列为每个样本的对应属性的样本值。其中第1类有59个样本,第2类有71个样本,第3类有48个样本。

IRIS数据集

Iris也称鸢尾花卉数据集,是一类多重变量分析的数据集。通过花萼长度,花萼宽度,花瓣长度,花瓣宽度4个属性预测鸢尾花卉属于(Setosa,Versicolour,Virginica)三个种类中的哪一类。

代码

其中包含了朴素贝叶斯的高斯模型和伯努利模型,SVM分别使用三种核函数。
在对数据集分割上写的很low,反正数据量不大,就用笨方法来了。可以自行优化。
有个坑是在分训练集和数据集时要先打乱顺序,不然比如红酒数据会没有用到第3类来训练(使用Shuffle),最后测试集都是1或者2类,准确率0.76。。。很难受!-_-!

import matplotlib.pyplot as plt
import pandas as pd
import sklearn.svm as svm
from sklearn.naive_bayes import BernoulliNB
from sklearn.naive_bayes import GaussianNB
from sklearn.neural_network import MLPClassifier
from sklearn.preprocessing import StandardScaler
from sklearn.utils import shuffle

# wine数据集

souce_data = pd.read_csv("D:\python\wine.data")
print("总数据量:{}".format(len(souce_data)))  # 177
print("数据列数:{}".format(souce_data.columns.size))  # 14
souce_data = shuffle(souce_data)  # 数据随机排列
x_train = souce_data.iloc[:125, 1:14]  # 0到124行;1-14列,训练集
y_train = souce_data.iloc[:125, 0]  # 训练结果集
x_test = souce_data.iloc[125:, 1:14]  # 测试集
y_test = souce_data.iloc[125:, 0]  # 测试集的目标结果集

# 数据标准化
scaler = StandardScaler()  # 标准化转换
scaler.fit(x_test)  # 训练标准化对象
x_test_Standard = scaler.transform(x_test)  # 转换数据集
scaler.fit(x_train)  # 训练标准化对象
x_train_Standard = scaler.transform(x_train)  # 转换数据集
y_test1 = y_test.tolist()
print("测试集的目标类别:{}".format(y_test1))
print("测试集的数据量 : ", len(y_test1))
# 绘图
x_list = range(0, len(y_test1))
plt.scatter(x_list, y_test1, s=50)  # 默认形状圆点,颜色b 蓝色,大小50
plt.show()

# print("\n*****1.使用神经网络进行训练*****")
# 神经网络对数据尺度敏感,所以最好在训练前标准化,或者归一化,或者缩放到[-1,1]
bp = MLPClassifier(hidden_layer_sizes=(500, 3), activation='relu', solver='lbfgs', alpha=0.0001, batch_size='auto',
                   learning_rate='constant')
bp.fit(x_train_Standard, y_train.astype('int'))
y_predict_mlp = bp.predict(x_test_Standard)  # 预测的结果集
y_predict_mlp = list(y_predict_mlp)
result_MLPClassifier = sum([1 for n in range(len(y_test1)) if y_predict_mlp[n] == y_test1[n]]) / len(y_test1)
# print("MLP预测准确率:{}".format(sum([1 for n in range(len(y_test1)) if y_predict_mlp[n] == y_test1[n]]) / len(y_test1)))

print("\n*****1.使用朴素贝叶斯进行训练*****")
# 高斯
gauNB = GaussianNB()
gauNB.fit(x_train_Standard, y_train.astype('int'))
y_predict_gau = gauNB.predict(x_test_Standard)
y_predict_gau = list(y_predict_gau)
# print(y_predict_gau)
# 对比结果绘图
x_list = range(0, len(y_test1))
plt.scatter(x_list, y_test1, s=50)  # 默认形状圆点,颜色b 蓝色,大小50
plt.scatter(x_list, y_predict_gau, marker='*', s=50)
plt.legend(['Orig Data', 'Predict Result'])
plt.show()
result_Bayes_Gauss = sum([1 for n in range(len(y_test1)) if y_predict_gau[n] == y_test1[n]]) / len(y_test1)
print("高斯模型预测准确率:{}".format(sum([1 for n in range(len(y_test1)) if y_predict_gau[n] == y_test1[n]]) / len(y_test1)))
# 伯努利
berNB = BernoulliNB()
berNB.fit(x_train_Standard, y_train.astype('int'))
y_predict_ber = berNB.predict(x_test_Standard)
y_predict_ber = list(y_predict_ber)
# print(y_predict_ber)
result_Bayes_Bernoulli = sum([1 for n in range(len(y_test1)) if y_predict_ber[n] == y_test1[n]]) / len(y_test1)
print("伯努利模型预测准确率:{}".format(sum([1 for n in range(len(y_test1)) if y_predict_ber[n] == y_test1[n]]) / len(y_test1)))

print("\n*****2.使用支持向量机进行训练*****")
# 训练svm模型---基于线性核函数
model1 = svm.SVC(kernel='linear')
# 训练svm模型---基于多项式核函数
model2 = svm.SVC(kernel='poly', degree=3)
# 训练svm模型---基于径向基核函数
model3 = svm.SVC(kernel='rbf', C=600)

model1.fit(x_train_Standard, y_train)
y_predict_svm1 = model1.predict(x_test_Standard)
y_predict_svm1 = list(y_predict_svm1)
result_SVM_linear = sum([1 for n in range(len(y_test1)) if y_predict_svm1[n] == y_test1[n]]) / len(y_test1)
print("SVM(基于线性核函数)预测准确率:{}".format(
    sum([1 for n in range(len(y_test1)) if y_predict_svm1[n] == y_test1[n]]) / len(y_test1)))

model2.fit(x_train_Standard, y_train)
y_predict_svm2 = model2.predict(x_test_Standard)
y_predict_svm2 = list(y_predict_svm2)
result_SVM_poly = sum([1 for n in range(len(y_test1)) if y_predict_svm2[n] == y_test1[n]]) / len(y_test1)
print("SVM(基于多项式核函数)预测准确率:{}".format(
    sum([1 for n in range(len(y_test1)) if y_predict_svm2[n] == y_test1[n]]) / len(y_test1)))

model3.fit(x_train_Standard, y_train)
y_predict_svm3 = model3.predict(x_test_Standard)
y_predict_svm3 = list(y_predict_svm3)
result_SVM_rbf = sum([1 for n in range(len(y_test1)) if y_predict_svm3[n] == y_test1[n]]) / len(y_test1)
print("SVM(基于径向基核函数)预测准确率:{}".format(
    sum([1 for n in range(len(y_test1)) if y_predict_svm3[n] == y_test1[n]]) / len(y_test1)))

x_list = [#'MLP'
      'Bayes_Gauss'
    , 'Bayes_Bernoulli'
    , 'SVM_linear'
    , 'SVM_poly'
    , 'SVM_rbf']
y_list = [#result_MLPClassifier
      result_Bayes_Gauss
    , result_Bayes_Bernoulli
    , result_SVM_linear
    , result_SVM_poly
    , result_SVM_rbf]
plt.bar(range(len(x_list)), y_list, 0.4, color='r', alpha=0.8)
plt.xticks(range(len(x_list)), x_list)
# # 为每个条形图添加数值标签
for x, y in enumerate(y_list):
    plt.text(x, y, format(y_list[x], '.2%'), ha='center')
# 显⽰图形
plt.show()

Iris数据集:
(除训练集测试集分割代码不同,其他与第一个数据集几乎一致)

souce_data = pd.read_csv("C:\\Users\\jwj13\\Desktop\\MyCode\\机器学习\\iris.data")
print("数据量:{}".format(len(souce_data)))
print("数据列数:{}".format(souce_data.columns.size))
souce_data = shuffle(souce_data)#数据随机排列
x_train=souce_data.iloc[:105,0:4]#0到104行;前4列,训练集
y_train=souce_data.iloc[:105,4]#训练结果集
x_test=souce_data.iloc[105:,0:4]#测试集
y_test=souce_data.iloc[105:,4]#测试集的目标结果集,第5列

输出结果

1图1 Wine数据集结果

 

 

 


垃圾邮件分类任务中多种机器学习(贝叶斯、支持向量机和随机森林)和深度学习(GloVe和LSTM)方法的应用和对比_Monkey typist的博客-CSDN博客_支持向量机垃圾邮件随着时代的发展,信息以指数形式增长,为了能够从海量信息中迅速找到所需要的信息,就需要对信息进行分类,因此自动文本分类技术应运而生。文本分类其任务是将自然语言文本根据其内容分为预先定义的两类或者多类。文本分类的应用领域极为广泛,垃圾邮件分类就是其中一个很重要的应用。通常我们将“广告促销”等营销邮件判定成垃圾邮件。例如\垃圾邮件分类任务语料\train\Data\001\路径下的067邮件:< TEXT >萬泰商銀特別專案貸款(非 @指成金信用貸款,即使非上班族也能申貸)免保人,免擔保品,https://blog.csdn.net/meyalo/article/details/123638003

【ML】支持向量机(SVM)从入门到放弃再到掌握_半九拾的博客-CSDN博客_支持向量机 通俗

对于LR与SVM的异同我总结如下:
LR的详细介绍:https://blog.csdn.net/b285795298/article/details/88683987

- 相同点:
LR和SVM都是分类算法
LR和SVM都是监督学习算法。
LR和SVM都是判别模型。
如果不考虑核函数,LR和SVM都是线性分类算法,也就是说他们的分类决策面都是线性的。
说明:LR也是可以用核函数的.但LR通常不采用核函数的方法.(计算量太大)
LR和SVM不同点:
1、LR采用log损失,SVM采用合页(hinge)损失。
逻辑回归的损失函数:

支持向量机的目标函数:

​逻辑回归方法基于概率理论,假设样本为1的概率可以用sigmoid函数来表示,然后通过极大似然估计的方法估计出参数的值(基于统计的,其损失函数是人为设定的凸函数) 。支持向量机​基于几何间隔最大化原理,认为存在最大几何间隔的分类面为最优分类面.(有严格的推导)

2、LR对异常值敏感,SVM对异常值不敏感(抗燥能力,SVM要强)(https://www.jianshu.com/p/1a41a1567b87)。支持向量机只考虑局部的边界线附近的点,而逻辑回归考虑全局(远离的点对边界线的确定也起作用,虽然作用会相对小一些)。LR模型找到的那个超平面,是尽量让所有点都远离他,而SVM寻找的那个超平面,是只让最靠近中间分割线的那些点尽量远离,即只用到那些支持向量的样本。

支持向量机改变非支持向量样本并不会引起决策面的变化:


逻辑回归中改变任何样本都会引起决策面的变化:


LR则受所有数据点的影响,如果数据不同类别strongly unbalance,一般需要先对数据做balancing。 

3、计算复杂度不同。对于海量数据,SVM的效率较低,LR效率比较高。 对于两者在feature和样本数量不同的情况下的效率问题,可以参考:https://blog.csdn.net/a244659184/article/details/81122521。该文章说明了:

当样本较少,特征维数较低时,SVM和LR的运行时间均比较短,SVM较短一些。准确率的话,LR明显比SVM要高。当样本稍微增加些时,SVM运行时间开始增长,但是准确率赶超了LR。SVM时间虽长,但在接收范围内。当数据量增长到20000时,特征维数增长到200时,SVM的运行时间剧烈增加,远远超过了LR的运行时间。但是准确率却和LR相差无几。(这其中主要原因是大量非支持向量参与计算,造成SVM的二次规划问题)

4、对非线性问题的处理方式不同,LR主要靠特征构造,必须组合交叉特征,特征离散化。SVM也可以这样,还可以通过kernel(因为只有支持向量参与核计算,计算复杂度不高)。(由于可以利用核函数,。SVM则可以通过对偶求解高效处理。LR则在特征空间维度很高时,表现较差。)

5、SVM的损失函数就自带正则!!!(损失函数中的1/2||w||^2项),这就是为什么SVM是结构风险最小化算法的原因!!!而LR必须另外在损失函数上添加正则项!!!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

四月天03

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值