机器学习/人工智能 实验一:典型监督学习方法分类实践与比较分析

简介: 机器学习/人工智能 实验一:典型监督学习方法分类实践与比较分析

一、实验目的与要求

(1)利用所学习的监督学习方法完成目标识别实验方案的设计。

(2)编程并利用相关软件完成实验测试,得到实验结果。

(3)通过对实验数据的分析﹑整理,方法的对比,得出实验结论,培养学生创新思维和编写实验报告的能力,以及处理一般工程设计技术问题的初步能力及实事求是的科学态度。

(4)利用实验更加直观﹑方便和易于操作的优势,提高学生学习兴趣,让学生自主发挥设计和实施实验,发挥出学生潜在的积极性和创造性。

二、实验内容

(1)采用已经学过的监督学习的方法,如逻辑回归、决策树、神经网络等实现分类任务。

(2)分析比较不同方法的优缺点。

三、实验设备与环境

Windows11系统、Anaconda3、Pycharm Community、Jupyter Notebook、Scikit-learn库

四、设计正文

(包括分析与设计思路、各模块流程图以及带注释的主要算法源码,若有改进或者创新,请描述清楚,并在实验结果分析中对比改进前后的结果并进行分析)

4.1 分析与设计思路


image.png

image.png

对逻辑回归的效果评估,一般采用AUC曲线下面积指标进行评价。

逻辑回归的流程图如图所示。

决策树把数据样本分配到叶子结点确定数据集中样本所属的分类。决策结点表示在样本的一个属性上进行的划分,叶结点表示经过分支到达的类。从根结点出发,每个决策结点进行一次划分,到达叶子结点得到最终的分类结果。


image.png

不断重复以上分裂过程,直到满足以下几个条件之一时,停止分裂生长:样本中的所有数据属于同一标签、已达最大深度、结点中样本数小于某阈值、信息增益小于某阈值(防止过拟合)。

因此,决策树的整体流程如下图所示。

神经网络最基本的成分是神经元,神经元接受多个输入,并利用激活函数输出作为整个神经网络的输出或多层感知机中下一层网络的输入。

image.png

整体流程如下图所示。

在测试各类算法时,需要先读取数据集,将数据集分为训练集与测试集。训练模型,并用模型对测试集数据进行预测,将预测值与真实值比对,得到accuracy值。将预测结果与训练数据的切片绘散点图输出。

4.2 主要算法源码

逻辑回归算法代码如下:

import matplotlib.pyplot as plt
import numpy as np
from sklearn.datasets import load_iris
from sklearn.linear_model import LogisticRegression
from sklearn.metrics import confusion_matrix
from sklearn.model_selection import train_test_split
from sklearn.metrics import plot_confusion_matrix
from mlxtend.plotting import plot_decision_regions
from sklearn import metrics
iris = load_iris()#加载数据集
x_train,x_test,y_train, y_test = train_test_split(iris.data, iris.target, test_size=0.3)#分割数据集
lr = LogisticRegression()#逻辑回归
lr.fit(x_train, y_train)#训练模型
y_pred = lr.predict(x_test)#用模型预测
print('The accuracy of the Logistic Regression is',metrics.accuracy_score(y_pred,y_test))
matrix = plot_confusion_matrix(lr, x_test, y_test,
                                 cmap=plt.cm.Blues,
                                 normalize='true')
plt.title('Confusion matrix for our classifier')
plt.show()#输出混淆矩阵
plt.figure(1, figsize=(8, 6))
#绘制散点图
plt.scatter(x_train[y_train==0,0],x_train[y_train==0,1],color='r',marker='+',label='A型')
plt.scatter(x_train[y_train==1,0],x_train[y_train==1,1],color='g',marker='+',label='B型')
plt.scatter(x_train[y_train==2,0],x_train[y_train==2,1],color='b',marker='+',label='C型')
plt.scatter(x_test[y_pred==0,0],x_test[y_pred==0,1],color='r',label='A型')
plt.scatter(x_test[y_pred==1,0],x_test[y_pred==1,1],color='g',label='B型')
plt.scatter(x_test[y_pred==2,0],x_test[y_pred==2,1],color='b',label='C型')
plt.show()

