sklearn模型评选择与评估

1. 数据集划分

1.1 K折交叉验证

1.1.1 K折交叉验证算法原理
a. 将全部训练及S分成K个不相交的子集,假设S中样本个数为M,那么,每一个子集的训练样本个数为M/K相应的子集称做{S1,S2,...,SK}\{S_{1},S_{2},...,S_{K}\}{S1​,S2​,...,SK​}
b. 每次从分好的训练只集中拿出一个测试集。其他K-1一个作为训练集。
c. 在K-1一个训练集上训练出学习器模型,把这个模型放到测试集上,得到分类率.
d. 计算K求得分类率的平均值。作为该模型的真实分类率。

1.1.2 StratifiedKFold划分后,训练集、测试集的比例与原始数据集一致。
1.1.3优缺点
优点:充分利用了所有样本
缺点:计算繁琐。计算K次,测试K次
1.1.4代码

返回的是每一折的索引

def KFold_practice():x = np.arange(12)X = x.reshape(6, 2)y = np.arange(15, 21)kf = model_selection.KFold(n_splits=3)  # 定义一个K折分割器  还有参数shuffle,random_state'KFold.split(x)返回的是索引,训练样本和测试样本是什么要将索引带到数据集中去'for train_index, test_index in kf.split(X):print("TRAIN Index:", train_index,"TEST Index:", test_index)X_train, X_test = X[train_index], X[test_index]y_train, y_test = y[train_index], y[test_index]print("TRAIN Subset:\n", X_train)print("TEST Subset:\n", X_test)
KFold_practice()
TRAIN Index: [2 3 4 5] TEST Index: [0 1]
TRAIN Subset:[[ 4  5][ 6  7][ 8  9][10 11]]
TEST Subset:[[0 1][2 3]]
TRAIN Index: [0 1 4 5] TEST Index: [2 3]
TRAIN Subset:[[ 0  1][ 2  3][ 8  9][10 11]]
TEST Subset:[[4 5][6 7]]
TRAIN Index: [0 1 2 3] TEST Index: [4 5]
TRAIN Subset:[[0 1][2 3][4 5][6 7]]
TEST Subset:[[ 8  9]]

1.2 留一法(LOO)

1.2.1 留一法
假设在N个样本中,将每一个样本作为测试集,剩下的N-1个作为作为训练样本,这样得到N个分类器、N个测试结果,N个结果平均来衡量模型的性能。
LOO与KFold相比,当K<<N时,LOO比KFold更耗时。
1.2.2 留P法
假设在N个样本中,将P个样本作为测试集,剩下的N-P个作为作为训练样本,这样得到CnPC_{n}^{P}CnP​个训练-测试集对(train-test pairs),当P>1是,测试集将发生重叠。当P=1时,变成了留一法。
1.2.3 代码
与Kfold类似,划分后返回的也是索引

def leave_one_out():x = np.arange(5,13)X = x.reshape(4, 2)y = np.arange(15, 21)loo = model_selection.LeaveOneOut()for train_index,test_index in loo.split(X):print("TRAIN INDEX:", train_index, "TEST INDEX:", test_index)X_train, X_test = X[train_index], X[test_index]# y_train, y_test = y[train_index], y[test_index]print("TRAIN X:", X_train, "TEST X:", X_test)

1.3 随机划分法

产生指定数量的训练/测试数据集划分。指定训练集和测试集的比例或者数量。
首先对样本随机打乱,然后划分train/test对。
可以通过random_state控制随机序列发生器,使得运算结果可重现。
StratifiedShuffleSplitShuffleSplit的变体,返回分层划分。划分后每一个类的比例与原始数据集比例一致。

2. 超参数优化方法

2.1 网格搜索穷举式超参数优化方法

GridSearchCV(eatimator,param_grid=param_grid)
参数
eatimator:分类器
param_grid:参数网格

