文章目录

  • 任务6.3 构建并评价分类模型
    • 6.3.1 使用sklearn 估计器构建分类模型
      • 代码6-17 使用sklearn估计器构建SVM模型
      • sklearn 库常用分类算法函数
      • 代码 6-18 分类结果的混淆矩阵与准确率
    • 6.3.2 评价分类模型
      • 代码6-19 分类模型常用评价方法
      • 代码6-20 分类模型评价报告
      • 代码6-21 绘制ROC曲线
      • ROC曲线
    • 6.3.3 任务实现
        • 使用sklearn构建鲍鱼年龄预测的步骤如下
      • 1 构建SVM分类模型
      • 代码 6-22 鲍鱼年龄预测
      • 2. 评价构建的SVM分类模型
      • 代码 6-23 评价构建的SVM分类模型

任务6.3 构建并评价分类模型

6.3.1 使用sklearn 估计器构建分类模型

代码6-17 使用sklearn估计器构建SVM模型

在数据分析领域,分类算法有很多,其原理千差万别,有基于样本距离的最近邻算法,有基于特征信息熵的决策树,有基于bagging的随机森林 ,有基于boosting的梯度提升分类树 ,但其实现的过程相差不大。过程如图所示。

%%html
<img style="float: left;" src="./image/6-17.png" width=300 height=400>

sklearn 库常用分类算法函数

sklearn中提供的分类算法非常多,分别存在于不同的模块中。常用的分类算法如下表所示。

%%html
<img style="float: left;" src="./image/6-17-2.png" width=400 height=400>

import numpy as np
from sklearn.datasets import load_breast_cancer
from sklearn.svm import SVC
from sklearn.model_selection import train_test_split#划分数据
from sklearn.preprocessing import StandardScaler    #标准差
cancer = load_breast_cancer()
cancer_data = cancer['data']
cancer_target = cancer['target']
cancer_names = cancer['feature_names']
## 将数据划分为训练集测试集
cancer_data_train,cancer_data_test, \
cancer_target_train,cancer_target_test = \
train_test_split(cancer_data,cancer_target,test_size = 0.2,random_state = 22)
## 数据标准化
stdScaler = StandardScaler().fit(cancer_data_train)
cancer_trainStd = stdScaler.transform(cancer_data_train)
cancer_testStd = stdScaler.transform(cancer_data_test)
## 建立SVM模型
svm = SVC().fit(cancer_trainStd,cancer_target_train)
print('建立的SVM模型为:\n',svm)# 预测训练结果
cancer_target_pred = svm.predict(cancer_testStd)
print('预测前20个结果为: \n',cancer_target_pred[:20])
建立的SVM模型为:SVC(C=1.0, break_ties=False, cache_size=200, class_weight=None, coef0=0.0,decision_function_shape='ovr', degree=3, gamma='scale', kernel='rbf',max_iter=-1, probability=False, random_state=None, shrinking=True,tol=0.001, verbose=False)
预测前20个结果为: [1 0 0 0 1 1 1 1 1 1 1 1 0 1 1 1 0 0 1 1]

代码 6-18 分类结果的混淆矩阵与准确率

true = np.sum(cancer_target_pred == cancer_target_test)
print('预测对的结果数目为:', true)
print('预测错的的结果数目为:', cancer_target_test.shape[0]-true)
print('预测结果准确率为:', true/cancer_target_test.shape[0])
预测对的结果数目为: 111
预测错的的结果数目为: 3
预测结果准确率为: 0.9736842105263158

SVM模型预测结果的准确率约为97.4%,只有3个测试样本识别错误,说明了整体模型效果理想

6.3.2 评价分类模型

分类模型对测试集进行预测而得出的准确率并不能很好地反映模型的性能,为了有效判断一个预测模型的性能表现,需要结合真实值,计算出精确率、召回率、F1值和Cohen’s Kappa系数等指标来衡量。常规分类模型的评价指标如表所示。分类模型评价方法前4种都是分值越高越好,其使用方法基本相同。
sklearn的metrics模块还提供了一个能够输出分类模型评价报告的函数classfication_report。

