二、模型评估方法

IDE为Jupyter Notebook
scikit-learn官网
scikit-learn是一个专门用于机器学习的工具包
运用到啥函数不知道咋使用?戳它–>scikit-learn工具包的API文档
不知道用啥模板?戳它–>scikit-learn样例模型

功能翻译
Classification分类
Regression回归
Clustering聚类
Dimensionality reduction降维算法
Model selection模型选择
Preprocessing数据预处理

一、首先导入相关的工具包,以及x轴y轴字体大小设置

import numpy as np
import os
%matplotlib inline
import matplotlib
import matplotlib.pyplot as plt
plt.rcParams['axes.labelsize'] = 14
plt.rcParams['xtick.labelsize'] = 12
plt.rcParams['ytick.labelsize'] = 12
import warnings
warnings.filterwarnings('ignore')
np.random.seed(42)

二、数据集读取

使用的数据集是sklearn内置数据集,MNIST手写数字识别数据集,70000张灰度图像的数字,大小为(28,28,1),28 * 28 * 1=784,每一个图像样本都有784个像素点,可以的等价于784个特征。
免费MNIST手写数字识别数据集下载
将下载好的mnist-original放到C:\Users\MyPC\scikit_learn_data下创建一个mldata文件夹
在这里插入图片描述

#查看下路径
from sklearn.datasets.base import get_data_home 
print (get_data_home())#C:\Users\MyPC\scikit_learn_data
from sklearn.datasets import fetch_openml
mnist = fetch_openml("mnist_784")#手写数字识别数据集,量少好观察
print(mnist)
#数据集中,X是mnist,里面存放类似字典的结构,里面所有数据的key是data;y是标签存放target
#X=mnist将data传入;y=mnist将target传入
X, y = mnist["data"], mnist["target"]
X.shape#(70000, 784)  当前样本数量一共7w个,784=28*28*1
y.shape#(70000,)   第一行标签为0,第二行标签为1,以此类推,共70000行

在这里插入图片描述

#前6w张当作训练集training,后1w张当作测试集testing
#1-6w 这6w个样本为训练集training、6w到最后7w 这1w个样本为testing测试集
X_train, X_test, y_train, y_test = X[:60000], X[60000:], y[:60000], y[60000:]
# 因为是数据之间是独立的,故需要洗牌操作,将training训练集和testing测试集打乱顺序
import numpy as npshuffle_index = np.random.permutation(60000)#打算数据集的index
X_train, y_train = X_train[shuffle_index], y_train[shuffle_index]#回传给数据集,相当于洗牌打乱操作
#原始index值为0,1,2,...,打乱顺序之后的index如下所示
shuffle_index#array([12628, 37730, 39991, ...,   860, 15795, 56422])

三、交叉验证

由上几步可得,将数据集的前6w为训练集training,后1w为测试集testing
在这里插入图片描述
首先:将整个数据集分为两部分训练集和测试集,其中测试集相当于高考,测试集是非常非常宝贵的东西,仅此一次。故为了效果更好,需要中途在进行几次模拟考试类似期中期末考试,这时候需要从训练集中再抽取出一部分充当期中期末考试,即验证集validation。

例如:training中有5份样本,交叉验证就是将这5份打乱,依次从中随机抽取1份为validation,剩下的为training。然后每次通过模型去训练,得出一个预测结果,求取平均值即可。
在这里插入图片描述

# 为了简单起见,这里只判断样本是否是5
y_train_5 = (y_train==5)#是否是5
y_test_5 = (y_test==5)#将10分类转换为2分类进行演示
#训练集前十个样本是不是5
y_train_5[:10]#array([False, False, False, False, False, False, False, False, False, True])

在这里插入图片描述SGDClassifier的方法详细参数

