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

news2024/11/27 22:30:16

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.T
    cm1 = cm1.T
    plt.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_curve
    import matplotlib.pyplot as plt
    fpr, 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 joblib

for 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.coloradmin.cn/o/1848530.html

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

相关文章

js浅拷贝和深拷贝的区别

JavaScript中的浅拷贝和深拷贝的主要区别在于它们如何处理引用类型的数据。 浅拷贝仅复制对象的引用&#xff0c;而不复制对象本身。这意味着新旧对象共享同一块内存空间。因此&#xff0c;如果修改了原始对象&#xff0c;复制的对象也会相应地改变&#xff0c;因为它们实际上是…

Webstorm vue项目@路径不能跳转到对应资源,提示Cannot find declaration to go to

Webstorm vue项目路径不能跳转到对应资源,提示Cannot find declaration to go to 我们 ctrl加鼠标左键点击方法会失效&#xff0c;看了网上很多教程在说需要在此处配置一下webpack.config.js的文件路径&#xff0c;而且指向了node_modules\vue\cli-service\webpack.config.js 我…

网络安全:Web 安全 面试题.(SQL注入)

网络安全&#xff1a;Web 安全 面试题.&#xff08;SQL注入&#xff09; 网络安全面试是指在招聘过程中,面试官会针对应聘者的网络安全相关知识和技能进行评估和考察。这种面试通常包括以下几个方面&#xff1a; &#xff08;1&#xff09;基础知识:包括网络基础知识、操作系…

基于PSO粒子群优化的CNN-GRU的时间序列回归预测matlab仿真

目录 1.算法运行效果图预览 2.算法运行软件版本 3.部分核心程序 4.算法理论概述 4.1 卷积神经网络&#xff08;CNN&#xff09; 4.2 CNN-GRU模型架构 4.3 CNN-GRU结合PSO的时间序列预测 5.算法完整程序工程 1.算法运行效果图预览 (完整程序运行后无水印) 2.算法运行软…

Maven笔记(更新中)

一、Maven简介 Maven是一款为Java项目构建,依赖管理的工具(软件),使用Maven可以自动化构建,测试,打包和发布项目,大大提高了开发效率和质量 Maven主要作用理解 依赖管理 Maven可以管理项目的依赖,包括自动下载所需依赖库,自动下载依赖所需的依赖并且保证版本没有冲突,依赖版…

小米红米手机刷Hyper澎湃OS欧版EU教程-全球语言-完整GO框架-纯净飞速

有很多小伙伴喜欢刷小米欧版EU系统&#xff0c;EU版本由于很多base_china&#xff0c;自然稳定性来说&#xff0c;相对于别的区域来说&#xff0c;稳定真的太多&#xff0c;不会出现信号或者相机等奇奇怪怪的BUG&#xff0c;这也是我 们将欧版EU作为第一选择的原因。从界面来看…

OpenHarmony-HDF驱动框架介绍及加载过程分析

前言 HarmonyOS面向万物互联时代&#xff0c;而万物互联涉及到了大量的硬件设备&#xff0c;这些硬件的离散度很高&#xff0c;它们的性能差异与配置差异都很大&#xff0c;所以这要求使用一个更灵活、功能更强大、能耗更低的驱动框架。OpenHarmony系统HDF驱动框架采用C语言面…

综合评价 | 基于因子分析和聚类分析的节点重要度综合评价(Matlab)

目录 效果一览基本介绍程序设计参考资料 效果一览 基本介绍 综合评价 | 基于因子分析和聚类分析的节点重要度综合评价&#xff08;Matlab&#xff09; 程序设计 完整程序和数据获取方式&#xff1a;私信博主回复基于因子分析和聚类分析的节点重要度综合评价&#xff08;Matlab…

张量 Tensor学习总结

张量 Tensor 张量是一种多线性函数&#xff0c;用于表示矢量、标量和其他张量之间的线性关系&#xff0c;其在n维空间内有n^r个分量&#xff0c;每个分量都是坐标的函数。张量在坐标变换时也会按照某些规则作线性变换&#xff0c;是一种特殊的数据结构&#xff0c;在MindSpore…

【odoo】常用的基本视图类型

