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

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

一、实验目的与要求

(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。

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

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

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

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


目录
相关文章
|
7月前
|
机器学习/深度学习 数据采集 算法
量子机器学习入门:三种数据编码方法对比与应用
在量子机器学习中,数据编码方式决定了量子模型如何理解和处理信息。本文详解角度编码、振幅编码与基础编码三种方法,分析其原理、实现及适用场景,帮助读者选择最适合的编码策略,提升量子模型性能。
555 8
|
机器学习/深度学习 数据采集 算法
Java 大视界 -- Java 大数据机器学习模型在金融衍生品定价中的创新方法与实践(166)
本文围绕 Java 大数据机器学习模型在金融衍生品定价中的应用展开,分析定价现状与挑战,阐述技术原理与应用,结合真实案例与代码给出实操方案,助力提升金融衍生品定价的准确性与效率。
Java 大视界 -- Java 大数据机器学习模型在金融衍生品定价中的创新方法与实践(166)
|
人工智能 算法 计算机视觉
【01】opencv项目实践第一步opencv是什么-opencv项目实践-opencv完整入门以及项目实践介绍-opencv以土壤和水滴分离的项目实践-人工智能AI项目优雅草卓伊凡
【01】opencv项目实践第一步opencv是什么-opencv项目实践-opencv完整入门以及项目实践介绍-opencv以土壤和水滴分离的项目实践-人工智能AI项目优雅草卓伊凡
514 63
【01】opencv项目实践第一步opencv是什么-opencv项目实践-opencv完整入门以及项目实践介绍-opencv以土壤和水滴分离的项目实践-人工智能AI项目优雅草卓伊凡
|
机器学习/深度学习 存储 设计模式
特征时序化建模:基于特征缓慢变化维度历史追踪的机器学习模型性能优化方法
本文探讨了数据基础设施设计中常见的一个问题:数据仓库或数据湖仓中的表格缺乏构建高性能机器学习模型所需的历史记录,导致模型性能受限。为解决这一问题,文章介绍了缓慢变化维度(SCD)技术,特别是Type II类型的应用。通过SCD,可以有效追踪维度表的历史变更,确保模型训练数据包含完整的时序信息,从而提升预测准确性。文章还从数据工程师、数据科学家和产品经理的不同视角提供了实施建议,强调历史数据追踪对提升模型性能和业务洞察的重要性,并建议采用渐进式策略逐步引入SCD设计模式。
504 8
特征时序化建模:基于特征缓慢变化维度历史追踪的机器学习模型性能优化方法
|
机器学习/深度学习 人工智能 算法
机器学习算法的优化与改进:提升模型性能的策略与方法
机器学习算法的优化与改进:提升模型性能的策略与方法
2431 13
机器学习算法的优化与改进:提升模型性能的策略与方法
|
机器学习/深度学习 传感器 运维
使用机器学习技术进行时间序列缺失数据填充:基础方法与入门案例
本文探讨了时间序列分析中数据缺失的问题,并通过实际案例展示了如何利用机器学习技术进行缺失值补充。文章构建了一个模拟的能源生产数据集,采用线性回归和决策树回归两种方法进行缺失值补充,并从统计特征、自相关性、趋势和季节性等多个维度进行了详细评估。结果显示,决策树方法在处理复杂非线性模式和保持数据局部特征方面表现更佳,而线性回归方法则适用于简单的线性趋势数据。文章最后总结了两种方法的优劣,并给出了实际应用建议。
854 7
使用机器学习技术进行时间序列缺失数据填充:基础方法与入门案例
|
6月前
|
机器学习/深度学习 数据采集 人工智能
【机器学习算法篇】K-近邻算法
K近邻(KNN)是一种基于“物以类聚”思想的监督学习算法,通过计算样本间距离,选取最近K个邻居投票决定类别。支持多种距离度量,如欧式、曼哈顿、余弦相似度等,适用于分类与回归任务。结合Scikit-learn可高效实现,需合理选择K值并进行数据预处理,常用于鸢尾花分类等经典案例。(238字)
|
11月前
|
机器学习/深度学习 数据采集 人工智能
20分钟掌握机器学习算法指南
在短短20分钟内,从零开始理解主流机器学习算法的工作原理,掌握算法选择策略,并建立对神经网络的直观认识。本文用通俗易懂的语言和生动的比喻,帮助你告别算法选择的困惑,轻松踏入AI的大门。
761 8
|
机器学习/深度学习 存储 Kubernetes
【重磅发布】AllData数据中台核心功能:机器学习算法平台
杭州奥零数据科技有限公司成立于2023年,专注于数据中台业务,维护开源项目AllData并提供商业版解决方案。AllData提供数据集成、存储、开发、治理及BI展示等一站式服务,支持AI大模型应用,助力企业高效利用数据价值。
|
机器学习/深度学习 人工智能 自然语言处理
AI训练师入行指南(三):机器学习算法和模型架构选择
从淘金到雕琢,将原始数据炼成智能珠宝!本文带您走进数字珠宝工坊,用算法工具打磨数据金砂。从基础的经典算法到精密的深度学习模型,结合电商、医疗、金融等场景实战,手把手教您选择合适工具,打造价值连城的智能应用。掌握AutoML改装套件与模型蒸馏术,让复杂问题迎刃而解。握紧算法刻刀,为数字世界雕刻文明!
447 6
下一篇
开通oss服务