%%html
<img style="float: left;" src="./image/6-19.png" width=600 height=400>

代码6-19 分类模型常用评价方法

from sklearn.metrics import accuracy_score,precision_score, \
recall_score,f1_score,cohen_kappa_score
print('使用SVM预测breast_cancer数据的准确率为:',accuracy_score(cancer_target_test,cancer_target_pred))
print('使用SVM预测breast_cancer数据的精确率为:',precision_score(cancer_target_test,cancer_target_pred))
print('使用SVM预测breast_cancer数据的召回率为:',recall_score(cancer_target_test,cancer_target_pred))
print('使用SVM预测breast_cancer数据的F1值为:',f1_score(cancer_target_test,cancer_target_pred))
print('使用SVM预测breast_cancer数据的Cohen’s Kappa系数为:',cohen_kappa_score(cancer_target_test,cancer_target_pred))
使用SVM预测breast_cancer数据的准确率为: 0.9736842105263158
使用SVM预测breast_cancer数据的精确率为: 0.9594594594594594
使用SVM预测breast_cancer数据的召回率为: 1.0
使用SVM预测breast_cancer数据的F1值为: 0.9793103448275862
使用SVM预测breast_cancer数据的Cohen’s Kappa系数为: 0.9432082364662903

代码6-20 分类模型评价报告

from sklearn.metrics import classification_report
print('使用SVM预测iris数据的分类报告:','\n',classification_report(cancer_target_test,cancer_target_pred))
使用SVM预测iris数据的分类报告: precision    recall  f1-score   support0       1.00      0.93      0.96        431       0.96      1.00      0.98        71accuracy                           0.97       114macro avg       0.98      0.97      0.97       114
weighted avg       0.97      0.97      0.97       114

代码6-21 绘制ROC曲线

from sklearn.metrics import roc_curve
import matplotlib.pyplot as plt
## 求出ROC曲线的x轴和y轴
fpr ,tpr ,thresholds = \
roc_curve(cancer_target_test,cancer_target_pred)
plt.figure(figsize=(10,6))
plt.xlim(0,1)  ##设定x轴的范围
plt.ylim(0.0,1.1)  # 设定y轴的范围
plt.xlabel('False Postive Rate') #伪阳性率
plt.ylabel('True Postive Rate')  #真阳性率
plt.plot(fpr,tpr,linewidth=2,linestyle='-',color='red')
plt.show()

ROC曲线

除了使用数值,表格形式评估分类模型的性能,还可通过绘制ROC曲线的方式来评估分类模型。
ROC曲线横纵坐标范围为[0,1],通常情况下ROC曲线与X轴形成的面积越大,表示模型性能越好。但是当ROC曲线处于下图中蓝色虚线的位置,就表明了模型的计算结果基本都是随机得来的,在此种情况下模型起到的作用几乎为零。故在实际中ROC曲线离图中蓝色虚线越远表示模型效果越好。

6.3.3 任务实现

常规的鲍鱼的年龄是通过显微镜查看切割,染色后的外壳上环的数量得到的,十分耗时.一些常规的物理量(如性别,长度,宽度,壳体重量等)的测量十分容易获取,若能够使用这些物理量预测年龄,将节省大量时间

使用sklearn构建鲍鱼年龄预测的步骤如下

1 构建SVM分类模型

代码 6-22 鲍鱼年龄预测

