金融做网站,网站一天要发多少外链,旅游资讯网站建设方案,如何开网站需要多少钱文章目录 Ⅰ、项目任务要求任务描述#xff1a;主要任务要求(必须完成以下内容但不限于这些内容)#xff1a; II、实现过程数据集描述实验运行环境描述KNN模型决策树模型朴素贝叶斯模型SVM模型不同方法对MNIST数据集分类识别结果分析(不同方法识别对比率表及结果分析) 完整代… 文章目录 Ⅰ、项目任务要求任务描述主要任务要求(必须完成以下内容但不限于这些内容) II、实现过程数据集描述实验运行环境描述KNN模型决策树模型朴素贝叶斯模型SVM模型不同方法对MNIST数据集分类识别结果分析(不同方法识别对比率表及结果分析) 完整代码I完整代码IIautoDL运行 用PyTorch实现MNIST手写数字识别最新非常详细 Ⅰ、项目任务要求
任务描述 图像识别Image Recognition是指利用计算机对图像进行处理、分析和理解以识别各种不同模式的目标和对象的技术。 图像识别的发展经历了三个阶段文字识别、数字图像处理与识别、物体识别。机器学习领域一般将此类识别问题转化为分类问题。 手写识别是常见的图像识别任务。计算机通过手写体图片来识别出图片中的字与印刷字体不同的是不同人的手写体风格迥异大小不一造成了计算机对手写识别任务的一些困难。 数字手写体识别由于其有限的类别0~9共10个数字成为了相对简单的手写识别任务。 此实验内容分别采用决策树、KNN、朴素贝叶斯、SVM、BP、softmax、adaboost、袋装八种浅层学习分类方法中的任意二种方法适于二人组或 三种适于三人组对MNIST公共数据集、HWDG私有数据集进行分类并写出实验结果分析。 说明也可以多选方法做比如四种、五种等。
主要任务要求(必须完成以下内容但不限于这些内容)
1、采用MNIST公共数据集或采用HWDG数据集为私有数据集用爬虫工具或手工制作有0-9手写数字共10类样本总数不少于60个(相当于找60个人每人都手写0-9数字分别做好标签存成图片后再制成样本集。)2、简述算法思想和实现原理。3、写出实验结果分析 (1) 数据集描述。包括数据集介绍、训练集和测试集介绍等。 (2) 实验运行环境描述。如开发平台、编程语言、调参情况等。 (3) 不同方法对MNIST数据集分类识别结果分析(不同方法识别对比率表及结果分析)例如 (4) 不同方法对HWDG数据集分类识别结果分析(不同方法识别率对比表及结果分析)。结果对比表如上表格式所示。 II、实现过程
数据集描述
MNIST是一个包含数字0~9的手写体图片数据集图片已归一化为以手写数 字为中心的28*28规格的图片。MNIST由训练集与测试集两个部分组成各部分 规模如下 训练集60,000个手写体图片及对应标签测试集10,000个手写体图片及对应标签
import numpy as np
from sklearn.neighbors import KNeighborsClassifier
from sklearn.metrics import accuracy_scoreimport torch
import numpy as np
from matplotlib import pyplot as plt
from torch.utils.data import DataLoader
from torchvision import transforms
from torchvision import datasets
import torch.nn.functional as F
卷积运算 使用mnist数据集和10-411类似的只是这里1.输出训练轮的acc 2.模型上使用torch.nn.Sequential# Super parameter ------------------------------------------------------------------------------------
batch_size 64
learning_rate 0.01
momentum 0.5
EPOCH 10# Todo数据集准备 ------------------------------------------------------------------------------------
transform transforms.Compose([transforms.ToTensor(), transforms.Normalize((0.1307,), (0.3081,))])
# softmax归一化指数函数(https://blog.csdn.net/lz_peter/article/details/84574716),其中0.1307是mean均值和0.3081是std标准差train_dataset datasets.MNIST(root./data/demo2, trainTrue, transformtransform,downloadTrue) # 本地没有就加上downloadTrue
test_dataset datasets.MNIST(root./data/demo2, trainFalse, transformtransform,downloadTrue) # trainTrue训练集False测试集
train_loader DataLoader(train_dataset, batch_sizebatch_size, shuffleTrue)
test_loader DataLoader(test_dataset, batch_sizebatch_size, shuffleFalse)# 展示数据12个
fig plt.figure()
for i in range(12):plt.subplot(3, 4, i 1)plt.tight_layout()plt.imshow(train_dataset.train_data[i], cmapgray, interpolationnone)plt.title(Labels: {}.format(train_dataset.train_labels[i]))plt.xticks([])plt.yticks([])
plt.show()实验运行环境描述
开发平台autoDL,3080编程语言python调参情况见实验过程运行时间4h KNN模型
KNN模型简介 KNNK-Nearest Neighbors算法是一种基本的机器学习方法用于分类和回归问题。它的核心思想是如果一个样本在特征空间中的k个最相似即特征空间中最邻近的样本中的大多数属于某一个类别则该样本也属于这个类别。KNN算法的步骤包括计算待分类样本与训练集中样本的距离选取距离最近的k个样本根据这k个样本的类别进行投票分类问题或求平均回归问题将得票最多的类别或平均值作为待分类样本的预测类别或值。
优点简单易懂适用于小规模数据集不需要训练过程适用于多种类型的数据数值型、离散型等。缺点计算复杂度高尤其在高维数据集上存储空间大对异常值敏感。
总之KNN是一种直观、易于理解的算法但在处理大规模高维度数据时性能可能受限。
调整的参数 KNN模型主要用到一个参数即K值它表示在预测时要考虑多少个最近邻居的信息。K值的选择对KNN模型的性能有很大影响。较小的K值会使模型更加敏感容易受到噪声的影响而较大的K值会使模型更加平滑减小了波动。
选择合适的K值通常使用交叉验证Cross Validation的方法。在交叉验证中将训练数据分成多个折叠folds然后使用其中一部分数据作为验证集剩余的部分作为训练集多次训练模型并计算模型在验证集上的性能。通过比较不同K值下模型的性能选择在验证集上性能最好的K值。
除了K值KNN模型还可以使用不同的距离度量方法。在默认情况下通常使用欧氏距离Euclidean distance作为距离度量但可以根据具体问题选择其他距离度量方法例如曼哈顿距离Manhattan distance或闵可夫斯基距离Minkowski distance等。不同的距离度量方法会影响模型的性能因此在选择距离度量方法时也需要进行实验和比较。
# 准备数据
X_train train_dataset.train_data.numpy().reshape(-1, 28 * 28) # 将图像展平成一维数组
y_train train_dataset.train_labels.numpy()
X_test test_dataset.test_data.numpy().reshape(-1, 28 * 28)
y_test test_dataset.test_labels.numpy()# 初始化并训练KNN模型
knn_classifier KNeighborsClassifier(n_neighbors3) # 选择邻居数为3
knn_classifier.fit(X_train, y_train)# 预测并评估模型
y_pred knn_classifier.predict(X_test)
accuracy accuracy_score(y_test, y_pred)
print(KNN 模型在测试集上的准确率: {:.2f}%.format(accuracy * 100))决策树模型
决策树模型简介 决策树模型是一种用于解决分类和回归问题的机器学习算法模拟人类决策过程。它通过一系列特征判断将数据集分割成不同子集最终确定数据属于哪个类别或预测数值。决策树由节点、边和叶节点组成通过选择特征、递归划分和叶节点分类或回归构建。具有易解释性和适用性广泛的特点但需要注意防止过拟合问题。
调整的参数 决策树模型有许多参数可以调整不同的参数设置可以影响模型的性能和泛化能力。以下是一些常见的决策树模型参数你可以根据具体的问题和数据集来调整它们 树的深度max_depth 决定树的最大深度。如果设置得太大容易过拟合设置得太小容易欠拟合。 最小分割样本数min_samples_split 一个节点在分裂前必须有的最小样本数。如果节点的样本数少于这个值就不会再分裂。 叶节点的最小样本数min_samples_leaf 一个叶节点必须有的最小样本数。如果一个叶节点的样本数少于这个值该叶节点会和兄弟节点一起被剪枝。 最大特征数max_features 在寻找最佳分割时考虑的特征数。可以是固定的整数也可以是一个比例。 节点分裂的标准criterion 衡量节点纯度的方法可以是基尼指数‘gini’或信息增益‘entropy’。 决策树数量n_estimators 仅在集成方法如随机森林中使用指定树的数量。 学习率learning_rate 仅在梯度提升树Gradient Boosting Trees中使用控制每棵树的贡献程度。 子采样比例subsample 仅在梯度提升树中使用表示每棵树所使用的样本比例。 正则化参数alpha 控制树的复杂度用于防止过拟合。
这些参数的最佳取值通常依赖于具体的数据集和问题。可以使用交叉验证等技术来选择最佳的参数组合以提高模型的性能和泛化能力。
print(Training Decision Tree Classifier...)
decision_tree_classifier DecisionTreeClassifier(random_state42)
decision_tree_classifier.fit(X_train, y_train)# Predict and evaluate the model
y_pred decision_tree_classifier.predict(X_test)
accuracy accuracy_score(y_test, y_pred)
print(Decision Tree Classifier Accuracy: {:.2f}%.format(accuracy * 100))朴素贝叶斯模型 SVM模型 不同方法对MNIST数据集分类识别结果分析(不同方法识别对比率表及结果分析)
评估模型方法准确率 分类结果分析
完整代码I
import numpy as np
import torch
import torchvision
import torch.nn.functional as F
from sklearn.neighbors import KNeighborsClassifier
from torch.utils.data import DataLoader
from torchvision import transforms
from torchvision import datasets
from sklearn.tree import DecisionTreeClassifier
from sklearn.model_selection import StratifiedKFold, GridSearchCV
from sklearn.metrics import accuracy_score
from sklearn.naive_bayes import GaussianNB
from sklearn.svm import SVC
import matplotlib.pyplot as plt# 超参数
batch_size 64
learning_rate 0.01
momentum 0.5
EPOCH 10# 数据集准备
transform transforms.Compose([transforms.ToTensor(), transforms.Normalize((0.1307,), (0.3081,))])
train_dataset datasets.MNIST(root./data/demo2, trainTrue, transformtransform, downloadTrue)
test_dataset datasets.MNIST(root./data/demo2, trainFalse, transformtransform, downloadTrue)
train_loader DataLoader(train_dataset, batch_sizebatch_size, shuffleTrue)
test_loader DataLoader(test_dataset, batch_sizebatch_size, shuffleFalse)# 数据准备
X_train train_dataset.train_data.numpy().reshape(-1, 28 * 28)
y_train train_dataset.train_labels.numpy()
X_test test_dataset.test_data.numpy().reshape(-1, 28 * 28)
y_test test_dataset.test_labels.numpy()# 决策树模型参数调优
decision_tree_classifier DecisionTreeClassifier(random_state42)
param_grid_dt {max_depth: [3, 5, 7, 9],min_samples_split: [2, 5, 10],min_samples_leaf: [1, 2, 4]
}
cv StratifiedKFold(n_splits5, random_state42, shuffleTrue)
grid_search_dt GridSearchCV(estimatordecision_tree_classifier, param_gridparam_grid_dt, cvcv)
grid_search_dt.fit(X_train, y_train)
best_decision_tree_classifier grid_search_dt.best_estimator_# 朴素贝叶斯模型参数调优
naive_bayes_classifier GaussianNB()
param_grid_nb {var_smoothing: np.logspace(0, -9, num100)
}
grid_search_nb GridSearchCV(estimatornaive_bayes_classifier, param_gridparam_grid_nb, cvcv)
grid_search_nb.fit(X_train, y_train)
best_naive_bayes_classifier grid_search_nb.best_estimator_# SVM模型参数调优
svm_classifier SVC(kernellinear, random_state42)
param_grid_svm {C: [0.1, 1, 10]
}
grid_search_svm GridSearchCV(estimatorsvm_classifier, param_gridparam_grid_svm, cvcv)
grid_search_svm.fit(X_train, y_train)
best_svm_classifier grid_search_svm.best_estimator_# 评估模型
y_pred_dt best_decision_tree_classifier.predict(X_test)
accuracy_dt accuracy_score(y_test, y_pred_dt)y_pred_nb best_naive_bayes_classifier.predict(X_test)
accuracy_nb accuracy_score(y_test, y_pred_nb)y_pred_svm best_svm_classifier.predict(X_test)
accuracy_svm accuracy_score(y_test, y_pred_svm)print(决策树模型在测试集上的准确率: {:.2f}%.format(accuracy_dt * 100))
print(朴素贝叶斯模型在测试集上的准确率: {:.2f}%.format(accuracy_nb * 100))
print(SVM模型在测试集上的准确率: {:.2f}%.format(accuracy_svm * 100))# 可视化对比展示
models [决策树, 朴素贝叶斯, SVM]
accuracies [accuracy_dt, accuracy_nb, accuracy_svm]plt.figure(figsize(8, 6))
plt.bar(models, accuracies, aligncenter, alpha0.7)
plt.xlabel(模型)
plt.ylabel(准确率)
plt.title(不同模型的准确率对比)
plt.ylim(min(accuracies) - 0.01, max(accuracies) 0.01)
plt.show() 完整代码II
import numpy
import torch
import torchvision
import torch.nn.functional as F
import sklearn
from sklearn.neighbors import KNeighborsClassifier
from torch.utils.data import DataLoaderfrom torchvision import transforms
from torchvision import datasetsfrom sklearn.tree import DecisionTreeClassifier
from sklearn.model_selection import StratifiedKFold, GridSearchCV
from sklearn.metrics import accuracy_score
import matplotlib.pyplot as pltimport numpy as np
numpy, sklearn, matplotlib, torch, torchvision卷积运算 使用mnist数据集和10-411类似的只是这里1.输出训练轮的acc 2.模型上使用torch.nn.Sequential# Super parameter ------------------------------------------------------------------------------------
batch_size 64
learning_rate 0.01
momentum 0.5
EPOCH 10# Todo数据集准备 ------------------------------------------------------------------------------------
transform transforms.Compose([transforms.ToTensor(), transforms.Normalize((0.1307,), (0.3081,))])
# softmax归一化指数函数(https://blog.csdn.net/lz_peter/article/details/84574716),其中0.1307是mean均值和0.3081是std标准差train_dataset datasets.MNIST(root./data/demo2, trainTrue, transformtransform,downloadTrue) # 本地没有就加上downloadTrue
test_dataset datasets.MNIST(root./data/demo2, trainFalse, transformtransform,downloadTrue) # trainTrue训练集False测试集
train_loader DataLoader(train_dataset, batch_sizebatch_size, shuffleTrue)
test_loader DataLoader(test_dataset, batch_sizebatch_size, shuffleFalse)# 展示数据12个
fig plt.figure()
for i in range(12):plt.subplot(3, 4, i 1)plt.tight_layout()plt.imshow(train_dataset.train_data[i], cmapgray, interpolationnone)plt.title(Labels: {}.format(train_dataset.train_labels[i]))plt.xticks([])plt.yticks([])
plt.show()# 准备数据
X_train train_dataset.train_data.numpy().reshape(-1, 28 * 28) # 将图像展平成一维数组
y_train train_dataset.train_labels.numpy()
X_test test_dataset.test_data.numpy().reshape(-1, 28 * 28)
y_test test_dataset.test_labels.numpy()# Todo: KNN 模型 ------------------------------------------------------------------------------------
print(Todo: KNN 模型 ------------------------------------------------------------------------------------)
neighbors [3, 4, 5]
best_accuracy 0
best_neighbor 0
accuracies []for n in neighbors:knn_classifier KNeighborsClassifier(n_neighborsn) # 设置邻居数print(正在训练 KNN 模型 (邻居数{}....format(n))knn_classifier.fit(X_train, y_train)# 预测并评估模型y_pred knn_classifier.predict(X_test)accuracy accuracy_score(y_test, y_pred)accuracies.append(accuracy)print(KNN 模型 (邻居数{}在测试集上的准确率: {:.2f}%.format(n, accuracy * 100))# 更新最优准确率和对应的邻居数if accuracy best_accuracy:best_accuracy accuracybest_neighbor n# 可视化不同邻居数下的准确率
plt.figure(figsize(8, 6))
plt.bar(neighbors, accuracies, aligncenter, alpha0.7)
plt.xlabel(Number of Neighbors)
plt.ylabel(Accuracy)
plt.title(KNN Accuracy for Different Number of Neighbors)
plt.xticks(neighbors)
plt.ylim(min(accuracies) - 0.01, max(accuracies) 0.01)
plt.show()
plt.savefig(data/demo2/knn_accuracy_plot.png)print(最优的KNN模型 (邻居数{}在测试集上的准确率: {:.2f}%.format(best_neighbor, best_accuracy * 100))# Todo: 决策树 模型 ------------------------------------------------------------------------------------
print(Todo: 决策树 模型 ------------------------------------------------------------------------------------)
# 定义决策树分类器
decision_tree_classifier DecisionTreeClassifier(random_state42)# 定义要调优的超参数组合
param_grid {max_depth: [3, 5, 7, 9],min_samples_split: [2, 5, 10],min_samples_leaf: [1, 2, 4]
}# 定义StratifiedKFold交叉验证对象
cv StratifiedKFold(n_splits5, random_state42, shuffleTrue)# 存储每次交叉验证的准确度
cross_val_scores []
best_accuracy_DT 0# 手动进行交叉验证并打印进度
for i, (train_index, test_index) in enumerate(cv.split(X_train, y_train), 1):print(fProcessing Fold {i}...)X_train_fold, X_test_fold X_train[train_index], X_train[test_index]y_train_fold, y_test_fold y_train[train_index], y_train[test_index]# 使用网格搜索进行参数组合的交叉验证grid_search GridSearchCV(estimatordecision_tree_classifier, param_gridparam_grid, cv5)grid_search.fit(X_train_fold, y_train_fold)# 使用最优参数的模型进行预测best_decision_tree_classifier grid_search.best_estimator_y_pred best_decision_tree_classifier.predict(X_test_fold)# 计算每次交叉验证的准确度并存储accuracy accuracy_score(y_test_fold, y_pred)cross_val_scores.append(accuracy)# 输出每次交叉验证的准确度print(fAccuracy for Fold {i}: {accuracy:.2f})print(-----------------------)if (accuracy best_accuracy_DT):best_accuracy accuracy# 绘制交叉验证准确度折线图
plt.figure(figsize(8, 6))
plt.plot(range(1, 6), cross_val_scores, markero, linestyle-, colorb)
plt.xlabel(Fold)
plt.ylabel(Accuracy)
plt.title(Cross Validation Accuracy)
plt.xticks(np.arange(1, 6, 1))
plt.show()
plt.savefig(data/demo2/DT_accuracy_plot.png)
print(最优的决策树模型在测试集上的准确率: {:.2f}%.format(best_accuracy * 100))# Todo: 朴素贝叶斯 模型 ------------------------------------------------------------------------------------
print(Todo: 朴素贝叶斯 模型 ------------------------------------------------------------------------------------)from sklearn.naive_bayes import GaussianNB# 定义朴素贝叶斯分类器
naive_bayes_classifier GaussianNB()
# 定义要调优的超参数
param_grid_nb {var_smoothing: np.logspace(0, -9, num100)}# 使用GridSearchCV进行参数调优
grid_search_nb GridSearchCV(estimatornaive_bayes_classifier, param_gridparam_grid_nb, cv5)
grid_search_nb.fit(X_train, y_train)
# 获取最优参数的朴素贝叶斯模型
best_naive_bayes_classifier grid_search_nb.best_estimator_
# 在测试集上进行预测
y_pred_nb best_naive_bayes_classifier.predict(X_test)# 计算准确度
accuracy_nb accuracy_score(y_test, y_pred_nb)
# 输出朴素贝叶斯模型的准确度
print(朴素贝叶斯模型在测试集上的准确率: {:.2f}%.format(accuracy_nb * 100))# 获取最优超参数
best_var_smoothing grid_search_nb.best_params_[var_smoothing]
# 输出最优超参数
print(最优的超参数 var_smoothing: {:.2e}.format(best_var_smoothing))# Todo: SVM 模型 ------------------------------------------------------------------------------------
print(Todo: SVM 模型 ------------------------------------------------------------------------------------)from sklearn.svm import SVC# 定义SVM分类器
svm_classifier SVC()# 定义要调优的超参数
param_grid_svm {C: [0.1, 1, 10],gamma: [0.01, 0.1, 1],kernel: [linear, rbf]
}# 使用GridSearchCV进行参数调优
grid_search_svm GridSearchCV(estimatorsvm_classifier, param_gridparam_grid_svm, cv5)
grid_search_svm.fit(X_train, y_train)# 获取最优参数的SVM模型
best_svm_classifier grid_search_svm.best_estimator_# 在测试集上进行预测
y_pred_svm best_svm_classifier.predict(X_test)# 计算准确度
accuracy_svm accuracy_score(y_test, y_pred_svm)# 输出SVM模型的准确度
print(SVM模型在测试集上的准确率: {:.2f}%.format(accuracy_svm * 100))# 获取最优超参数
best_C grid_search_svm.best_params_[C]
best_gamma grid_search_svm.best_params_[gamma]
best_kernel grid_search_svm.best_params_[kernel]# 输出最优超参数
print(最优的超参数 C: {}, gamma: {}, kernel: {}.format(best_C, best_gamma, best_kernel))# Todo: 四种模型准确率对比 ------------------------------------------------------------------------------------
print(Todo: 四种模型准确率对比 ------------------------------------------------------------------------------------)# 可视化四种模型的准确率
models [KNN, Decision Tree, Naive Bayes, SVM]
accuracies [best_accuracy * 100, best_accuracy_DT * 100, accuracy_nb * 100, accuracy_svm * 100]plt.figure(figsize(8, 6))
plt.bar(models, accuracies, aligncenter, alpha0.7)
plt.xlabel(Models)
plt.ylabel(Accuracy)
plt.title(Model Accuracy Comparison)
plt.ylim(min(accuracies) - 2, max(accuracies) 2)
plt.show()
plt.savefig(data/demo2/accuracy_db.png)autoDL运行
按照“资料”租用并搭建autoDL项目安装sklearn库pip install scikit-learn新建jupyter文件项目运行代码 KNN准确率
决策树准确率 SVM没跑出来…(5小时 事实上Scikit-Learn的SVM实现并不直接支持GPU加速所以在CPU上进行训练是唯一的选择。 其中KNN和决策树可以使用cpu其gpu加速效果不强其他模型建议使用gpu加速