决策树算法代码如下:

import matplotlib.pyplot as plt
from sklearn.datasets import load_iris
from sklearn import tree      # 导入scikit-learn的tree模块
from sklearn.model_selection import train_test_split
from sklearn.metrics import plot_confusion_matrix
import graphviz
from sklearn import metrics
iris = load_iris()#加载数据集
x_train,x_test,y_train, y_test = train_test_split(iris.data, iris.target, test_size=0.3)#分割数据集
model = tree.DecisionTreeClassifier(criterion='entropy',max_depth=3)#信息熵增益,最大深度为3
model.fit(x_train, y_train)#训练模型
y_pred = model.predict(x_test)#用模型预测
print('The accuracy of the Logistic Regression is',metrics.accuracy_score(y_pred,y_test))
matrix = plot_confusion_matrix(model, x_test, y_test,
                                 cmap=plt.cm.Blues,
                                 normalize='true')
plt.title('Confusion matrix for our classifier')
plt.show()#输出混淆矩阵
plt.figure(1, figsize=(8, 6))
#绘制散点图
plt.scatter(x_train[y_train==0,0],x_train[y_train==0,1],color='r',marker='+',label='A型')
plt.scatter(x_train[y_train==1,0],x_train[y_train==1,1],color='g',marker='+',label='B型')
plt.scatter(x_train[y_train==2,0],x_train[y_train==2,1],color='b',marker='+',label='C型')
plt.scatter(x_test[y_pred==0,0],x_test[y_pred==0,1],color='r',label='A型')
plt.scatter(x_test[y_pred==1,0],x_test[y_pred==1,1],color='g',label='B型')
plt.scatter(x_test[y_pred==2,0],x_test[y_pred==2,1],color='b',label='C型')
plt.show()
#输出决策树
dot_data=tree.export_graphviz(model)
graph = graphviz.Source(dot_data)
graph.render("decisiontree")

神经网络算法代码如下:

from sklearn import datasets
from sklearn.datasets import load_iris
import tensorflow as tf
from sklearn.model_selection import train_test_split
import matplotlib.pyplot as plt
iris = load_iris()#加载数据集
x_train,x_test,y_train, y_test = train_test_split(iris.data, iris.target, test_size=0.2)#分割数据集
w = tf.Variable(tf.random.truncated_normal([4,3],seed=1,stddev=0.1))#随机初始值
b = tf.Variable(tf.random.truncated_normal([  3],seed=1,stddev=0.1))#随机初始值
x_train = tf.cast(x_train,dtype=tf.float32)
x_test  = tf.cast(x_test ,dtype=tf.float32)
train=tf.data.Dataset.from_tensor_slices((x_train,y_train)).batch(32)#batch
test =tf.data.Dataset.from_tensor_slices((x_test, y_test )).batch(32)
epochs=200
alpha=0.2#学习率
history_error=[]#历史损失函数error
history_acc=[]#历史准确率
for _ in range(epochs):
    sumerror=0
    for(x,y) in train:
        with tf.GradientTape() as tape:
            forward_propagation=tf.matmul(x,w)+b#前向传播结果
            forward_propagation=tf.nn.softmax(forward_propagation)#激活前向传播结果
            label_onehot=tf.one_hot(y,depth=3,dtype=tf.float32)#将y转变为onehot编码
            error=tf.reduce_mean(tf.square(label_onehot-forward_propagation))#loss函数
            sumerror+=error.numpy()
        error_grad=tape.gradient(error,[w,b])
        w.assign(w-alpha*error_grad[0])#更新wb
        b.assign(b-alpha*error_grad[1])
    print("train set:epoch:%d error:%f"%(_,sumerror/4))
    truesum=0#总正确数
    testsum=0#测试总数
    for (x,y) in test:
        forward_propagation=tf.matmul(x,w)+b
        forward_propagation=tf.nn.softmax(forward_propagation)
        label=tf.cast(tf.argmax(forward_propagation,axis=1),dtype=y.dtype)
        isaccurate=tf.cast(tf.equal(label,y),dtype=tf.int32)#判断结果
        true=tf.reduce_sum(isaccurate)#正确数
        testsum+=x.shape[0]#测试总数
        truesum+=int(true)#总正确数
    print("test  set:epoch:%d error:%f accuracy:%f"%(_,sumerror/4,truesum/testsum))
    history_error.append(sumerror)
    history_acc.append(truesum/testsum)
