当前位置:   article > 正文

(决策树,朴素贝叶斯,人工神经网络)实现鸢尾花数据集分类_朴素贝叶斯算法鸢尾花数据集分类

朴素贝叶斯算法鸢尾花数据集分类
  1. from sklearn.datasets import load_iris # 导入方法类
  2. iris = load_iris() #导入数据集iris
  3. iris_feature = iris.data #特征数据
  4. iris_target = iris.target #分类数据
  5. print (iris.data) #输出数据集
  6. print (iris.target) #输出真实标签
  7. print (len(iris.target) )
  8. print (iris.data.shape ) #150个样本 每个样本4个特征
  9. from sklearn.tree import DecisionTreeClassifier #导入决策树DTC包
  10. from sklearn.datasets import load_iris # 导入方法类
  11. iris = load_iris() #导入数据集iris
  12. iris_feature = iris.data #特征数据
  13. iris_target = iris.target #分类数据
  14. clf1 = DecisionTreeClassifier() # 所以参数均置为默认状态
  15. clf1.fit(iris.data, iris.target) # 使用训练集训练模型
  16. #print(clf)
  17. predicted = clf1.predict(iris.data)
  18. #print(predicted)
  19. # print("使用决策树算法:")
  20. # print("精度是:{:.3f}".format(clf.score(iris.data, iris.target)))
  21. # viz code 可视化 制作一个简单易读的PDF
  22. iris = load_iris() #导入数据集iris
  23. iris_feature = iris.data #特征数据
  24. iris_target = iris.target #分类数据
  25. clf = DecisionTreeClassifier() # 所以参数均置为默认状态
  26. clf.fit(iris.data, iris.target) # 使用训练集训练模型
  27. #print(clf)
  28. predicted = clf.predict(iris.data)
  29. #print(predicted)
  30. # 获取花卉两列数据集
  31. X = iris.data
  32. L1 = [x[0] for x in X]
  33. #print(L1)
  34. L2 = [x[1] for x in X]#输出放在最后方便对比
  35. #使用朴素贝叶斯算法对鸢尾花数据集分类
  36. from sklearn import datasets
  37. from sklearn.model_selection import train_test_split
  38. from sklearn.naive_bayes import MultinomialNB, GaussianNB
  39. import matplotlib.pyplot as plt
  40. import numpy as np
  41. import matplotlib as mpl
  42. from sklearn.preprocessing import StandardScaler
  43. from sklearn.pipeline import Pipeline
  44. iris = datasets.load_iris() # 加载鸢尾花数据
  45. iris_x = iris.data # 获取数据
  46. # print(iris_x)
  47. iris_x = iris_x[:, :2] # 取前两个特征值
  48. # print(iris_x)
  49. iris_y = iris.target # 0, 1, 2
  50. x_train, x_test, y_train, y_test = train_test_split(iris_x, iris_y, test_size=0.75, random_state=1) # 对数据进行分类 一部分最为训练一部分作为测试
  51. # clf = GaussianNB()
  52. # ir = clf.fit(x_train, y_train)
  53. clf = Pipeline([
  54. ('sc', StandardScaler()),
  55. ('clf', GaussianNB())]) # 管道这个没深入理解 所以不知所以然
  56. ir = clf.fit(x_train, y_train.ravel()) # 利用训练数据进行拟合
  57. # 画图:
  58. y_hat1 = ir.predict(x_test)
  59. result = y_hat1 == y_test
  60. print(result)
  61. acc1 = np.mean(result)
  62. # print("使用决策树算法:")
  63. # print('准确度: %.2f%%' % (100 * acc))
  64. #人工神经网络算法对鸢尾花分类
  65. import tensorflow as tf
  66. from sklearn import datasets
  67. from matplotlib import pyplot as plt
  68. import numpy as np
  69. # 导入数据,分别为输入特征和标签
  70. x_data = datasets.load_iris().data
  71. y_data = datasets.load_iris().target
  72. # 随机打乱数据(因为原始数据是顺序的,顺序不打乱会影响准确率)
  73. # seed: 随机数种子,是一个整数,当设置之后,每次生成的随机数都一样(为方便教学,以保每位同学结果一致)
  74. np.random.seed(116) # 使用相同的seed,保证输入特征和标签一一对应
  75. np.random.shuffle(x_data)
  76. np.random.seed(116)
  77. np.random.shuffle(y_data)
  78. tf.random.set_seed(116)
  79. # 将打乱后的数据集分割为训练集和测试集,训练集为前120行,测试集为后30行
  80. x_train = x_data[:-30]
  81. y_train = y_data[:-30]
  82. x_test = x_data[-30:]
  83. y_test = y_data[-30:]
  84. # 转换x的数据类型,否则后面矩阵相乘时会因数据类型不一致报错
  85. x_train = tf.cast(x_train, tf.float32)
  86. x_test = tf.cast(x_test, tf.float32)
  87. # from_tensor_slices函数使输入特征和标签值一一对应。(把数据集分批次,每个批次batch组数据)
  88. train_db = tf.data.Dataset.from_tensor_slices((x_train, y_train)).batch(32)
  89. test_db = tf.data.Dataset.from_tensor_slices((x_test, y_test)).batch(32)
  90. # 生成神经网络的参数,4个输入特征故,输入层为4个输入节点;因为3分类,故输出层为3个神经元
  91. # 用tf.Variable()标记参数可训练
  92. # 使用seed使每次生成的随机数相同(方便教学,使大家结果都一致,在现实使用时不写seed)
  93. w1 = tf.Variable(tf.random.truncated_normal([4, 3], stddev=0.1, seed=1))
  94. b1 = tf.Variable(tf.random.truncated_normal([3], stddev=0.1, seed=1))
  95. lr = 0.1 # 学习率为0.1
  96. train_loss_results = [] # 将每轮的loss记录在此列表中,为后续画loss曲线提供数据
  97. test_acc = [] # 将每轮的acc记录在此列表中,为后续画acc曲线提供数据
  98. epoch = 200 # 循环500轮
  99. loss_all = 0 # 每轮分4个step,loss_all记录四个step生成的4个loss的和
  100. # 训练部分
  101. for epoch in range(epoch): #数据集级别的循环,每个epoch循环一次数据集
  102. for step, (x_train, y_train) in enumerate(train_db): #batch级别的循环 ,每个step循环一个batch
  103. with tf.GradientTape() as tape: # with结构记录梯度信息
  104. y = tf.matmul(x_train, w1) + b1 # 神经网络乘加运算
  105. y = tf.nn.softmax(y) # 使输出y符合概率分布(此操作后与独热码同量级,可相减求loss)
  106. y_ = tf.one_hot(y_train, depth=3) # 将标签值转换为独热码格式,方便计算loss和accuracy
  107. loss = tf.reduce_mean(tf.square(y_ - y)) # 采用均方误差损失函数mse = mean(sum(y-out)^2)
  108. loss_all += loss.numpy() # 将每个step计算出的loss累加,为后续求loss平均值提供数据,这样计算的loss更准确
  109. # 计算loss对各个参数的梯度
  110. grads = tape.gradient(loss, [w1, b1])
  111. # 实现梯度更新 w1 = w1 - lr * w1_grad b = b - lr * b_grad
  112. w1.assign_sub(lr * grads[0]) # 参数w1自更新
  113. b1.assign_sub(lr * grads[1]) # 参数b自更新
  114. # 每个epoch,打印loss信息
  115. print("Epoch {}, loss: {}".format(epoch, loss_all/4))
  116. train_loss_results.append(loss_all / 4) # 将4个step的loss求平均记录在此变量中
  117. loss_all = 0 # loss_all归零,为记录下一个epoch的loss做准备
  118. # 测试部分
  119. # total_correct为预测对的样本个数, total_number为测试的总样本数,将这两个变量都初始化为0
  120. total_correct, total_number = 0, 0
  121. for x_test, y_test in test_db:
  122. # 使用更新后的参数进行预测
  123. y = tf.matmul(x_test, w1) + b1
  124. y = tf.nn.softmax(y)
  125. pred = tf.argmax(y, axis=1) # 返回y中最大值的索引,即预测的分类
  126. # 将pred转换为y_test的数据类型
  127. pred = tf.cast(pred, dtype=y_test.dtype)
  128. # 若分类正确,则correct=1,否则为0,将bool型的结果转换为int型
  129. correct = tf.cast(tf.equal(pred, y_test), dtype=tf.int32)
  130. # 将每个batch的correct数加起来
  131. correct = tf.reduce_sum(correct)
  132. # 将所有batch中的correct数加起来
  133. total_correct += int(correct)
  134. # total_number为测试的总样本数,也就是x_test的行数,shape[0]返回变量的行数
  135. total_number += x_test.shape[0]
  136. # 总的准确率等于total_correct/total_number
  137. acc = total_correct / total_number
  138. test_acc.append(acc)
  139. print("使用人工神经网络对鸢尾花数据集分类:")
  140. print("Test_acc:", acc)
  141. print("--------------------------")
  142. print("使用决策树算法:")
  143. print("精度是:{:.3f}".format(clf1.score(iris.data, iris.target)))
  144. print("使用朴素贝叶斯算法:")
  145. print('准确度: %.2f%%' % (100 * acc1))
  146. # 绘制 loss 曲线
  147. plt.subplot(221)
  148. plt.scatter(X[:50, 0], X[:50, 1], color='red', marker='o', label='setosa')
  149. plt.scatter(X[50:100, 0], X[50:100, 1], color='blue', marker='x', label='versicolor')
  150. plt.scatter(X[100:, 0], X[100:, 1], color='green', marker='s', label='Virginica')
  151. plt.title("DTC")
  152. plt.xlabel('Sepal length')
  153. plt.ylabel('Sepal width')
  154. plt.xticks(())
  155. plt.yticks(())
  156. x1_max, x1_min = max(x_test[:, 0]), min(x_test[:, 0]) # 取0列特征得最大最小值
  157. x2_max, x2_min = max(x_test[:, 1]), min(x_test[:, 1]) # 取1列特征得最大最小值
  158. t1 = np.linspace(x1_min, x1_max, 500) # 生成500个测试点
  159. t2 = np.linspace(x2_min, x2_max, 500)
  160. x1, x2 = np.meshgrid(t1, t2) # 生成网格采样点
  161. x_test1 = np.stack((x1.flat, x2.flat), axis=1)
  162. y_hat = ir.predict(x_test1) # 预测
  163. mpl.rcParams['font.sans-serif'] = [u'simHei'] # 识别中文保证不乱吗
  164. mpl.rcParams['axes.unicode_minus'] = False
  165. cm_light = mpl.colors.ListedColormap(['#77E0A0', '#FF8080', '#A0A0FF']) # 测试分类的颜色
  166. cm_dark = mpl.colors.ListedColormap(['g', 'r', 'b']) # 样本点的颜色
  167. plt.subplot(222)
  168. plt.pcolormesh(x1, x2, y_hat.reshape(x1.shape), cmap=cm_light) # y_hat 25000个样本点的画图,
  169. plt.scatter(x_test[:, 0], x_test[:, 1], edgecolors='k', s=50, c=y_test, cmap=cm_dark) # 测试数据的真实的样本点(散点) 参数自行百度
  170. plt.xlabel(u'花萼长度', fontsize=14)
  171. plt.ylabel(u'花萼宽度', fontsize=14)
  172. plt.title(u'GaussianNB对鸢尾花数据的分类结果', fontsize=18)
  173. plt.grid(True)
  174. plt.xlim(x1_min, x1_max)
  175. plt.ylim(x2_min, x2_max)
  176. #
  177. #
  178. plt.title('Loss Function Curve') # 图片标题
  179. plt.xlabel('Epoch') # x轴变量名称
  180. plt.ylabel('Loss') # y轴变量名称
  181. plt.subplot(223)
  182. plt.plot(train_loss_results, label="$Loss$") # 逐点画出trian_loss_results值并连线,连线图标是Loss
  183. plt.legend() # 画出曲线图标 # 画出图像
  184. # 绘制 Accuracy 曲线
  185. plt.subplot(224)
  186. plt.title('Acc Curve') # 图片标题
  187. plt.xlabel('Epoch') # x轴变量名称
  188. plt.ylabel('Acc') # y轴变量名称
  189. # plt.subplot(224)
  190. plt.plot(test_acc, label="$Accuracy$") # 逐点画出test_acc值并连线,连线图标是Accuracy
  191. plt.legend()
  192. plt.show()

实验结果截图:

 

对比总结:

别问,问就是百度,算法原理咱也不太懂,唉。。。。。 

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/花生_TL007/article/detail/340772
推荐阅读
相关标签
  

闽ICP备14008679号