#SGDClassifier 梯度下降分类器
from sklearn.linear_model import SGDClassifier
sgd_clf = SGDClassifier(max_iter=5,random_state=42)#max_iter最大迭代次数;random_state随机种子,每次随机策略都一样
sgd_clf.fit(X_train,y_train_5)#通过SGD训练分类器
'''
SGDClassifier(alpha=0.0001, average=False, class_weight=None,early_stopping=False, epsilon=0.1, eta0=0.0, fit_intercept=True,l1_ratio=0.15, learning_rate='optimal', loss='hinge', max_iter=5,n_iter=None, n_iter_no_change=5, n_jobs=None, penalty='l2',power_t=0.5, random_state=42, shuffle=True, tol=None,validation_fraction=0.1, verbose=0, warm_start=False)
'''
#训练完成之后,对该分类器进行测试,预测35000这个样本是5,为啥?然后进行通过索引查下是否是5
sgd_clf.predict([X[35000]])#array([ True])
#通过索引验证下35000样本是否是5
y[35000]#5.0

Ⅰ交叉验证的实现

在这里插入图片描述cross_val_score方法的详细参数

"""
参数一:将训练的模型传入进来
参数二:传入当前的训练数据
参数三:当前的标签
参数四:cv=3表示把数据集切分成3分,最后进行3次交叉验证,会输出3个交叉验证的结果
参数五:使用什么指标进行评估得分,accuracy表示使用准确率来进行评估
"""
from sklearn.model_selection import cross_val_score
cross_val_score(sgd_clf,X_train,y_train_5,cv=3,scoring='accuracy')#array([0.9502 , 0.96565, 0.96495])
X_train.shape#(60000, 784)#训练的时候传入了6w个样本
y_train_5.shape#(60000,)

Ⅱ自己对数据集进行切分训练预测

在这里插入图片描述
StratifiedKFold方法的详细参数
在这里插入图片描述
clone方法的详细参数
因为把数据集切分为多份,每一份都需要用的和原来一样的分类器,相同的模型,相同的参数。
交叉验证为了保证公平,每次传入的参数都是相同的。为了保证公平,使用了clone方法。

from sklearn.model_selection import StratifiedKFold
from sklearn.base import cloneskflods = StratifiedKFold(n_splits=3,random_state=42)#将数据集分成3分,随机种子这里设置的为42
for train_index,test_index in skflods.split(X_train,y_train_5):#对每一份数据集进行fit操作,split方法,切分数据集和标签clone_clf = clone(sgd_clf)#克隆分类器X_train_folds = X_train[train_index]#通过索引找图片样本y_train_folds = y_train_5[train_index]#这三类训练和测试数据都要来源于trainingX_test_folds = X_train[test_index]y_test_folds = y_train_5[test_index]clone_clf.fit(X_train_folds,y_train_folds)y_pred = clone_clf.predict(X_test_folds)n_correct = sum(y_pred == y_test_folds)print(n_correct/len(y_pred))
"""
0.9502
0.96565
0.96495
"""

四、Confusion Matrix-混淆矩阵

已知条件:一个班100人,男80,女20。
目标:找出所有女生。
结果:从班里面找了50人,其中20个女的,30个男的。

相关Relevant,正类无关NonRelevant,负类
被检索到RetrievedTrue Positives,TP正类判定为正类,即准确判断出这是为女生False Positives,FP负类判定为正类,“存伪”,即分明是男生,却判断出是女生
没被检索到NotRetrievedFalse Negatives,FN正类判定为负类,“去真”,即分明是女生,却判断出是男生True Negatives,TN负类判定为负类,即一个男生被判定是男生

故TP=20;FP=30;FN=0;TN=50

在这里插入图片描述
cross_val_predict方法的详细参数

"""
参数一:分类器的名称
参数二:训练集
参数三:标签
参数四:分成几份
"""
from sklearn.model_selection import cross_val_predict
y_train_pred = cross_val_predict(sgd_clf,X_train,y_train_5,cv=3)
y_train_pred.shape#(60000,)#训练的时候传入了6w个样本,得到6w个样本的预测结果
X_train.shape#(60000, 784)

在这里插入图片描述
confusion_matrix方法的详细参数