概要 在Odoo中&#xff0c;有几种基本视图类型&#xff0c;每种视图类型用于不同的目的和场景。这些视图类型包括表单视图&#xff08;form view&#xff09;、树视图&#xff08;tree view&#xff09;、看板视图&#xff08;kanban view&#xff09;、图表视图&#xff08;gr…

海口注册公司代理记账的服务优势与流程解析

在海口注册公司加入代理记账服务有多种优势。代理记账公司提供专业的财务服务&#xff0c;帮助企业节约成本、提高效率&#xff0c;实现财务管理的合规性。以下是代理记账服务的主要优势和流程解析&#xff1a; https://www.9733.cn/news/detail/173.html 一、代理记账服务的…

Python酷库之旅-第三方库openpyxl(02)

目录 一、 openpyxl库的由来 1、背景 2、起源 3、发展 4、特点 4-1、支持.xlsx格式 4-2、读写Excel文件 4-3、操作单元格 4-4、创建和修改工作表 4-5、样式设置 4-6、图表和公式 4-7、支持数字和日期格式 二、openpyxl库的优缺点 1、优点 1-1、支持现代Excel格式…

时序预测 | Matlab基于CNN-BiLSTM-Attention多变量时间序列多步预测

目录 效果一览基本介绍程序设计参考资料 效果一览 基本介绍 1.Matlab基于CNN-BiLSTM-Attention多变量时间序列多步预测&#xff1b; 2.多变量时间序列数据集&#xff08;负荷数据集&#xff09;&#xff0c;采用前96个时刻预测的特征和负荷数据预测未来96个时刻的负荷数据&…

make与makefile

目录 一、make的默认目标文件与自动推导 二、不能连续make的原因 执行原理 touch .PHONY伪目标 make指令不回显 makefile多文件管理 简写依赖方法 三、回车与换行 四、缓冲区 一、make的默认目标文件与自动推导 假设这是一个makefile文件&#xff0c;make的时候默认生…

百度文心智能体,创建属于自己的智能体应用

百度文心智能体平台为你开启。百度文心智能体平台&#xff0c;创建属于自己的智能体应用。百度文心智能体平台是百度旗下的智能AI平台&#xff0c;集成了先进的自然语言处理技术和人工智能技术&#xff0c;可以用来创建属于自己的智能体应用&#xff0c;访问官网链接&#xff1…

【地质灾害监测实现有效预警,44人提前安全转移】

6月13日14时&#xff0c;国信华源地质灾害监测预警系统提前精准预警&#xff0c;安全转移10户44人。 该滑坡隐患点通过科学部署国信华源裂缝计、倾角加速度计、雨量计、预警广播等自动化、智能化监测预警设备&#xff0c;实现了对隐患点裂缝、位移、降雨量等关键要素的实时动态…

嵌入式Linux驱动开研发流程详细解析

大家好,今天主要给大家分享一下,嵌入式linux中重要的内容详解。 一、驱动概念 驱动与底层硬件直接打交道,充当了硬件与应用软件中间的桥梁。 具体任务 读写设备寄存器(实现控制的方式) 完成设备的轮询、中断处理、DMA通信(CPU与外设通信的方式) 进行物理内存向虚拟内存…

nodejs执行 npm run dev时错误

INFO Starting development server… 95% emitting CompressionPlugin ERROR Error: error:0308010C:digital envelope routines::unsupported 我的node.js 的版本是 node-v20.11.0-x64 &#xff0c;听说16以上的版本会有这个问题&#xff0c;具体是什么忘了。需要在npm run …

【背包题解】DP代表了走到阶段i 的所有路线的最优解

1889:【提高】多重背包(2) 二维费用背包 2075 - 最大卡路里 1928 - 采购礼品 感谢 背包容量&#xff1a;&#xff08;c&#xff09; 6 重量 weight 2 2 4 6 2 1 2 3 4 5 价值 value 3 6 5 5 8 1 2 3 4 5 wvdp数组&#xff1a;记录有i件…

09-axios在Vue中的导入与配置

09-axios 前言首先简单了解什么是Axios&#xff1f;以上完成后就可以使用了 前言 我们接着上一篇文章 08-路由地址的数据获取 来讲。 下一篇文章 10-vuex在Vue中的导入与配置 首先简单了解什么是Axios&#xff1f; Axios是一个基于Promise 用于浏览器和 nodejs 的 HTTP 客户端…