机器学习十模型评估与优化远征i

以前的内容,经常涉及使用sklear中的train_test_split将数据集拆分成训练集和测试集,然后用训练集训练模型,再用模型去拟合测试集并对模型进行评分,来评估模型的准确度

1.sklearn中的交叉验证法

统计学中,交叉验证是一种常用于对于模型泛化性能进行评估的方法

和train_test_split方法不同的是,交叉验证会反复地拆分数据集,并用来训练多个模型

sklearn中默认使用的是K折叠交叉验证法:

还有“随机拆分交叉验证法”,“挨个儿试法”

交叉验证的使用方法:

#导入红酒数据集fromsklearn.datasetsimportload_wine#导入交叉验证工具fromsklearn.model_selectionimportcross_val_score#导入用于分类的支持向量机模型fromsklearn.svmimportSVC#载入红酒数据集wine=load_wine()#设置SVC的核函数为linearsvc=SVC(kernel='linear')#使用交叉验证法对SVC进行评分scores=cross_val_score(svc,wine.data,wine.target)#得分print(scores)[0.833333330.951.]【结果分析】

先导入了scikit_learn的交叉验证评分类,然后使用SVC对酒的数据集进行分类,默认情况下,cross_val_score会使用3个折叠,因此,会得到3个分数

模型的得分:

#使用.mean()获得分数的平均值print(scores.mean())0.9277777777777777【结果分析】

交叉验证法平均分为0.928分

将数据集拆成6个部分来评分——cross_val_score:

#设置cv参数为6scores=cross_val_score(svc,wine.data,wine.target,cv=6)print(scores)[0.866666670.90.933333330.966666671.1.]

print(scores.mean())0.9444444444444445【结果分析】

在sklearn中,cross_val_score对于分类模型默认使用的是K折叠交叉验证,而对于分类模型则默认使用分层K交叉验证法

要解释啥是分层K交叉验证法,先分析下酒的数据集:

2.随机拆分和“挨个儿试”

随机拆分原理——先从数据集中随机抽一部分数据作为训练集,再从其余的部分随机抽一部分作为测试集,进行评分后再迭代,重复上一步操作,直到把我们希望的迭代次数全跑完

#导入随机拆分工具fromsklearn.model_selectionimportShuffleSplit#设置拆分的数为10个shuffle_split=ShuffleSplit(test_size=.2,train_size=.7,n_splits=10)#对拆分好的数据进行交叉验证scores=cross_val_score(svc,wine.data,wine.target,cv=shuffle_split)print(scores)把每次迭代的测试集设为数据集的20%,而训练集为70%,并且把整个数据集拆分成10个子集

【结果分析】

ShuffleSplit一共为SVC模型进行了10次评分,最终得分即10个评分的平均值

挨个儿试试:

把每个数据点都当成一个数据集,所以数据集里有多少样本,它就迭代多少次

数据集较大——很耗时

数据集较小——评分准确度最高

#导入LeaveOneOutfromsklearn.model_selectionimportLeaveOneOut#设置cv参数为leaveoneoutcv=LeaveOneOut()#重新进行交叉验证scores=cross_val_score(svc,wine.data,wine.target,cv=cv)print('迭代次数:',len(scores))print('平均分:',scores.mean())迭代次数:178平均分:0.9550561797752809【结果分析】

由于酒的数据集中有178个样本,所以迭代了178次

为啥要用交叉验证法?

使用网格搜索优化模型参数

1.简单网格搜索

用lasso算法为例:

在Lasso算法中,有两个参数比较重要——正则化参数alpha,最大迭代次数max_iter

默认情况下alpha=1.0,max_iter=1000

假设,想试试当alpha分别取10.01.00.10.01这4个数值,而max_iter分别取1001000500010000时,模型表现有什么差别

如果按照手动调整的话,试16次。。。

#导入套索回归模型fromsklearn.linear_modelimportLasso#导入数据集拆分工具fromsklearn.model_selectionimporttrain_test_splitX_train,X_test,y_train,y_test=train_test_split(wine.data,wine.target,random_state=38)#设置初始分数为0best_score=0#设置alpha的参数遍历0.01,0.1,1,10foralphain[0.01,0.1,1,10]:#最大迭代数遍历100,1000,5000,10000formax_iterin[100,1000,5000,10000]:lasso=Lasso(alpha=alpha,max_iter=max_iter)#训练套索回归模型lasso.fit(X_train,y_train)score=lasso.score(X_test,y_test)#令最佳分数为所有分数中的最高值ifscore>best_score:best_score=score#定义字典,返回最佳参数和最佳迭代数best_parameters={'alpha':alpha,'最大迭代数':max_iter}print('最高分:',best_score)print('最佳参数设置',best_parameters)最高分:0.8885499702025688最佳参数设置{'alpha':0.01,'最大迭代数':100}【结果分析】