"""
一般的混淆矩阵参数为2×2
参数一:训练值
参数二:实际预测结果
"""
from sklearn.metrics import confusion_matrix
confusion_matrix(y_train_5,y_train_pred)
"""
array([[53272,  1307],[ 1077,  4344]], dtype=int64)
"""

对于array数组中参数分析:
在这里插入图片描述

五、Precision精度 and Recall召回率

在这里插入图片描述
在这里插入图片描述
Positives:==5
Negatives: ≠5

在这里插入图片描述
precision_score方法的详细参数
在这里插入图片描述
recall_score方法的详细参数

from sklearn.metrics import precision_score,recall_score
precision_score(y_train_5,y_train_pred)#0.7687135020350381
recall_score(y_train_5,y_train_pred)#0.801328168234643

将Precision 和 Recall结合到一个称为F1 score 的指标,调和平均值给予低值更多权重。 因此,如果召回和精确度都很高,分类器将获得高F 1分数。
在这里插入图片描述
在这里插入图片描述
f1_score方法的详细参数

from sklearn.metrics import f1_score
f1_score(y_train_5,y_train_pred)#0.7846820809248555

六、阈值对结果的影响

在这里插入图片描述
decision_function方法的详细参数

y_scores = sgd_clf.decision_function([X[35000]])
y_scores#array([43349.73739616])
t = 50000
y_pred = (y_scores > t)#设置阈值
y_pred#array([False])

Scikit-Learn不允许直接设置阈值,但它可以得到决策分数,调用其decision_function()方法,而不是调用分类器的predict()方法,该方法返回每个实例的分数,然后使用想要的阈值根据这些分数进行预测:

y_scores = cross_val_predict(sgd_clf, X_train, y_train_5, cv=3, method="decision_function")
y_scores[:10]
"""
array([ -434076.49813641, -1825667.15281624,  -767086.76186905,-482514.55006702,  -466416.8082872 ,  -311904.74603814,-582112.5580173 ,  -180811.15850786,  -442648.13282116,-87710.09830358])
"""
from sklearn.metrics import precision_recall_curve
precisions, recalls, thresholds = precision_recall_curve(y_train_5, y_scores)
y_train_5.shape#(60000,)#6w个样本
thresholds.shape#(59698,)#59698个阈值
precisions[:10]
"""
array([0.09080706, 0.09079183, 0.09079335, 0.09079487, 0.09079639,0.09079792, 0.09079944, 0.09080096, 0.09080248, 0.090804  ])
"""
precisions.shape#(59699,)#59699个阈值
recalls.shape#(59699,)#59699个阈值

对于不同的阈值,随着阈值的变换,精度和召回率变换的情况如下:

def plot_precision_recall_vs_threshold(precisions,recalls,thresholds):plt.plot(thresholds,precisions[:-1],"b--",label="Precision")plt.plot(thresholds,recalls[:-1],"g-",label="Recall")plt.xlabel("Threshold",fontsize=16)plt.legend(loc="upper left",fontsize=16)plt.ylim([0,1])plt.figure(figsize=(8, 4))
plot_precision_recall_vs_threshold(precisions,recalls,thresholds)
plt.xlim([-700000, 700000])
plt.show()

在这里插入图片描述
随着Recall的变换,Precision的变换如下:

def plot_precision_vs_recall(precisions, recalls):plt.plot(recalls, precisions, "b-", linewidth=2)plt.xlabel("Recall", fontsize=16)plt.ylabel("Precision", fontsize=16)plt.axis([0, 1, 0, 1])plt.figure(figsize=(8, 6))
plot_precision_vs_recall(precisions, recalls)
plt.show()

在这里插入图片描述

七、ROC curves(常用)

receiver operating characteristic (ROC) 曲线是二元分类中的常用评估方法
①它与精确度/召回曲线非常相似,但ROC曲线不是绘制精确度与召回率,而是绘制true positive rate(TPR) 与false positive rate(FPR)
②要绘制ROC曲线,首先需要使用roc_curve()函数计算各种阈值的TPR和FPR:
TPR = TP / (TP + FN) (Recall)
FPR = FP / (FP + TN)