plt.title("Loss")
plt.xlabel("Epoch")
plt.ylabel("loss")
plt.plot(history_error)
plt.show()
plt.title("Acc")
plt.xlabel("Epoch")
plt.ylabel("acc")
plt.plot(history_acc)
plt.show()

五、实验结果及分析

逻辑回归运行结果如下,训练集数据点用+号表示,测试集数据点用默认的圆表示。

其准确率为0.97,混淆矩阵如下。

决策树运行结果如下,训练集数据点用+号表示,测试集数据点用默认的圆表示。

其准确率为0.91,混淆矩阵如下。

可以对决策树进行可视化,可视化结果如下。决策树采用信息增益算法,最大深度为3。

神经网络是黑盒,但可以看到损失函数的曲线收敛的过程、准确性逐渐提升的过程如下。

逻辑回归算法的优点是训练速度较快,适合二分类问题,不需要缩放输入特征,可解释性好。缺点是对于非结构化的数据难以自动识别、提取特征。因为模型本身很简单,所以会造成欠拟合等问题,导致模型的准确率不高。

决策树算法的优点是可解释性强,可以很好地处理离散或连续的结构化数据,运行速度快。缺点是容易发生过拟合。

基础神经网络算法的优点是准确率高,可以自动学习各种特征的权重值。缺点是可解释性差,容易发生过拟合,且耗时长。