from sklearn.datasets import load_digits
from sklearn.ensemble import forest
from scipy import stats
import numpy as np
import pandas as pddata = load_digits()
print(data.keys())
X,y = data['data'],data['target']
X_train, X_test, y_train, y_test = train_test_split(X,y,train_size=0.7,test_size=0.3)model = forest.RandomForestClassifier(n_estimators=10)
# 待优化的超参数
print(model.get_params().keys())# 获取模型的参数名
def gridSearchCV(model):param_grid = {'criterion': ['gini', 'entropy'],'max_depth': [3, None],'min_samples_split': np.arange(2,11),'min_samples_leaf': np.arange(1,11),}start = time.time()clf = GridSearchCV(model,param_grid=param_grid)clf.fit(X_train, y_train)duration = time.time() - startprint('*best_params_*:\n', clf.best_params_)# print('*best_estimator_*:\n',clf.best_estimator_)print('模型在测试集的得分', clf.score(X_test, y_test))print('总共耗时:', duration)cv_result = pd.DataFrame.from_dict(clf.cv_results_)print(type(clf.cv_results_))print(clf.cv_results_.keys())# with open('GridSearchCV_result.csv', 'w') as f: cv_result.to_csv(f)

参数网格如下。一共有2*2*9*10=360种组合方式。GridSearchCV在每种参数组合下计算在N折交叉验证的每一折中计算训练集和测试集上的得分。

clf.cv_results_是一个字典类型的数据,结果如下。rank_test_score对应的是某中参数组合下,模型在测试集中结果的排名。

2.2 随机采样式超参数优化方法

RandomizedSearchCV(eatimator, param_distributions=param_distribution, n_iter=10,cv=3)
参数
eatimator:分类器
param_distributions:参数分布。参数值按参数分布选取
n_iter:迭代次数,选多少组参数组合

#模型与GridSearchCV相同
def randomizedCV(model):param_distribution = {'criterion': ['gini', 'entropy'],'max_depth': [3, None],'min_samples_split': stats.randint(2, 11),'min_samples_leaf': stats.randint(1, 11),}start = time.time()clf = RandomizedSearchCV(model, param_distributions=param_distribution, n_iter=10,cv=3)clf.fit(X_train, y_train)duration = time.time() - startprint('*best_params_*:\n', clf.best_params_)# print('*best_estimator_*:\n',clf.best_estimator_)print(type(clf.cv_results_))top = 3# clf.cv_results_ 是选择参数的日志信息# cv_result = pd.DataFrame.from_dict(clf.cv_results_)# with open('cv_result.csv', 'w') as f: cv_result.to_csv(f)# report(clf.cv_results_,top)# # print('模型在测试集的得分', clf.score(X_test, y_test))# print('总共耗时:', duration)


3. 模型验证方法

3.1 通过交叉验证计算得分

model_selection.cross_val_score(eatimator,X,y,cv=cv,n_jobs=4)
参数
eatimator:实现fit()的学习器
X:array_like,需要学习的数据,可以是列表或2d数组
y:array_like,可选的。监督学习中样本的真实目标值
scoring:string,callable or None,可选的,默认是None
   None - 调用eatimator的score函数
   string Or callable需实现scorer(estimator,X,y)
cv: int,交叉验证生成器对象或者一个迭代器,可选的,默认None
   决定交叉验证划分策略,cv的可选项:
a. None:使用默认的3折交叉验证
b.interger:K折StratifiedKfold的K
c.交叉验证生成器对象
d.一个能产生train/test划分的迭代器对象。
返回值
scores:浮点数组,shape=len(list(cv)) 在测试集上的得分
每一次交叉验证的得分形成一个数组(默认是3折交叉验证,生成3个数组)

#coding:utf-8
from sklearn.datasets import load_digits
from sklearn.model_selection import cross_val_score,ShuffleSplit
from sklearn.svm import SVC
import numpy as np
from matplotlib import pyplot as plt
data = load_digits()
# print(data.keys())
X,y = data['data'],data['target']# data['data'] 一维数组, data['images'] 二维数组(8x8)
# print(len(X))
model = SVC(gamma=0.001)
cv = ShuffleSplit(n_splits=10,test_size=0.2)
c_s = np.logspace(-6,0,6)
print(c_s)
result = []
for c in c_s:model.c = ct = cross_val_score(model,X,y,cv=cv,n_jobs=4)print(np.mean(t))result.append(np.mean(t))
# plt.plot(c_s,result,'o')
plt.plot(c_s,result)
plt.xscale('log')# 对数坐标
plt.xlabel('c')
plt.ylabel('accuracy')
plt.rcParams['font.sans-serif']=['SimHei'] #显示中文
plt.title(r'参数c对SVM的影响')
plt.show()