from sklearn.metrics import roc_curve
fpr, tpr, thresholds = roc_curve(y_train_5, y_scores)
def plot_roc_curve(fpr, tpr, label=None):plt.plot(fpr, tpr, linewidth=2, label=label)plt.plot([0, 1], [0, 1], 'k--')plt.axis([0, 1, 0, 1])plt.xlabel('False Positive Rate', fontsize=16)plt.ylabel('True Positive Rate', fontsize=16)plt.figure(figsize=(8, 6))
plot_roc_curve(fpr, tpr)
plt.show()

在这里插入图片描述
虚线表示纯随机分类器的ROC曲线; 一个好的分类器尽可能远离该线(朝左上角)。

比较分类器的一种方法是测量曲线下面积(AUC)。完美分类器的ROC AUC等于1,而纯随机分类器的ROC AUC等于0.5。 Scikit-Learn提供了计算ROC AUC的函数:

from sklearn.metrics import roc_auc_scoreroc_auc_score(y_train_5, y_scores)#0.9624496555967156

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

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

相关文章

union

关键字 1. 共用体声明和共用体变量定义共用体(参考“共用体”百科词条)是一种特殊形式的变量,使用关键字union来定义共用体(有些人也叫"联合")声明和共用体变量定义与结构体十分相似。其形式为:union 共用体名{数据类型 成员名;数据类型 成员名;...} 变量…

SEL

Object-C 中的Selector 概念 Andrew Huang <bluedrum163.com> 转载请注明作者和联络方式 在iphone程序中会大量看到selector这样的用法。<<iphone开发基础>花了很大一个篇幅来解析这个语法&#xff0c;但是不知 是翻译问题&#xff0c;还是解释过细&#xff0c…

Java Calendar add()方法与示例

日历类的add()方法 (Calendar Class add() method) add() method is available in java.util package. add()方法在java.util包中可用。 add() method is used to perform add or subtract the given amount of time to the given cal_fi (calendar field). add()方法用于对指定…

三、线性回归实验分析

所有代码块都是在Jupyter Notebook下进行调试运行&#xff0c;前后之间都相互关联。 文中所有代码块所涉及到的函数里面的详细参数均可通过scikit-learn官网API文档进行查阅&#xff0c;这里我只写下每行代码所实现的功能&#xff0c;参数的调整读者可以多进行试验调试。多动手…

leetcode 236. 二叉树的最近公共祖先 思考分析

目录题目思考分析改进本文章代码思路来源于公众号【代码随想录】题目 给定一个二叉树, 找到该树中两个指定节点的最近公共祖先。 百度百科中最近公共祖先的定义为&#xff1a;“对于有根树 T 的两个结点 p、q&#xff0c;最近公共祖先表示为一个结点 x&#xff0c;满足 x 是 p、…

轻轻松松给PCB板添加LOGO

在 PCB 图中放置汉字或图形的方法&#xff1a;A、文字——> 图片——> PCB 图——> 复制到自己作品中B、图片——> PCB 图——> 复制到自己作品中1、首先准备好“BMP”格式的图片&#xff0c;在图片中依靠颜色分辨图层&#xff0c;所以最好准备“单色黑白”图。…

java bitset_Java BitSet clone()方法及示例

java bitsetBitSet类clone()方法 (BitSet Class clone() method) clone() method is available in java.util package. clone()方法在java.util包中可用。 clone() method is used to clone this Bitset or in other words, this method is used to create a Bitset that is si…

小技巧

//屏蔽下拉框的某一个选项 <disabled"disable">... 1 <html>2 <body>3 4 <select>5 <option>Volvo</option>6 <option>Saab</option>7 <option disabled"disabled">Mercedes</option>…

jquery中text val html attr的差别

html和innerHTMl是一样的&#xff0c;可以获得和设置html标签文本如&#xff1a;设置值&#xff1a;$("p").html("<span stylefont-size:13px;color:red>HTML标签文本</span>"); 获得值&#xff1a;$("p").html(); text和innerText是…