目录
相关文章
|
25天前
|
机器学习/深度学习 人工智能 自然语言处理
探索人工智能:从基础理论到实践应用
【8月更文挑战第39天】在本文中,我们将深入探讨人工智能(AI)的基本概念、发展历程以及其在现实世界中的应用。我们将首先介绍AI的定义和主要分类,然后回顾其发展历史,最后通过一个实际的代码示例来展示AI的应用。无论你是AI领域的初学者还是有一定基础的学习者,这篇文章都将为你提供有价值的信息和启示。
|
9天前
|
机器学习/深度学习 人工智能 算法
【新闻文本分类识别系统】Python+卷积神经网络算法+人工智能+深度学习+计算机毕设项目+Django网页界面平台
文本分类识别系统。本系统使用Python作为主要开发语言,首先收集了10种中文文本数据集("体育类", "财经类", "房产类", "家居类", "教育类", "科技类", "时尚类", "时政类", "游戏类", "娱乐类"),然后基于TensorFlow搭建CNN卷积神经网络算法模型。通过对数据集进行多轮迭代训练,最后得到一个识别精度较高的模型,并保存为本地的h5格式。然后使用Django开发Web网页端操作界面,实现用户上传一段文本识别其所属的类别。
22 1
【新闻文本分类识别系统】Python+卷积神经网络算法+人工智能+深度学习+计算机毕设项目+Django网页界面平台
|
2天前
|
机器学习/深度学习 算法 自动驾驶
探索机器学习:从理论到实践的旅程
【8月更文挑战第62天】本文通过深入浅出的方式,带领读者走进机器学习的世界。首先介绍了机器学习的基本概念,然后通过一个简单的Python代码示例,展示了如何实现一个基本的线性回归模型。最后,探讨了机器学习在现实生活中的应用,以及未来的发展趋势。本文旨在帮助初学者理解机器学习的基本理念,并激发他们进一步探索这一领域的兴趣。
|
8天前
|
机器学习/深度学习 算法 自动驾驶
探索机器学习:从理论到实践
【9月更文挑战第24天】本文将带你走进机器学习的世界,了解其基本概念,探索其背后的数学原理,并通过Python代码示例,展示如何实现一个简单的线性回归模型。无论你是初学者还是有经验的开发者,都能在这篇文章中找到新的视角和深入的理解。
25 9
|
13天前
|
机器学习/深度学习 人工智能 算法
探索机器学习:从理论到实践
【9月更文挑战第19天】在这篇文章中,我们将深入探讨机器学习的基本概念、主要算法和应用。我们将从理论基础出发,逐步过渡到实际应用,包括代码示例。无论你是初学者还是有经验的开发者,这篇文章都将为你提供有价值的信息和启发。
|
8天前
|
机器学习/深度学习 人工智能 自然语言处理
探索人工智能:从理论到实践
【8月更文挑战第56天】本文将深入探讨人工智能的理论基础,并结合实际案例和代码示例,展示如何将理论知识应用于实践中。我们将从人工智能的定义和分类开始,然后讨论其背后的算法和模型,最后通过一个简单的机器学习项目来演示如何实现和应用这些知识。无论你是初学者还是有经验的开发者,这篇文章都将为你提供有价值的见解和指导。
|
15天前
|
设计模式 人工智能 算法
PHP中的设计模式:策略模式的深入解析与实践软件测试中的人工智能革命:提升效率与准确性的新篇章
在PHP开发中,理解并运用设计模式是提升代码质量和可维护性的重要途径。本文聚焦于策略模式(Strategy Pattern),一种行为型设计模式,它允许在运行时选择算法或业务规则。通过本文,我们将深入探讨策略模式的定义、结构、使用场景以及如何在PHP项目中有效地实现和利用策略模式。不同于性能优化等技术性摘要,本文着重于提供对策略模式全面而实用的理解,助力开发者编写出更加灵活和可扩展的应用程序。 本文深入探讨了人工智能在软件测试领域的应用,揭示了其如何显著提高测试过程的效率和准确性。通过实际案例分析,展示了AI技术在自动化测试、缺陷检测及结果分析中的关键作用,并讨论了实施AI测试策略时面临的挑
17 3
|
17天前
|
机器学习/深度学习 人工智能 自然语言处理
探索机器学习:从理论到实践
【9月更文挑战第15天】本文将深入浅出地介绍机器学习的基本概念,并逐步展开讲解如何通过Python实现一个简单的线性回归模型。我们的目标是为初学者提供一条清晰的学习路径,帮助他们理解机器学习的核心原理,并通过动手实践加深印象。文章分为三个部分:首先,我们将解释机器学习的基础知识;其次,我们将展示如何使用Python和scikit-learn库构建一个线性回归模型;最后,我们将探讨如何评估模型的性能。无论你是机器学习领域的新手还是有一定基础的学习者,这篇文章都将为你提供有价值的见解和实用的技能。
|
23天前
|
机器学习/深度学习 人工智能 自然语言处理
探索人工智能:从理论到实践
本文将带你进入人工智能的世界,从理论到实践,深入浅出地解析人工智能的发展历程、核心技术以及应用场景。无论你是科技爱好者,还是正在寻找新的技术方向,这篇文章都会为你提供有价值的参考。让我们一起探索这个充满无限可能的领域吧!
|
14天前
|
机器学习/深度学习 存储 人工智能
文本情感识别分析系统Python+SVM分类算法+机器学习人工智能+计算机毕业设计
使用Python作为开发语言,基于文本数据集(一个积极的xls文本格式和一个消极的xls文本格式文件),使用Word2vec对文本进行处理。通过支持向量机SVM算法训练情绪分类模型。实现对文本消极情感和文本积极情感的识别。并基于Django框架开发网页平台实现对用户的可视化操作和数据存储。
20 0
文本情感识别分析系统Python+SVM分类算法+机器学习人工智能+计算机毕业设计
下一篇
无影云桌面