3.2 对每个输入数据点产生交叉验证估计

model_selection .cross_val_predict(estimator,X,y=None,cv=None,n_jobs=1,method='predict')
参数

  • method:string,optional,default:predict. Invokes the passed method of the passed estimator.
    默认使用传入模型的预测方法。

3.3 计算并绘制模型的学习率曲线

learning_curve(estimator, X, y, groups=None, train_sizes=np.linspace(0.1, 1.0, 5), cv='warn', scoring=None, exploit_incremental_learning=False, n_jobs=None, pre_dispatch="all", verbose=0, shuffle=False, random_state=None, error_score='raise-deprecating')
计算指定学习器在不同大小的训练集上经过交叉验证的训练得分和测试得分。
算法过程
首先用一个交叉验证生成器将整体数据集划分成K折,每一折划分成训练集和测试集。从每一折的训练集中取出一定比例(比如0.1)作为训练集,然后不断增加子集的比例,在这些自己上训练模型。然后计算在对应自己下的模型在整体训练集和测试集上的得分。

参数

  • train_sizes :array_like,shape(n_tricks,),dtype:float or int.
    用于指定训练样本子集的相对数量或者绝对数量。
    如果是浮点数,则是训练集中样本数量的百分比,(0,1]之间。
    如果是整型数,则指的是训练子集的样本数量,这个数量不能超过训练样本总体数量。默认值np.linspace(0.1,1.0,5)

返回值

  • train_sizes_abs:array,shape=(n_unique_tricks,),dtype:int。返回train_sizes去掉重复值后的结果。
  • train_scores:array,shape=(n_unique_tricks,n_cv_folds),scores on training sets.
  • test_scores:array,shape=(n_unique_tricks,n_cv_folds),scores on testsets.
from matplotlib import pyplot as plt
import sklearn
from sklearn.datasets import load_digits
from sklearn.model_selection import learning_curve
from sklearn.model_selection import train_test_split,ShuffleSplit,RandomizedSearchCV
from sklearn.ensemble import forestimport numpy as np
data = load_digits()
print(data.keys())
X,y = data['data'],data['target']# data['data'] 一维数组, data['images'] 二维数组(8x8)
print(len(X))
# model = SVC(gamma=0.001)
model = forest.RandomForestClassifier(n_estimators=10)cv = ShuffleSplit(n_splits=10,test_size=0.2)
clf = model
t,train_scores,test_scores = learning_curve(clf,X,y,cv=cv,n_jobs=4)
# print(t)
print('*'*20)
print('train_scores:\n',train_scores)
print('*'*20)
print('test_scores:\n',test_scores)
test_score = np.mean(test_scores,axis = 1)
print(test_score)
plt.plot(test_score)
plt.show()

3.4 计算并绘制模型的验证曲线

model_selection.validation_curve(estimator, X, y, param_name, param_range, groups=None, cv='warn', scoring=None, n_jobs=None, pre_dispatch="all", verbose=0, error_score='raise-deprecating')
当某个参数变化时,在该参数每一个取值下计算出模型在训练集和测试集上的得分。(与GridSearchCV类似,但是只可以计算在测试集上的得分,且只能有一个参数)
参数

  • param_name:string,参数名
  • param_range:array_like,shape(n_values,),参数的取值范围
    返回值
  • train_scoresarray_like,shape(n_trick,n_cv_folds),在训练集上的得分。
  • test_scoresarray_like,shape(n_trick,n_cv_folds),在测试集上的得分。

