python大战机器学习——模型评估、选择与验证
1、损失函数和风险函数
(1)损失函数:常见的有 0-1损失函数 绝对损失函数 平方损失函数 对数损失函数
(2)风险函数:损失函数的期望 经验风险:模型在数据集T上的平均损失
根据大数定律,当N趋向于∞时,经验风险趋向于风险函数
2、模型评估方法
(1)训练误差与测试误差
训练误差:关于训练集的平均损失
测试误差:定义模型关于测试集的平均损失。其反映了学习方法对未知测试数据集的预测能力
(2)泛化误差:学到的模型对未知数据的预测能力。其越小,该模型越有效。泛化误差定义为所学习模型的期望风险
(3)过拟合:对已知数据预测得很好,对未知数据预测得很差的现象。原因是将训练样本本身的一些特点当做了所有潜在样本都具有的一般性质,这会造成泛化能力的下降。常用的防止过拟合的办法为正则化。正则化是基于结构化风险最小化策略的实现。
3、模型评估
(1)留出法:直接将数据划分为三个互斥的部分,然后在训练集上训练模型,在验证集上选择模型,最后用测试集上的误差作为泛化误差的估计。
(2)交叉验证法(S折交叉验证法):数据随机划分为S个互不相交且大小相同的子集,利用S-1个子集数据训练模型,利用余下的一个子集测试模型。对S种组合依次重复进行,获取测试误差的均值。
(3)留一法:留出一个样例作为测试集。其缺点就是当数据集比较大时计算量太大
(4)自助法:先从T中随机取出一个样本放入采样集TS中,再把该样本放回T中。经过N次随机采样操作,得到包含N个样本的采样集TS。将TS用作训练集,T-TS用过测试集。
4、性能度量
(1)测试准确率和测试错误率
(2)混淆矩阵
查准率:P=TP/(TP+FP) ,即所有预测为正类的结果中,真正的正类的比例
查全率:R=TP/(TP+FN),即正真的正类中,被分类器找出来的比例
不同的问题中,判别标准不同。对于推荐系统,更侧重于查准率(即推荐的结果中,用户真正感兴趣的比例);对于医学诊断系统,更侧重于查全率(即疾病被发现的比例)
2/F1=1/P+1/R
5、ROC曲线
真正例率:TPR=TP/(TP+FN)
假正例率:FPR=FP/(TN+FP),刻画的是分类器错认为正类的负实例占所有负实例的比例
以真正例率为纵轴、假正例率为横轴作图,就得到ROC曲线。在ROC图中,对角线对应于随机猜想模型。点(0,1)对应于理想模型。通常ROC曲线越靠近点(0,1)越好。
6、偏差方差分解
代码如下:
from sklearn.metrics import zero_one_loss,log_loss
from sklearn.model_selection import train_test_split,KFold,StratifiedKFold,LeaveOneOut,cross_val_score
from sklearn.datasets import load_digits,load_iris
from sklearn.svm import LinearSVC,SVC
from sklearn.metrics import accuracy_score,precision_score,recall_score,f1_score,classification_report
from sklearn.metrics import confusion_matrix,precision_recall_curve,roc_curve
from sklearn.metrics import mean_absolute_error,mean_squared_error,classification_report
from sklearn.multiclass import OneVsRestClassifier
from sklearn.model_selection import validation_curve,learning_curve,GridSearchCV,RandomizedSearchCV
import matplotlib.pyplot as plt
from sklearn.preprocessing import label_binarize
from sklearn.linear_model import LogisticRegression
import numpy as np
#zero_one_loss
# y_true=[1,1,1,1,1,0,0,0,0,0]
# y_pred=[0,0,0,1,1,1,1,1,0,0]
# print("zero_one_loss<fraction>:",zero_one_loss(y_true,y_pred,normalize=True))
# print("zero_one_loss<num>:",zero_one_loss(y_true,y_pred,normalize=False)) #log_loss
# y_true=[1,1,1,0,0,0]
# y_pred=[[0.1,0.9],
# [0.2,0.8],
# [0.3,0.7],
# [0.7,0.3],
# [0.8,0.2],
# [0.9,0.1]
# ]
# print("log_loss<average>:",log_loss(y_true,y_pred,normalize=True))
# print("log_loss<total>:",log_loss(y_true,y_pred,normalize=False)) #train_test_split
# X=[
# [1,2,3,4],
# [11,12,13,14],
# [21,22,23,24],
# [31,32,33,34],
# [41,42,43,44],
# [51,52,53,54],
# [61,62,63,64],
# [71,72,73,74]
# ]
# Y=[1,1,0,0,1,1,0,0]
# X_train,X_test,Y_train,Y_test=train_test_split(X,Y,test_size=0.4,random_state=0)
# print("X_train=",X_train)
# print("X_test=",X_test)
# print("Y_train=",Y_train)
# print("Y_test=",Y_test)
# X_train,X_test,Y_train,Y_test=train_test_split(X,Y,test_size=0.4,random_state=0,stratify=Y)
# print("X_train=",X_train)
# print("X_test=",X_test)
# print("Y_train=",Y_train)
# print("Y_test=",Y_test) #KFold
# X=np.array([
# [1,2,3,4],
# [11,12,13,14],
# [21,22,23,24],
# [31,32,33,34],
# [41,42,43,44],
# [51,52,53,54],
# [61,62,63,64],
# [71,72,73,74],
# [81,82,83,84]
# ])
# Y=np.array([1,1,0,0,1,1,0,0,1])
#
# folder=KFold(n_splits=3,random_state=0,shuffle=False)
# for train_index,test_index in folder.split(X,Y):
# print("Train Index:",train_index)
# print("Test Index:",test_index)
# print("X_train:",X[train_index])
# print("X_test:",X[test_index])
# print("")
#
# shuffle_folder=KFold(n_splits=3,random_state=0,shuffle=True)
# for train_index,test_index in shuffle_folder.split(X,Y):
# print("Train Index:",train_index)
# print("Test Index:",test_index)
# print("X_train:",X[train_index])
# print("X_test:",X[test_index])
# print("") #StratifiedKFold
# stratified_folder=StratifiedKFold(n_splits=4,random_state=0,shuffle=False)
#as the operation is similar to the above,pass #LeaveOneOut,too easy,pass
# loo=LeaveOneOut(len(Y)) #cross_val_score
# digits=load_digits()
# X=digits.data
# Y=digits.target
#
# result=cross_val_score(LinearSVC(),X,Y,cv=10)
# print("Cross Val Score is:",result) #accuracy_score,pass
# accuracy_score(y_true,y_pred,normalize=True/False) #precision_score,pass
# precision_socre(y_true,y_pred) #recall_score,pass
# recall_score(y_true,y_pred) #f1_score,pass
# f1_score(y_true,y_pred) #fbeta_score,pass
# fbeta_score(y_true,y_pred,beta=num_beta) #classification_report
# y_true=[1,1,1,1,1,0,0,0,0,0]
# y_pred=[0,0,1,1,0,0,0,0,0,0]
# print("Classification Report:\n",classification_report(y_true,y_pred,target_names=["class_0","class_1"])) #confusion_matrix,pass
# confusion_matrix(y_true,y_pred,labels=[0,1]) #precision_recall_curve
# iris=load_iris()
# X=iris.data
# Y=iris.target
# #print(X,'\n',Y)
# Y=label_binarize(Y,classes=[0,1,2])
# n_classes=Y.shape[1]
# # print(n_classes,'\n',Y)
# np.random.seed(0)
# n_samples,n_features=X.shape
# # print(n_samples,'\n',n_features)
# X=np.c_[X,np.random.randn(n_samples,200*n_features)]
# # n_samples,n_features=X.shape
# # print(n_samples,'\n',n_features)
# x_train,x_test,y_train,y_test=train_test_split(X,Y,test_size=0.5,random_state=0)
# clf=OneVsRestClassifier(SVC(kernel='linear',probability=True,random_state=0))
# clf.fit(x_train,y_train)
# y_score=clf.fit(x_train,y_train).decision_function(x_test)
# # print(y_score)
# fig=plt.figure()
# ax=fig.add_subplot(1,1,1)
# precision=dict()
# recall=dict()
# for i in range(n_classes):
# precision[i],recall[i],_=precision_recall_curve(y_test[:,i],y_score[:,i])
# ax.plot(recall[i],precision[i],label="target=%s"%i)
# ax.set_xlabel("Recall Score")
# ax.set_ylabel("Precision Score")
# ax.set_title("P-R")
# ax.legend(loc="best")
# ax.set_xlim(0,1.1)
# ax.set_ylim(0,1.1)
# ax.grid()
# plt.show() #roc_curve,roc_auc_score,pass
# roc_curve(y_test,y_score) #mean_absolute_error,pass
# mean_absolute_error(y_true,y_pred) #mean_squared_error,pass
# mean_squared_error(y_true,y_pred) #validation_curve,pass
# validation_curve(LinearSVC(),X,Y,param_name="C",param_range=np.logspace(-2,2),cv=10,scoring="accuracy") #learning_curve,pass
# train_size=np.linspace(0.1,1.0,endpoint=True,dtype='float')
# learning_curve(LinearSVC(),X,Y,cv=10,scoring="accuracy",train_sizes=train_size) #GridSearcgCV
# digits=load_digits()
# x_train,x_test,y_train,y_test=train_test_split(digits.data,digits.target,test_size=0.25,random_state=0,stratify=digits.target)
# tuned_parameters=[{'penalty':['l1','l2'],'C':[0.01,0.05,0.1,0.5,1,5,10,50,100],'solver':['liblinear'],'multi_class':['ovr']},
# {'penalty':['l2'],'C':[0.01,0.05,0.1,0.5,1,5,10,50,100],'solver':['lbfgs'],'multi_class':['ovr','multinomial']},
# ]
# clf=GridSearchCV(LogisticRegression(tol=1e-6),tuned_parameters,cv=10)
# clf.fit(x_train,y_train)
# print("Best parameters set found:",clf.best_params_)
# print("Grid scores:")
# for params,mean_score,scores in clf.grid_scores_:
# print("\t%0.3f(+/-%0.03f) for %s"%(mean_score,scores.std()*2,params))
#
# print("Optimized Score:",clf.score(x_test,y_test))
# print("Detailed classification report:")
# y_true,y_pred=y_test,clf.predict(x_test)
# print(classification_report(y_true,y_pred)) #RandomizedSearchCV
# RandomizedSearchCV(LogisticRegression(penalty='l2',solver='lbfgs',tol=1e-6,tuned_parameters,cv=10,scoring='accuracy',n_iter=100))
python大战机器学习——模型评估、选择与验证的更多相关文章
- python大战机器学习——支持向量机
支持向量机(Support Vector Machine,SVM)的基本模型是定义在特征空间上间隔最大的线性分类器.它是一种二类分类模型,当采用了核技巧之后,支持向量机可以用于非线性分类. 1)线性可 ...
- python大战机器学习——数据降维
注:因为公式敲起来太麻烦,因此本文中的公式没有呈现出来,想要知道具体的计算公式,请参考原书中内容 降维就是指采用某种映射方法,将原高维空间中的数据点映射到低维度的空间中 1.主成分分析(PCA) 将n ...
- Python大战机器学习——基础知识+前两章内容
一 矩阵求导 复杂矩阵问题求导方法:可以从小到大,从scalar到vector再到matrix. x is a column vector, A is a matrix d(A∗x)/dx=A d( ...
- python大战机器学习——集成学习
集成学习是通过构建并结合多个学习器来完成学习任务.其工作流程为: 1)先产生一组“个体学习器”.在分类问题中,个体学习器也称为基类分类器 2)再使用某种策略将它们结合起来. 通常使用一种或者多种已有的 ...
- python大战机器学习——聚类和EM算法
注:本文中涉及到的公式一律省略(公式不好敲出来),若想了解公式的具体实现,请参考原著. 1.基本概念 (1)聚类的思想: 将数据集划分为若干个不想交的子集(称为一个簇cluster),每个簇潜在地对应 ...
- python大战机器学习——数据预处理
数据预处理的常用流程: 1)去除唯一属性 2)处理缺失值 3)属性编码 4)数据标准化.正则化 5)特征选择 6)主成分分析 1.去除唯一属性 如id属性,是唯一属性,直接去除就好 2.处理缺失值 ( ...
- python大战机器学习——半监督学习
半监督学习:综合利用有类标的数据和没有类标的数据,来生成合适的分类函数.它是一类可以自动地利用未标记的数据来提升学习性能的算法 1.生成式半监督学习 优点:方法简单,容易实现.通常在有标记数据极少时, ...
- python大战机器学习——人工神经网络
人工神经网络是有一系列简单的单元相互紧密联系构成的,每个单元有一定数量的实数输入和唯一的实数输出.神经网络的一个重要的用途就是接受和处理传感器产生的复杂的输入并进行自适应性的学习,是一种模式匹配算法, ...
- python进行机器学习(四)之模型验证与参数选择
一.模型验证 进行模型验证的一个重要目的是要选出一个最合适的模型,对于监督学习而言,我们希望模型对于未知数据的泛化能力强,所以就需要模型验证这一过程来体现不同的模型对于未知数据的表现效果. 这里我们将 ...
随机推荐
- bzoj 4504: K个串 可持久化线段树+堆
题目: Description 兔子们在玩k个串的游戏.首先,它们拿出了一个长度为n的数字序列,选出其中的一 个连续子串,然后统计其子串中所有数字之和(注意这里重复出现的数字只被统计一次). 兔子们想 ...
- Link-cut-tree 学习记录 & hdu4010
网上的lct一抓一大把,所以我也不再写什么讲解了,只写一写自己的看法. Link-cut-tree 是用于维护动态树的一种数据结构 所谓动态树就是一片存在边的添加与删除的森林中的一棵树 所以我们要快速 ...
- Java中CountDownLatch类的使用
0.CountDownLatch作用 1) Java api中的解释:一个同步辅助类,在完成一组正在其他线程中执行的操作之前,它允许一个或多个线程一直等待. 2) CountDownLatch可以使J ...
- java中的equals方法
这个方法首先比较的是两个对象的地址是否相同,如果相同直接返回true, 否则, (1)如果是string类型的先比较是否是string类型,是的话,再比较是否长度相同,相同的话再比较,每个字符是否相同 ...
- C++零碎知识点(一)
1.sizeof用法总结 ①与strlen比较 strlen 计算字符数组的字符数,以"\0"为结束判断,但不包括. sizeof 计算数据(数组.变量.类型.结构 ...
- centos7安装与配置ansible
此次测试总共有三台机,分别如下: ansible服务器:10.0.0.20 client01:10.0.0.21 client02:10.0.0.22 一.安装ansible 1. python版本需 ...
- CentOS 7 安装 Zabbix 3.0
CentOS7搭建Zabbix 一.安装数据库: 1. 安装数据库:sudo yum grouinstall mariadb –y 2. 启动数据库:sudo systemctl start ...
- zookeeper相关知识的总结:
一.分布式协调技术 在给大家介绍ZooKeeper之前先来给大家介绍一种技术——分布式协调技术.那么什么是分布式协调技术?那么我来告诉大家,其实分布式协调技术 主要用来解决分布式环境当中多个进程之间的 ...
- Eclipse插件——EasyExplore安装
Eclipse插件--EasyExplore安装 分类: eclipse2011-12-07 09:02 458人阅读 评论(0) 收藏 举报 插件功能 easyexplore是一个eclipse的小 ...
- 【Redis】Redis事务详解,Redis事务支持回滚(不支持悲观锁)
1.redis事物参考:https://baijiahao.baidu.com/s?id=1613631210471699441&wfr=spider&for=pc (php操作red ...