svm和决策树基本知识以及模型评价以及模型保存

svm和决策树基本知识以及模型评价以及模型保存

文章目录

  • 一、SVM
    • 1.1,常用属性函数
  • 二、决策树
    • 2.1,常用属性函数
    • 2.2,决策树可视化
    • 2.3,决策树解释
  • 3,模型评价
    • 3.1,方面一(评价指标)
    • 3.2,方面二(不同数据规模下,模型的性能)
  • 4,模型保存与读取
    • 4.1,模型的保存
    • 4.2,模型的读取


一、SVM

1.1,常用属性函数

predict:返回一个数组表示个测试样本的类别。
predict_probe:返回一个数组表示测试样本属于每种类型的概率。
decision_function:返回一个数组表示测试样本到对应类型的超平面距离。
get_params:获取当前svm函数的各项参数值。
score:获取预测结果准确率。
set_params:设置SVC函数的参数 clf.n_support_:各类的支持向量的个数
clf.support_:各类的支持向量在训练样本中的索引
clf.support_vectors_:全部支持向量

原文链接:

二、决策树

2.1,常用属性函数

classes_:类标签(单输出问题)或类标签数组的列表(多输出问题)。
feature_importances_:特征重要度。
max_features_:max_features的推断值。
n_classes_:类数(用于单输出问题),或包含每个输出的类数的列表(用于多输出问题)。
n_features_:执行拟合时的特征数量。
n_outputs_:执行拟合时的输出数量。
tree_:

训练(拟合):fit(train_x, train_y)
预测:predict(X)返回标签、predict_log_proba(X)、predict_proba(X)返回概率,每个点的概率和为1,一般取predict_proba(X)[:,1]
评分(返回平均准确度):score(test_x, test_y)。等效于准确率accuracy_score
参数类:获取分类器的参数get_params([deep])、设置分类器的参数set_params(params)。
原文链接:

2.2,决策树可视化

from sklearn.datasets import load_iris
from sklearn import tree
import matplotlib.pyplot as plt# 加载鸢尾花数据集
iris = load_iris()# 创建决策树模型
model = tree.DecisionTreeClassifier(max_depth=2)
model.fit(iris.data, iris.target)# 可视化决策树
feature_names = iris.feature_names
plt.figure(figsize=(12,12))
_ = tree.plot_tree(model, feature_names=feature_names, class_names=iris.target_names, filled=True, rounded=True)
plt.show()

2.3,决策树解释

在这里插入图片描述

节点含义:

  1. petal length (cm)<=2.45表示数据特征petal width (cm)<=0.75,当petal width (cm)<=0.75,进入左边分支,否则进入右边分支;
  2. gini表示该节点的基尼系数;
  3. samples表示该节点的样本数;
  4. value表示各分类的样本数,例如,根节点中的[34,32,39]表示分类为Setosa的样本数为34,分类为Versicolour的样本数为32,分类为Virginica的样本数量为39;
  5. class表示该区块被划分为的类别,它是由value中样本数较多的类别决定的,例如,根节点中分类为Virginica的样本数最多,所以该节点的分类为Virginica,依此类推。

每一个颜色代表一个分类,随着层数的增加,颜色也会变深。

原文链接

3,模型评价

3.1,方面一(评价指标)

  1. 准确率
    准确率是分类问题中最常用的评估指标,用于衡量模型的正确预测率。
  2. 精确率和召回率
    精确率和召回率用于评估二分类模型的性能。精确率是指预测为正例的样本中实际为正例的比例,召回率是指实际为正例的样本中被正确预测为正例的比例。
  3. F1分数
    F1分数是精确率和召回率的加权平均值,用于评估二分类模型的性能。
# 其他的指标
def accuracy_precision_recall_f1(y_true, y_pred):# 1.准确率accuracy = accuracy_score(y_true, y_pred)# 2.精确率和召回率precision = precision_score(y_true, y_pred)recall = recall_score(y_true, y_pred)# 3.F1分数f1 = f1_score(y_true, y_pred)return [accuracy, precision, recall, f1]print(accuracy_precision_recall_f1(test_label_shulle_scaler, test_data_predict))

原文链接

  1. 混淆矩阵
    混淆矩阵是一个二维矩阵,用于表示分类模型的性能。它将预测结果分为真正例(True Positive)、假正例(False Positive)、真反例(True Negative)和假反例(False Negative)四类,分别对应矩阵的四个象限。