import pandas as pd
from sklearn.svm import SVC
from sklearn.metrics import classification_report
from sklearn.model_selection import train_test_split
from sklearn.preprocessing import StandardScaler
abalone = pd.read_csv('../data/abalone.data',sep=',')
# 将数据和标签拆开
abalone_data = abalone.iloc[:,:8]
abalone_target = abalone.iloc[:,8]
#连续型特征离散化
sex = pd.get_dummies(abalone_data['sex'])
abalone_data = pd.concat([abalone_data,sex],axis=1)
abalone_data.drop('sex',axis = 1,inplace =True)
# 划分训练集,测试集
abalone_train,abalone_test,\
abalone_target_train,abalone_target_test = \
train_test_split(abalone_data,abalone_target,train_size = 0.8,random_state = 42)
# 标准化
stdScaler = StandardScaler().fit(abalone_train)
abalone_std_train = stdScaler.transform(abalone_train)
abalone_std_test = stdScaler.transform(abalone_test)
## 建模
svm_abalone = SVC().fit(abalone_std_train,abalone_target_train)
print('建立的SVM模型为:','\n',svm_abalone)
建立的SVM模型为: SVC(C=1.0, break_ties=False, cache_size=200, class_weight=None, coef0=0.0,decision_function_shape='ovr', degree=3, gamma='scale', kernel='rbf',max_iter=-1, probability=False, random_state=None, shrinking=True,tol=0.001, verbose=False)

2. 评价构建的SVM分类模型

代码 6-23 评价构建的SVM分类模型

代码6-23 的结果显示了本次模型每个类别的精确率,召回率和F1值,其中除了对鲍鱼年龄为4的预测结果较好外,其他的预测结果欠佳,后期还需要仔细调整

abalone_target_pred = svm_abalone.predict(abalone_std_test)
print('abalone数据集的SVM分类报告为: \n',classification_report(abalone_target_test,abalone_target_pred))
abalone数据集的SVM分类报告为: precision    recall  f1-score   support3       0.00      0.00      0.00         34       0.45      0.69      0.55        135       0.54      0.22      0.31        326       0.40      0.33      0.36        487       0.41      0.44      0.42        848       0.37      0.36      0.37        999       0.28      0.57      0.38       14210       0.24      0.33      0.28       13911       0.25      0.25      0.25        9312       0.00      0.00      0.00        5113       0.00      0.00      0.00        3114       0.00      0.00      0.00        2615       0.00      0.00      0.00        2116       0.00      0.00      0.00        1317       0.00      0.00      0.00         818       0.00      0.00      0.00        1219       0.00      0.00      0.00         720       0.00      0.00      0.00         421       0.00      0.00      0.00         322       0.00      0.00      0.00         323       0.00      0.00      0.00         4accuracy                           0.31       836macro avg       0.14      0.15      0.14       836
weighted avg       0.25      0.31      0.26       836D:\Study\anaconda\lib\site-packages\sklearn\metrics\_classification.py:1272: UndefinedMetricWarning: Precision and F-score are ill-defined and being set to 0.0 in labels with no predicted samples. Use `zero_division` parameter to control this behavior._warn_prf(average, modifier, msg_start, len(result))