快速找到了~~

局限性:

所进行的16次评分都是基于同一个训练集和测试集,这只能代表模型在该训练集和测试集的得分情况,不能反映出新的数据集的情况

举例:

修改train_test_split的random_state参数:【38-->0】

#导入套索回归模型fromsklearn.linear_modelimportLasso#导入数据集拆分工具fromsklearn.model_selectionimporttrain_test_splitX_train,X_test,y_train,y_test=train_test_split(wine.data,wine.target,random_state=0)#设置初始分数为0best_score=0#设置alpha的参数遍历0.01,0.1,1,10foralphain[0.01,0.1,1,10]:#最大迭代数遍历100,1000,5000,10000formax_iterin[100,1000,5000,10000]:lasso=Lasso(alpha=alpha,max_iter=max_iter)#训练套索回归模型lasso.fit(X_train,y_train)score=lasso.score(X_test,y_test)#令最佳分数为所有分数中的最高值ifscore>best_score:best_score=score#定义字典,返回最佳参数和最佳迭代数best_parameters={'alpha':alpha,'最大迭代数':max_iter}print('最高分:',best_score)print('最佳参数设置',best_parameters)最高分:0.8298747376836272最佳参数设置{'alpha':0.1,'最大迭代数':100}【结果分析】

稍微对train_test_split拆分数据集的方式做一点变更,最高分酒降到了0.83

最佳alpha参数为0.1

为了解决这个问题——与交叉验证结合的网格搜索

2.与交叉验证结合的网格搜索

#导入numpyimportnumpyasnp#设置alpha的参数遍历0.01,0.1,1,10foralphain[0.01,0.1,1.0,10.0]:#最大迭代数遍历100,1000,5000,10000formax_iterin[100,1000,5000,10000]:lasso=Lasso(alpha=alpha,max_iter=max_iter)scores=cross_val_score(lasso,X_train,y_train,cv=6)score=np.mean(scores)#令最佳分数为所有分数中的最高值ifscore>best_score:best_score=score#定义字典,返回最佳参数和最佳迭代数best_parameters={'alpha':alpha,'最大迭代数':max_iter}print('最高分:',best_score)print('最佳参数设置',best_parameters)最高分:0.8652073211223437最佳参数设置{'alpha':0.01,'最大迭代数':100}【结果分析】

这里我们做了一点手脚,就是只用先前拆分好的X_train来进行交叉验证,以便于我们找到最佳参数后,再用来拟合X_test来看一下模型的得分

#用最佳参数模型拟合数据lasso=Lasso(alpha=0.01,max_iter=100).fit(X_train,y_train)print('数据集得分:',lasso.score(X_test,y_test))数据集得分:0.819334891919453【结果分析】

此处,并不是参数的问题,而是lasso算法会对样本的特征进行正则化,导致一些特征的系数变为0,也就是说会抛弃一些特征值

对于酒集来说,本身特征就不多,因此使用lasso进行分类,得分会相对低些

在sklearn中,内置了一个类,GridSearchCV,进行参数调优的过程简单:

#导入网格搜索工具fromsklearn.model_selectionimportGridSearchCV#将需要遍历的参数定义为字典params={'alpha':[0.01,0.1,1.0,10.0],'max_iter':[100,1000,5000,10000]}#定义网格搜索中使用的模型和参数grid_search=GridSearchCV(lasso,params,cv=6)#使用网格搜索模型拟合数据grid_search.fit(X_train,y_train)print('模型最高分:',grid_search.score(X_test,y_test))print('最优参数:',grid_search.best_params_)模型最高分:0.819334891919453最优参数:{'alpha':0.01,'max_iter':100}【结果分析】

GridSearchCV中的best_scores_属性,会存储模型在交叉验证中所得的最高分,而不是测试集上的得分

#打印网格搜索中的best_score_属性print('交叉验证最高分:',grid_search.best_score_)交叉验证最高分:0.8653192931146032【结果分析】

这里的得分和cross_val_score得分是完全一致的,说明GridSearchCV本身就是将交叉验证和网格搜索封装一起的方法

分类模型的可信度评估

实际上算法在分类过程中,会认为某个数据点80%可能性属于分类1,20%可能性属于分类0,模型会依据“可能性较大”的方式分配分类标签

算法是如何对这种分类的可能性进行计算的?

1.分类模型中的预测准确率

在sklearn中,很多用于分类的模型都有一个predict_proba功能——用于计算模型在对数据集进行分类时,每个样本属于不同分类的可能性是多少

#导入数据集生成工具fromsklearn.datasetsimportmake_blobs#导入画图工具importmatplotlib.pyplotasplt#生成样本数为200,分类为2,标准差为5的数据集X,y=make_blobs(n_samples=200,random_state=1,centers=2,cluster_std=5)#绘制散点图plt.scatter(X[:,0],X[:,1],c=y,cmap=plt.cm.cool,edgecolor='k')plt.show()使用make_blobs制作数据集,为了给算法点难度,故意把数据集的方差设高点cluster_std=5