leetcode 235. 二叉搜索树的最近公共祖先 思考分析

目录题目思考迭代法题目 给定一个二叉搜索树, 找到该树中两个指定节点的最近公共祖先。 百度百科中最近公共祖先的定义为&#xff1a;“对于有根树 T 的两个结点 p、q&#xff0c;最近公共祖先表示为一个结点 x&#xff0c;满足 x 是 p、q 的祖先且 x 的深度尽可能大&#xff0…

四、逻辑回归

逻辑回归logistic_regression(LR)其实是分类算法&#xff0c;而不是回归算法。 回归算法得到的是一个数&#xff0c;分类算法得到的是几个不同的类别。 逻辑回归就是通过函数将值转换为0-1之间&#xff0c;形成概率问题&#xff0c;从而实现了不同类别的分类。 Sigmoid 函数 …

db,dbms,dba_DBMS中的数据库管理员(DBA)

db,dbms,dba数据库管理员(DBA) (Database Administrator (DBA)) To use the Database Management System, it is necessary to have central control over data and programs together in order to access such data. A person who has central control over such system is re…

运算符优先级

转载于:https://www.cnblogs.com/c-cloud/p/3280911.html

五、逻辑回归实验分析

所有代码块都是在Jupyter Notebook下进行调试运行&#xff0c;前后之间都相互关联。 文中所有代码块所涉及到的函数里面的详细参数均可通过scikit-learn官网API文档进行查阅&#xff0c;这里我只写下每行代码所实现的功能&#xff0c;参数的调整读者可以多进行试验调试。多动手…

二叉搜索树的插入、删除、修剪、构造操作(leetcode701、450、669、108)

目录1、leetcode 701. 二叉搜索树中的插入操作1、题目2、递归法3、迭代法2、leetcode 450. 二叉搜索树中的插入操作1、题目2、思路递归法3、迭代法4、删除结点的两个方法以及注意点3、leetcode 669. 修剪二叉搜索树1、题目2、思考与递归3、迭代法4、leetcode 108. 将有序数组转…

Memcached查看和清理

1.一种telnet localhost 11211 #登陆stats #查看状态flush_all #清理quit #退出2.又学到一个:echo flush_all | nc localhost 112113.1、数据存储(假设key为test,value为12345) printf "set test 0 1 5\r\n12345\r\n" | nc localhost 11211STORED2.数据取回(假设key为…

模拟退火算法解决np_P和NP问题与解决方案| 演算法

模拟退火算法解决npP问题 (P Problems) P is the set of all the decision problems solvable by deterministic algorithms in polynomial time. P是多项式时间内确定性算法可解决的所有决策问题的集合。 NP问题 (NP Problems) NP is the set of all the decision problems t…

POJ2251Dungeon Master

http://poj.org/problem?id2251 题意 &#xff1a; 就是迷宫升级版&#xff0c;从以前的一个矩阵也就是一层&#xff0c;变为现在的L层&#xff0c;" . "是可以走&#xff0c;但是“#”不可以走&#xff0c;从S走到E&#xff0c;求最短的路径&#xff0c;若是找不到…

六、聚类算法

一、聚类概念 1&#xff0c;通俗易懂而言&#xff0c;聚类主要运用于无监督学习中&#xff0c;也就是将没有标签的东西如何分为几堆儿。 2&#xff0c;无监督学习即没有标签&#xff0c;不知道这些玩意到底是啥。当然&#xff0c;有监督学习就是由标签&#xff0c;我们是提前知…

Apache服务器通过.htaccess文件设置防盗链

用户经常面对的一个问题就是服务器的流量问题&#xff0c;而站点文件被盗链是其中最为主要的部分。所谓盗链&#xff0c;是指其他网站直接链接我们网站上的文件&#xff0c;一般来 说&#xff0c;盗链的对象大多为很耗带宽的大体积文件&#xff0c;如图片、视频等。这样造成的后…