sklearn模型评选择与评估相关推荐

  1. python实现sklearn的基本操作流程,sklearn预处理方法,sklearn基础算法的使用,以及sklearn模型的选择方法。

    python实现sklearn的基本操作流程,sklearn预处理方法,sklearn基础算法的使用,以及sklearn模型的选择方法. 一.数据的获取与分析 1.读取数据 2.分析数据 二.数据的预 ...

  2. R语言glmnet交叉验证选择(alpha、lambda)拟合最优elastic回归模型:弹性网络(elasticNet)模型选择最优的alpha值、模型最优的lambda值,最终模型的拟合与评估

    R语言glmnet交叉验证选择(alpha参数和lambda参数)拟合最优elastic回归模型:弹性网络(elasticNet)模型选择最优的alpha值.弹性网络(elasticNet)模型最优的 ...

  3. SKLEARN模型选择

    数据集划分方法 K折交叉验证法 将全部训练集S分成k个不相交的子集,假设S中的训练样例子数为m,那么每一个子集有m/k个训练样例,相应子集称作{s1,s2--sk} 每次从分好的子集里面,拿一个作为测 ...

  4. 西瓜书机器学习笔记(第二课):模型选择与评估

    模型选择与评估 经验误差与过拟合 经验误差vs泛化误差 本质上就是训练集上的误差vs"未来"样本上的误差: 经验误差并非越小越好,因为会出现过拟合 过拟合与欠拟合 通俗理解,欠拟合 ...

  5. 【深度学习模型的训练与评估】一个实例:Iris多分类

    文章目录: 1 评估深度学习模型1.1 自动评估1.2 手动评估1.3 k折交叉验证 2 在Keras中使用Sklearn 3 深度学习模型调参数 4 Iris多分类4.1 数据集分析4.2 代码 1 ...

  6. python打包exe 之打包sklearn模型中的各种坑及其解决方法。

    之前学习了如何打包,如何建立虚拟环境打包,以及如何带资源打包exe. python打包成exe 可执行文件 .教程 使用pipenv建立虚拟环境解决python打包exe文件过大的问题(附打包带图标, ...

  7. 十、模型自变量选择方法

    在本系列的最后一篇文章中,我们讨论了多元线性回归模型.费尔南多创建了一个模型,根据五个输入参数估算汽车价格. 费尔南多的确获得了一个比较好的模型,然而,费尔南多想要获得最好的输入变量集 本文将详细介绍 ...

  8. 多项式函数的拟合问题,说明过拟合与模型的选择问题

    先看效果图,如果不是你想找的资料,请直接移步. 问题描述:假定一个训练数据集:T = {(x1,y1),(x2,y2),...,(xn,yn)},其中n=10.多项式拟合的任务是假设给定数据由M次多项 ...

  9. 如何使用transformers的trainer.train()函数如何训练自定义Bert的下游模型,并进行评估

    要使用 Transformers 中的 Trainer 训练自定义的 BERT 下游模型,并进行评估,需要进行以下步骤: 准备数据集:将原始数据集转换为适合 BERT 模型训练的格式,例如使用 tok ...

最新文章

  1. 高斯拟合原理_看得见的高斯过程:这是一份直观的入门解读
  2. mac系统下安装、启动、停止mongodb
  3. gdi 格式转换 vb_VB 程序设计举例
  4. Scala编译器安装,开发工具安装,通过IDEA创建scala的工程代码,Scala SDK的设置
  5. 软件工厂是否真的可能存在?
  6. Js组件layer的使用
  7. Hadoop CDH4.5 MapReduce MRv1 HA方案实战
  8. 简单的Swagger生产环境中屏蔽
  9. 关于iptables封禁国外ip的方法
  10. quarkus-contexts和DI介绍(原理)
  11. python小玩意——敏感词汇检测
  12. 对拳击“海盗式”打法特点的剖析
  13. 鲸探发布点评:8月22日发售《孔子圣迹图》系列数字藏品
  14. 愤怒的小鸟是如何长大的
  15. 无线路由器和计算机怎么连接网络连接,猫连接无线路由器
  16. 干货!手把手教你搭建高可用架构
  17. 2019携程校招笔试题选讲
  18. 勾股定理,西方称为毕达哥拉斯定理
  19. php jwt token刷新方案,laravel JWT自动刷新 自定义验证器
  20. react笔记_07组件实例化对象的三大属性

热门文章

  1. oracle中国授权机构查询,oracle授权查询
  2. c# mysql timeout expired_C#百万数据查询出现超时问题的解决方法
  3. Debug Tensorflow: tensorflow.python.framework.errors_impl.InvalidArgumentError: OpKernel ‘ConcatV2‘
  4. luogu p4767 邮局
  5. 【学术相关】是什么让女性在计算机史上“隐身”了?
  6. Python 3.9,来了!
  7. 使用Scikit-Learn轻松实现数据缩放
  8. pytorch基础知识整理(二)数据加载
  9. 推荐算法炼丹笔记:CTR点击率预估系列入门手册
  10. 0322互联网新闻 | 搜狐视频重拾喜剧路线;抖音及海外版TikTok应用内购收入达7500万美元...