python 中任务 6.3 构建并评分分类模型(SVM模型) 学习笔记3相关推荐

  1. R语言使用R基础安装中的glm函数构建乳腺癌二分类预测逻辑回归模型、分类预测器(分类变量)被自动替换为一组虚拟编码变量、summary函数查看检查模型、使用table函数计算混淆矩阵评估分类模型性能

    R语言使用R基础安装中的glm函数构建乳腺癌二分类预测逻辑回归模型(Logistic regression).分类预测器(分类变量)被自动替换为一组虚拟编码变量.summary函数查看检查模型.使用t ...

  2. R语言e1071包中的支持向量机:构建nu-classification类型的支持向量机SVM并分析不同nu值惩罚下模型分类螺旋线型(sprials)线性不可分数据集的表现

    R语言e1071包中的支持向量机:构建nu-classification类型的支持向量机SVM并分析不同nu值惩罚下模型分类螺旋线型(sprials)线性不可分数据集的表现 目录

  3. R语言构建无序多分类逻辑回归模型、mlogit.display函数获取无序多分类逻辑回归模型的汇总统计信息(各分组模型对应的系数及标准差、相对危险降低率RRR值及其置信区间、AIC值等)

    R语言使用nnet包的multinom函数构建无序多分类logistic回归模型.使用epiDisplay包的mlogit.display函数获取无序多分类logistic回归模型的汇总统计信息(各分 ...

  4. python中文件操作中不同的文件操作有何差异_Python学习基础篇 -6: Python中的文件操作...

    前言:本专栏以Python为主题,并尽可能保持每星期两到三更,直到将Python的基础知识浅析和讲解完毕,同时,有一定基础的同学可以移步 Python实战专栏 .文件有有什么用 文件可以看作一个仓库, ...

  5. 【写给以前的自己】python中,既生list何生tuple?简论学习数据结构(e.g.哈希化)对自己的提升

    刚学python时,很奇怪:python中list可增减元素,调用遍历也都方便,有了list为什么要有一个tuple的原生数据类型呢?list有的特性(比如长度弹性)tuple没有,而tuple能干的 ...

  6. python中不同进制的整数之间可以直接运算_python学习第三天总结(进制与位运算,)...

    进制 计算机在存储数字的时候都是以二进制的形式去存的 十进制.十六进制.八进制.二进制 1.十进制 基数:0,1,2,3,4,5,6,7,8,9 进位:逢10进1 每一位的值: 111 = 1 * 1 ...

  7. python中文件最重要的功能_重点汇总-python-gitbook-重要点学习-1

    Python中关键字yield有什么作用? 为了理解yield有什么用,首先得理解generators,而理解generators前还要理解iterables Iterables 当你创建了一个列表, ...

  8. java中集合的模型特点_Java 学习笔记(十四)集合

    集合 在开发的时候,如果需要存储多个数据,可以使用数组,不过数据是固定长度的,如果需要存储可变长度的多个数据,可以使用集合.集合提供存储空间可变的存储类型,存储的容量可以实时改变 集合分类 Colle ...

  9. python函数是一段具有特定功能的语句组_Python学习笔记(五)函数和代码复用

    本文将为您描述Python学习笔记(五)函数和代码复用,具体完成步骤: 函数能提高应用的模块性,和代码的重复利用率.在很多高级语言中,都可以使用函数实现多种功能.在之前的学习中,相信你已经知道Pyth ...

最新文章

  1. 我的世界java怎么骑马,我的世界怎么骑马?方法解答
  2. 小游戏编程代码复制_少儿编程是不是来玩游戏?这个到底要学多久?
  3. php json 美化,php JSON数据格式化(美化)的方法
  4. (12)System Verilog随机变量
  5. L1-041 寻找250-PAT团体程序设计天梯赛GPLT
  6. Kettle:创建资源库
  7. Java — Arrays.toString(string[]) + Enumeration.hasMoreElements()【Arrays类、Enumeration接口】
  8. 值得收藏的UmiJS 教程
  9. java jar apktool,gradle 构建apktool.jar
  10. ADCS relay
  11. Linux:设置文件夹权限之777的含义
  12. 如何用matlab解异或方程,Matlab-6:解非线性方程组newton迭代法
  13. z自建服务器,《守望先锋》将加入自建服务器 自定规则
  14. CCleanner下载安装教程
  15. 失业找不到工作,很焦虑怎么办?
  16. 打开IDE里XXX.rc文件夹的子项,显示“!加载失败”
  17. 建设网站对服务器配置的要求标准?
  18. 爬虫实践---Scrapy-豆瓣电影影评深度爬取
  19. 奇趣网站收藏家(网站)
  20. MATLAB神经网络语音去噪-学习笔记

热门文章

  1. linux中如何升级python版本号,linux的python版本升级
  2. reactJS入门学习
  3. 贵阳培训python
  4. dos系统下Python换行方法
  5. python导入数据库操作
  6. python多线程案例
  7. 索引的概念及其优缺点
  8. unity 震动(震屏)
  9. 最新仿悬赏猫任务平台完整源码下载+可封装APP
  10. 技术人修炼之道阅读笔记(一)让自己更值钱的5个能力