像评价女朋友衣服——红色--好看,青蓝色—不好看,中间的点—还可以

使用高斯朴素贝叶斯分类:

#导入高斯贝叶斯模型fromsklearn.naive_bayesimportGaussianNBX_train,X_test,y_train,y_test=train_test_split(X,y,random_state=68)#训练高斯贝叶斯模型gnb=GaussianNB()gnb.fit(X_train,y_train)#获得高斯贝叶斯的分类准确概率predict_proba=gnb.predict_proba(X_test)print('预测准确率形态:',predict_proba.shape)预测准确率形态:(50,2)【结果分析】

在predict_proba属性中存储了50个数组【即测试集大小】,每个数组有2个元素

打印一下前5个:

#打印准确概率的前5个print(predict_proba[:5])[[0.988499960.01150004][0.04959850.9504015][0.016480340.98351966][0.81682740.1831726][0.002824710.99717529]]【结果分析】

反应的是测试集前5个样本的分类准确率

用图像直观看下predict_proba在分类过程中的表现:

圆点代表样本数据

棕色为第一个分类,蓝色为第二个分类,渐变色区域,就是模型觉得“还可以”的部分

2.分类模型中的决定系数

同预测准确率类似,决定系数decision_function也会给我们返回一些数值——告诉我们模型认为某个数据点处于某个分类的“把握”有多大

不同的是,在二元分类任务中,只返回一个值——正数,属于分类1;负数,属于分类2

高斯朴素贝叶斯没有decision_function属性——>使用支持向量机SVM算法建模:

#导入SVC模型fromsklearn.svmimportSVC#使用训练集训练模型svc=SVC().fit(X_train,y_train)#获得SVC的决定系数dec_func=svc.decision_function(X_test)#打印决定系数中的前5个print(dec_func[:5])[0.020824320.878522421.01696254-0.303565580.95924836]

图形化展示desicion_function原理:

.score给模型评分的方法

其他评分的方法:

GridSearchCV改变评分的方式:

#修改scoring参数为roc_aucgrid=GridSearchCV(RandomForestClassifier*(,param_grid=param_grid,scoring='roc_auc')