def draw_confusion_matrix(label_true, label_pred, label_name, normlize, title="Confusion Matrix", pdf_save_path=None,dpi=100):"""@param label_true: 真实标签,比如[0,1,2,7,4,5,...]@param label_pred: 预测标签,比如[0,5,4,2,1,4,...]@param label_name: 标签名字,比如['cat','dog','flower',...]@param normlize: 是否设元素为百分比形式@param title: 图标题@param pdf_save_path: 是否保存,是则为保存路径pdf_save_path=xxx.png | xxx.pdf | ...等其他plt.savefig支持的保存格式@param dpi: 保存到文件的分辨率,论文一般要求至少300dpi@return:example:draw_confusion_matrix(label_true=y_gt,label_pred=y_pred,label_name=["Angry", "Disgust", "Fear", "Happy", "Sad", "Surprise", "Neutral"],normlize=True,title="Confusion Matrix on Fer2013",pdf_save_path="Confusion_Matrix_on_Fer2013.png",dpi=300)"""cm1 = confusion_matrix(label_true, label_pred)cm = confusion_matrix(label_true, label_pred)print(cm)if normlize:row_sums = np.sum(cm, axis=1)cm = cm / row_sums[:, np.newaxis]cm = cm.Tcm1 = cm1.Tplt.imshow(cm, cmap='Blues')plt.title(title)# plt.xlabel("Predict label")# plt.ylabel("Truth label")plt.xlabel("预测标签")plt.ylabel("真实标签")plt.yticks(range(label_name.__len__()), label_name)plt.xticks(range(label_name.__len__()), label_name, rotation=45)plt.tight_layout()plt.colorbar()for i in range(label_name.__len__()):for j in range(label_name.__len__()):color = (1, 1, 1) if i == j else (0, 0, 0)  # 对角线字体白色,其他黑色value = float(format('%.1f' % (cm[i, j] * 100)))value1 = str(value) + '%\n' + str(cm1[i, j])plt.text(i, j, value1, verticalalignment='center', horizontalalignment='center', color=color)plt.show()# if not pdf_save_path is None:#     plt.savefig(pdf_save_path, bbox_inches='tight', dpi=dpi)labels_name = ['健康', '故障']
test_data_predict = SVC_all.predict(test_data_shuffle_scaler)draw_confusion_matrix(label_true=test_label_shulle_scaler,label_pred=test_data_predict,label_name=labels_name,normlize=True,title="混淆矩阵",# title="Confusion Matrix",pdf_save_path="Confusion_Matrix.jpg",dpi=300)

原文链接

  1. AUC和ROC曲线
    ROC曲线是一种评估二分类模型性能的方法,它以真正例率(TPR)为纵轴,假正例率(FPR)为横轴,绘制出模型预测结果在不同阈值下的性能。AUC是ROC曲线下面积,用于评估模型总体性能。
# 画ROC曲线函数
def plot_roc_curve(y_true, y_score):"""y_true:真实值y_score:预测概率。注意:不要传入预测label!!!"""from sklearn.metrics import roc_curveimport matplotlib.pyplot as pltfpr, tpr, threshold = roc_curve(y_true, y_score)# plt.xlabel('False Positive Rate')# plt.ylabel('Ture Positive Rate')plt.xlabel('特异度')plt.ylabel('灵敏度')plt.title('ROC曲线')# plt.title('roc curve')plt.plot(fpr, tpr, color='b', linewidth=0.8)plt.plot([0, 1], [0, 1], 'r--')plt.show()# print(np.sum(SVC_all.predict(test_data_shuffle_scaler)))
test_data_score = SVC_all.decision_function(test_data_shuffle_scaler)
plot_roc_curve(test_label_shulle_scaler, SVC_all.predict_proba(test_data_shuffle_scaler)[:,1])
plot_roc_curve(test_label_shulle_scaler, test_data_score)# 计算AUC
from sklearn.metrics import roc_auc_score
print(roc_auc_score(test_label_shulle_scaler, SVC_all.predict_proba(test_data_shuffle_scaler)[:,1]))

原文链接

3.2,方面二(不同数据规模下,模型的性能)

def plot_learning_curve(estimator, title, X, y,ax,  # 选择子图ylim=None,  # 设置纵坐标的取值范围cv=None,  # 交叉验证n_jobs=None  # 设定索要使用的线程):train_sizes, train_scores, test_scores = learning_curve(estimator, X, y, cv=cv, n_jobs=n_jobs)# learning_curve() 是一个可视化工具,用于评估机器学习模型的性能和训练集大小之间的关系。它可以帮助我们理解模型在不同数据规模下的训练表现,# 进而判断模型是否出现了欠拟合或过拟合的情况。该函数会生成一条曲线,横轴表示不同大小的训练集,纵轴表示训练集和交叉验证集上的评估指标(例如# 准确率、损失等)。通过观察曲线,我们可以得出以下结论:# 1,训练集误差和交叉验证集误差之间的关系:当训练集规模较小时,模型可能过度拟合,训练集误差较低,交叉验证集误差较高;当训练集规模逐渐增大时,#    模型可能更好地泛化,两者的误差逐渐趋于稳定。# 2,训练集误差和交叉验证集误差对训练集规模的响应:通过观察曲线的斜率,我们可以判断模型是否存在高方差(过拟合)或高偏差(欠拟合)的问题。如果#    训练集和交叉验证集的误差都很高,且二者之间的间隔较大,说明模型存在高偏差;如果训练集误差很低而交叉验证集误差较高,且二者的间隔也较大,说#    明模型存在高方差。# cv : int:交叉验证生成器或可迭代的可选项,确定交叉验证拆分策略。v的可能输入是:#            - 无,使用默认的3倍交叉验证,#            - 整数,指定折叠数。#            - 要用作交叉验证生成器的对象。#            - 可迭代的yielding训练/测试分裂。#      ShuffleSplit:我们这里设置cv,交叉验证使用ShuffleSplit方法,一共取得100组训练集与测试集,#      每次的测试集为20%,它返回的是每组训练集与测试集的下标索引,由此可以知道哪些是train,那些是test。# n_jobs : 整数,可选并行运行的作业数(默认值为1)。windows开多线程需要ax.set_title(title)if ylim is not None:ax.set_ylim(*ylim)# *是可以接受任意数量的参数# 而 ** 可以接受任意数量的指定键值的参数# def m(*args,**kwargs):# 	print(args)#     print(kwargs)# m(1,2,a=1,b=2)# #args:(1,2),kwargs:{'b': 2, 'a': 1}ax.set_xlabel("Training examples")ax.set_ylabel("Score")ax.grid()  # 显示网格作为背景,不是必须ax.plot(train_sizes, np.mean(train_scores, axis=1), 'o-', color="r", label="Training score")ax.plot(train_sizes, np.mean(test_scores, axis=1), 'o-', color="g", label="Test score")ax.legend(loc="best")return ax#
# y = y.astype(np.int)
print(X.shape)
print(y.shape)title = ["Naive_Bayes", "DecisionTree", "SVM_RBF_kernel", "RandomForest", "Logistic"]
# model = [GaussianNB(), DTC(), SVC(gamma=0.001)
#     , RFC(n_estimators=50), LR(C=0.1, solver="lbfgs")]
model = [GaussianNB(), DTC(), SVC(kernel="rbf"), RFC(n_estimators=50), LR(C=0.1, solver="liblinear")]
cv = ShuffleSplit(n_splits=10, test_size=0.5, random_state=0)
# n_splits:
# 划分数据集的份数,类似于KFlod的折数,默认为10份
# test_size:
# 测试集所占总样本的比例,如test_size=0.2即将划分后的数据集中20%作为测试集
# random_state:
# 随机数种子,使每次划分的数据集不变
# train_sizes: 随着训练集的增大,选择在10%,25%,50%,75%,100%的训练集大小上进行采样。
#              比如(CV= 5)10%的意思是先在训练集上选取10%的数据进行五折交叉验证。
# train_sizes:数组类,形状(n_ticks),dtype float或int
# 训练示例的相对或绝对数量,将用于生成学习曲线。如果dtype为float,则视为训练集最大尺寸的一部分
# (由所选的验证方法确定),即,它必须在(0,1]之内,否则将被解释为绝对大小注意,为了进行分类,
# 样本的数量通常必须足够大,以包含每个类中的至少一个样本(默认值:np.linspace(0.1,1.0,5))
# 输出:
# train_sizes_abs:
# 返回生成的训练的样本数,如[ 10 , 100 , 1000 ]
# train_scores:
# 返回训练集分数,该矩阵为( len ( train_sizes_abs ) , cv分割数 )维的分数,
# 每行数据代表该样本数对应不同折的分数
# test_scores:
# 同train_scores,只不过是这个对应的是测试集分数
print("===" * 25)
fig, axes = plt.subplots(1, 5, figsize=(30, 6))
for ind, title_, estimator in zip(range(len(title)), title, model):times = time()plot_learning_curve(estimator, title_, X_scaler, y,ax=axes[ind], ylim=[0, 1.05], n_jobs=4, cv=cv)print("{}:{}".format(title_, datetime.datetime.fromtimestamp(time() - times).strftime("  %M:%S:%f")))
plt.show()
print("===" * 25)
for i in [*zip(range(len(title)), title, model)]:print(i)

原文链接

4,模型保存与读取

4.1,模型的保存


title = ["Naive_Bayes", "DecisionTree", "SVM_RBF_kernel", "RandomForest", "Logistic"]
model = [GaussianNB(), DTC(), SVC(gamma=0.001), RFC(n_estimators=50), LR(C=0.1, solver="liblinear")]import joblibfor i_index, i in enumerate(model):i.fit(X, y)joblib_file = "model_save/" + title[i_index] + "_model.pkl"with open(joblib_file, 'wb') as file:joblib.dump(i, joblib_file)print(i.score(X, y))

4.2,模型的读取

title = ["Naive_Bayes", "DecisionTree", "SVM_RBF_kernel", "RandomForest", "Logistic"]for i in title:joblib_file = "model_save/" + i + "_model.pkl"with open(joblib_file, "rb") as file:model = joblib.load(file)print(i, ":   ", model.score(X, y))

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/web/31758.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Android基于MediaBroswerService的App实现概述

mSession.setPlaybackState(mStateBuilder.build()); // 5. 关联 SessionToken setSessionToken(mSession.getSessionToken()); } } 根据包名做权限判断之后&#xff0c;返回根路径 Override public BrowserRoot onGetRoot(String clientPackageName, int clientUid, Bundl…

如何生成protobuf文件

背景 protobuf是一种用于序列化结构数据的工具&#xff0c;实现数据的存储与交换&#xff0c;与编程语言和开发平台无关。 序列化&#xff1a;将结构数据或者对象转换成能够用于存储和传输的格式。 反序列化&#xff1a;在其他的计算环境中&#xff0c;将序列化后的数据还原为…

Vue3.4新增的defineModel的使用

define-model的作用 在3.3及之前的版本&#xff0c;父子组件之间的通讯&#xff0c;一直都是靠props&#xff08;父传子&#xff09;和emit&#xff08;子传父&#xff09;来实现。而define-model整合了这两种方法&#xff0c;只需要在父组件中定义define-model的方法&#xf…

GIT回滚

1. 使用 git revert git revert 命令会创建一个新的提交&#xff0c;这个提交会撤销指定提交的更改。这通常用于公共分支&#xff08;如 main 或 master&#xff09;&#xff0c;因为它不会重写历史。 git revert HEAD # 撤销最近的提交 # 或者指定一个特定的提交哈希值 …

Net开源项目推荐-WPF控件样式篇

Net开源项目推荐-WPF控件样式篇 HandyControlWPFDeveloperswpf-uidesignLive-ChartsAvalonDock HandyControl WPF控件库,比较常用的WPF开源控件库&#xff0c;对WPF原有控件样式都进行了重写和扩展&#xff0c;也增加了许多特别的控件&#xff0c;非常好用 github仓库&#x…

Day14—基于Langchain-chatchat搭建本地智能

一、基于Langchain-chatchat搭建本地智能 知识问答系统 1、项目介绍 基于 ChatGLM 等大语言模型与 Langchain 等应用框架实现&#xff0c;开一种利用 langchain 思想实现的基于本地知识库的问答应用&#xff0c;目标期望建立一套对中文场景与开源模型支持友好、可离线运行的知…

Claude3.5:编码螃蟹游戏就是这么轻松

大模型技术论文不断&#xff0c;每个月总会新增上千篇。本专栏精选论文重点解读&#xff0c;主题还是围绕着行业实践和工程量产。若在某个环节出现卡点&#xff0c;可以回到大模型必备腔调或者LLM背后的基础模型重新阅读。而最新科技&#xff08;Mamba,xLSTM,KAN&#xff09;则…

爱眼小妙招:台灯怎么选?学生如何正确使用台灯?

视力是心灵的窗户&#xff0c;尤其对于儿童来说更为重要。然而&#xff0c;随着现代生活方式的改变&#xff0c;孩子们面临越来越多的视力挑战。据统计&#xff0c;在近视学生中&#xff0c;近10%的人患有高度近视&#xff0c;而这一比例随年级的增加而逐渐上升。从幼儿园的小小…

电子杂志制作工具推荐:让你轻松成为编辑大人

在这个数字化的时代&#xff0c;电子杂志已经成为信息传播的重要载体。它不仅能够满足人们对阅读的需求&#xff0c;还能够提供更加丰富、互动的阅读体验。因此&#xff0c;掌握一款好用的电子杂志制作工具&#xff0c;已经成为每个编辑大人的必备技能。接下来告诉大家一个超简…

设置浏览器互不干扰

目录 一、查看浏览器文件路径 二、 其他盘新建文件夹Cache 三、以管理员运行CMD 四、执行命令 一、查看浏览器文件路径 chrome://version/ 二、 其他盘新建文件夹Cache D:\chrome\Cache 三、以管理员运行CMD 四、执行命令 Mklink /d "C:\Users\Lenovo\AppData\Loca…

计算机系统基础(一)

1. 引入——从源程序到可执行文件 了解高级语言编写的代码在后台是如何被编译并运行的 首先我们会编写一段代码&#xff0c;例如 #include<stdio.h>int main(){printf("hello world!\n");return 0; } 并把它命名为hello.c文件 预处理阶段 接下来通过命令…

WPF/C#:在DataGrid中显示选择框

前言 在使用WPF的过程中可能会经常遇到在DataGrid的最前或者最后添加一列选择框的需求&#xff0c;今天跟大家分享一下&#xff0c;在自己的项目中是如何实现的。 整体实现效果如下&#xff1a; 如果对此感兴趣&#xff0c;可以接下来看具体实现部分。 实践 假设数据库中的…

【EndNote】EndNote进行文献管理可能遇到的问题和解决方案

一、安装GB/T7714-2015(numberic)文献style windows&#xff1a;https://blog.csdn.net/qq_36235935/article/details/115629694 mac os&#xff1a;Mac版Endnote 20导入中文参考格式Chinese Std GBT7714 (numeric)-CSDN博客 安装完之后需要调整Author Name格式&#xff1a;…

Python文件与面向对象知识点

目录 文件的基本概念 文件的读取 文件的追加 文件的写入 with语句 知识总结 面向对象的基本概念 类和实例 对象的属性和方法 类属性与方法 面向对象的三大特性 知识总结 文件的基本概念 文件的读取 文件的追加 文件的写入 with语句 知识总结 面向对象的基本概念 …

docker拉取镜像一直在加载中,且会提示error pulling image configuration

1、增加国内镜像配置 #查看文件内容 sudo vim /etc/docker/daemon.json如果没有该文件&#xff0c;则需要在/etc/docker中创建一个daemon.json 文件 创建文件 vim daemon.json#文件中添加以下json {"registry-mirrors":["https://docker.mirrors.ustc.edu.cn/…

第六十六天打卡 | 卡码网101 孤岛的总面积、卡码网102 沉没孤岛、卡码网103 水流问题、卡码网104 建造最大岛屿

卡码网101 孤岛的总面积 这一题在昨天的基础上&#xff0c;将比较得出最大孤岛面积的逻辑改为统计所有孤岛面积之和的逻辑即可。 最近做项目的时候也发现&#xff0c;很多时候代码逻辑能够复用最好就不要再自己写&#xff0c;防止出错&#xff0c;当然刷代码题的时候不…

V4L2读取摄像头资源

1.V4L2 它是Linux内核中标准的关于视频驱动程序&#xff0c;Video for Linux 2&#xff0c;简称V4L2。 它为Linux下的视频驱动提供了统一的接口&#xff0c;使得应用程序可以使用统一的API操作不同的视频设备。 V4L2支持三类设备&#xff1a;视频输入输出设备、VBI设备和rad…

LeetCode---402周赛

题目列表 3184. 构成整天的下标对数目 I 3185. 构成整天的下标对数目 II 3186. 施咒的最大总伤害 3187. 数组中的峰值 一、构成整天的下标对数目 I & II 可以直接二重for循环暴力遍历出所有的下标对&#xff0c;然后统计符合条件的下标对数目返回。代码如下 class So…

概率论与数理统计期末复习

概率论常考知识点汇总 总括 1. 基础概率论 概率定义&#xff1a;理解概率是事件发生的可能性度量&#xff0c;范围从0&#xff08;不可能&#xff09;到1&#xff08;必然发生&#xff09;。概率公理&#xff1a;掌握概率的三大公理&#xff0c;即非负性、规范性和可加性。条…

HTML静态网页成品作业(HTML+CSS)——美食火锅介绍网页(1个页面)

&#x1f389;不定期分享源码&#xff0c;关注不丢失哦 文章目录 一、作品介绍二、作品演示三、代码目录四、网站代码HTML部分代码 五、源码获取 一、作品介绍 &#x1f3f7;️本套采用HTMLCSS&#xff0c;未使用Javacsript代码&#xff0c;共有1个页面。 二、作品演示 三、代…