THE END
1.百条法则之谜揭秘那些隐藏在法律深处的未解之谜10 国际判例效力探讨 在全球化时代下,不同国家之间存在很多相似性,有时候甚至可以从别人的经验中学习借鉴。这就引发了一系列关于其他国家法院判决是否具有效力的疑问,以及如果要引用该判决应该怎么处理证据的问题。 11 治安维稳措施讨论 面对犯罪率上升以及恐怖主义威胁,治安维稳工作变得异常重要。在采取强硬手段的时候,还https://www.382hl43py.cn/news/439692.html
2.法则纷呈百条规矩的编织这就要求我们加大对公众教育投入,为构建良好的司 法环境打下坚实基础。 六、技术支持:利用信息技术促进百条法律规范化管理与服务创新 随着科技发展,我们有理由相信,在未来,更多高效便捷的人工智能工具将被引入帮助处理日常事务,使得行政效率提高,同时减少冗余操作,从而为百 条 法律提供更加优质、高效 的服务平台。https://www.msv8oom8y.cn/tu-pian-zi-xun/323986.html
3.法律法规的迷雾哪些隐秘面纱尚待揭开接下来,让我们谈谈这些成文物质的一般性作用。首先,它们提供了一个框架,使得人们能够预测未来行为可能带来的后果。这就好比是一个巨大的保险网,无论是在经济活动还是在个人的行为选择上,都能起到一定程度的约束作用。当一个人想要做出某个决定时,他会考虑这一决定是否违反了现有的法律条款,从而避免不必要的风险。而https://www.erdqcvtxm.cn/jun-lei-wen-hua/410302.html
4.汉盛法评丨专利侵权诉讼中方法发明专利的保护范围虽然《专利法》第十一条明确了方法专利的保护范围,但并未赋予非制造方法专利以产品保护延伸的权利。对于非制造方法专利,我国《专利法》及其相关司法解释均未明确规定其对产品的保护延展性,仅明确方法本身的使用行为。因此,非制造方法专利的保护范围通常限定于方法本身的使用行为,难以主张对产品的延伸保护。 http://hanshenglaw.cn/CN/08/a71def40974e55aa.aspx
5.探索正义的边界法律学术之旅随着技术不断发展,大数据已经成为推动司法改革的一个重要工具。大数据可以帮助法院更精准地识别重复犯错的人群,从而提高效率;同时,也能辅助判断证据质量,使得司法人员认定更加科学合理。我期待能够参与到这样的创新项目中来,利用科技改变我们的司 法体系。 六、国际化视野下的跨境执业 https://www.cjan6a6c.cn/ke-yan-cheng-guo/455247.html
6.太原学院数学系的一个原函数. 原函数问题的基本内容:存在性,个数,求法. 原函数的个数: Th若 是 在区间 上的一个原函数, 则对 , 都是 在区间 上的原函数;若 也是 在区间 上的原函数,则必有 . ( 证 ) 可见,若 有原函数 ,则 的全体原函数所成集合为 https://sxx.tyu.edu.cn/contents/2459/39446.html
7.软件测试:考点总结(精简版)复合谓词覆盖准则对于一个n变量的程序,健壮性边界值测试会产生6n+1个测试用例。 健壮性测试最有意义的部分不是输入,而是预期的输出,观察例外情况如何处理。(是否会失控或出现可怕的情形) 对于强类型语言,健壮性测试可能比较困难。 边界值分析法的局限性 基于函数输入定义域的测试方法,是所有测试方法中最基本的。 https://blog.csdn.net/qq_39384184/article/details/86479602
8.法理学分析思考题6篇(全文)条例只规定了“在……附近”,没有规定“在……里”,所以依据这条规定是不能处罚乔治的。律师还提醒法官注意,英国是个法治国家,法无明文规定不为罪。法官在对此案进行裁决时甚感为难。根据上述案情,分析以下问题:(1)认为法的作用有局限性吗? (2)如果法有局限性,那么结合本案,请分别列出哪些情节能够说明这一点https://www.99xueshu.com/w/fileqy0r3wij.html
9.免疫层析法检测试剂(盒)产品技术审评规范(2017版)10.【检验方法局限性】 综合产品的预期用途、临床背景、检测方法及适用范围等信息,对可能出现的局限性进行相关说明,举例如下。 (1)可能会受到一些特殊样本(如含有高浓度嗜异性抗体或类风湿性因子)的影响而导致假阳性结果。 (2)高浓度样本可能会出现HOOK效应而导致假阴性,应将其稀释后再检测。应注明对稀释液的要求https://yjj.beijing.gov.cn/yjj/ztzl48/ylqxjgfwzn/jsscgfzl64/lcjycp84/11002268/
10.考生关注丨高考九科考点知识点汇总整理!(四)、考题问法: “文章(传记、小说均可)以………(周汝昌“安安静静的离开”)开头(结尾),”有什么作用,请结合全文进行分析。 对待“作用”题型,可以从“结构”和“内容”两个角度进行分析,具体如下: 1.考虑情节与其他情节的关系。 2. 考虑情节与读者感受的关系。 3. 考虑情节https://www.lndwgz.cn/news/dawa/1552.html
11.长海教育网十六、根据短文提出的观点补充举例: 1、可举名人事例,有更大的说服力,并能展示出自己的知识面,但一定要写准确人物、事件,切忌张冠李戴。 2、也可举凡人事例,可以编造,但要注意具有真实感,切忌过于夸大,让人一看就知道是胡编乱造的。 3、格式:人物+事例+简短评价 十七、文段中事例的概括: 1、必须包含两个要http://www.chedu.net/2020/0619/33191.html
12.《运用现代教育技术设计有效课堂活动的实践研究》课题结题报告到1958年,有美国IBM公司设计出第一个计算机教学系统(二进制的CAI系统),这才标志着计算机辅助教育的开端,但是由于当时计算机的体积大、成本高等的一系列原因,使得计算机辅助教学方面没有得到实质性的发展。直到1971年,世界第一台微型计算机问世,这才真正为计算机辅助教学提供了方便的条件。20世纪90年代中期,伴随着计算机https://wjez.wjjy.cn/newsInfo.aspx?pkId=494
13.考研倒计时3个月,论述题答题套路学起来!提炼本质法:提炼二者共有的【特征】作为分论点,再在这个特征内部比较异同。 举个例子,当我们遇到两个导演的比较分析题目,往往会先从每位导演的主题、人物、叙事、视听等几个维度拆解;进而,我们可以思考这两个导演各个维度上是不是有表现出相似性?比如都力求塑造具体可感、具有民族特色的人物; 再进一步,我们可以思考https://www.douban.com/note/866572887/
14.九年级历史复习1★4、公元前18世纪,古巴比伦国王汉谟拉比统一了两河流域(幼发拉底河和底格里斯河),建立起中央集权的奴隶制国家,制定了一部维护奴隶主阶级利益的法典,汉谟拉比法典是世界现存古代第一部比较完备的成文法典。 (见p9-10) 5、约公元前2500年,印度河流域开始出现奴隶制小国。古印度有着严格的等级制度,历史上称?种姓https://www.360doc.cn/article/4820833_84990296.html