机器学习:模型选择和模型优化

进行数据处理之后,我们得到了x_train和y_train,我们就可以用来进行回归或分类模型训练啦~

一、模型选择

我们这里可能使用的是回归模型(Regression),值得注意的是,回归和分类不分家。分类是预测离散值,回归是预测连续值,差不多。

展示这些是为了看到,不同的任务,可能需要不用的评分标准,评分时别乱套用。

评估度量

一、默认参数模型对比

一、无标准化

①K折交叉验证  模型评估

K折交叉验证 模型评估,不重复抽样将原始数据随机分为 k 份。每一次挑选其中 1 份作为训练集,剩余 k-1 份作为训练集用于模型训练。计算测试集上的得分。在这种情况下它只是用来计算模型得分的。

(这里说的测试集,严格上来讲属于整个机器学习过程中的验证集)

回归任务:

from sklearn.linear_model import LinearRegression
from sklearn.linear_model import Lasso  
from sklearn.linear_model import ElasticNet
from sklearn.tree import DecisionTreeRegressor
from sklearn.neighbors  import  KNeighborsRegressor
from sklearn.svm import SVR 
from sklearn.metrics import mean_squared_error #MSE 
from sklearn.model_selection import cross_val_scoremodels = {}   #dict={k:v,k1:v1}  list=[1,2,3,4]  set=(1,2,3,4)
models['LR'] = LinearRegression()
models['LASSO'] = Lasso()
models['EN'] = ElasticNet()
models['KNN'] = KNeighborsRegressor()
models['CART'] = DecisionTreeRegressor()
models['SVM'] = SVR()scoring='neg_mean_squared_error'
#回归模型,这里用均方误差得分作为模型的优化标准,模型会尽量使得该指标最好#比较均方差
results=[]
for key in models:cv_result=cross_val_score(models[key],x_train,y_train,cv=10,scoring=scoring)
#cv指定的是交叉验证的折数,k折交叉验证会将训练集分成k部分,然后每个部分计算一个分数。results.append(cv_result)    #list.append(t),这行语句的目的是为了以后画图用,但实际上print就能看到分数啦print('%s: %f (%f)'%(key,cv_result.mean(),cv_result.std()))#model = RandomForestClassifier(n_estimators= n_estimators)
#model.fit(X_train,y_train)
#mse = mean_squared_error(y_test,model.predict(X_test))
分类任务:(XGB和LGB是集成模型)
from lightgbm import LGBMClassifier
from xgboost import XGBClassifier
from sklearn.ensemble import RandomForestClassifier
from sklearn.model_selection import cross_val_scoremodels = {}   #dict={k:v,k1:v1}  list=[1,2,3,4]  set=(1,2,3,4)
models['RFC'] = RandomForestClassifier()
models['XGB'] = XGBClassifier()
models['LGB'] = LGBMClassifier(verbose= -1)scoring='roc_auc'
#使用AUC评估#比较均方差
results=[]
for key in models:cv_result=cross_val_score(models[key],x_train,y_train,cv=10,scoring=scoring)
#cv指定的是交叉验证的折数,k折交叉验证会将训练集分成k部分,然后每个部分计算一个分数。print('%s: %f (%f)'%(key,cv_result.mean(),cv_result.std()))
②先对模型进行训练,然后计算得分

分类问题:

from lightgbm import LGBMClassifier
model = LGBMClassifier(verbose= -1)
model.fit(X_train,y_train)
#具体算什么得分,就靠你自己选了
#model.score() 函数通常计算的是模型的准确度(accuracy)
print('LGBM的训练集得分:{}'.format(model.score(X_train,y_train)))
print('LGBM的测试集得分:{}'.format(model.score(X_test,y_test)))
from sklearn.metrics import roc_auc_score# 预测概率
y_train_proba = model.predict_proba(X_train)[:, 1]
y_test_proba = model.predict_proba(X_test)[:, 1]# 计算训练集和测试集的AUC
train_auc = roc_auc_score(y_train, y_train_proba)
test_auc = roc_auc_score(y_test, y_test_proba)print('LGBM的训练集AUC:{:.4f}'.format(train_auc))
print('LGBM的测试集AUC:{:.4f}'.format(test_auc))
回归问题:
model = RandomForestRegressor(n_estimators= n_estimators)
model.fit(X_train,y_train)
mse = mean_squared_error(y_test,model.predict(X_test))
print('RandomForest_Regressor的训练集得分:{}'.format(model.score(X_train,y_train)))
print('RandomForest_Regressor的测试集得分:{}'.format(model.score(X_test,y_test)))
print('RandomForest_Regressor的mse得分:{}'.format(model.score(X_test,y_test)))
二、pipeline正态化再训练

Pipeline类似于一个管道,输入的数据会从管道起始位置输入,然后依次经过管道中的每一个部分最后输出。没啥区别其实()

from sklearn.pipeline import Pipeline
pipelines={}
pipelines['ScalerLR']=Pipeline([('Scaler',StandardScaler()),('LR',LinearRegression())])
pipelines['ScalerLASSO']=Pipeline([('Scaler',StandardScaler()),('LASSO',Lasso())])
pipelines['ScalerEN'] = Pipeline([('Scaler', StandardScaler()), ('EN', ElasticNet())])
pipelines['ScalerKNN'] = Pipeline([('Scaler', StandardScaler()), ('KNN', KNeighborsRegressor())])
pipelines['ScalerCART'] = Pipeline([('Scaler', StandardScaler()), ('CART', DecisionTreeRegressor())])
pipelines['ScalerSVM'] = Pipeline([('Scaler', StandardScaler()), ('SVM', SVR())])
#这个pipeline包含一个正态化~scoring='neg_mean_squared_error'results=[]
for key in pipelines:kfold=KFold(n_splits=num_flods,random_state=feed)cv_result=cross_val_score(pipelines[key],x_train,y_train,cv=kfold,scoring=scoring)results.append(cv_result)print('pipeline %s: %f (%f)'%(key,cv_result.mean(),cv_result.std()))

二、集成模型

#调参外,提高模型准确度是使用集成算法。

import numpy as np
from sklearn.model_selection import KFold, cross_val_score
from sklearn.pipeline import Pipeline
from sklearn.preprocessing import StandardScaler
from sklearn.ensemble import AdaBoostRegressor, RandomForestRegressor, GradientBoostingRegressor, ExtraTreesRegressor
from sklearn.neighbors import KNeighborsRegressor
from sklearn.linear_model import LinearRegressionnum_folds = 10
seed = 7
scoring = 'neg_mean_squared_error'ensembles = {}
ensembles['ScaledAB'] = Pipeline([('Scaler', StandardScaler()), ('AB', AdaBoostRegressor())])
ensembles['ScaledAB-KNN'] = Pipeline([('Scaler', StandardScaler()),('ABKNN', AdaBoostRegressor(base_estimator=KNeighborsRegressor(n_neighbors=3)))])
ensembles['ScaledAB-LR'] = Pipeline([('Scaler', StandardScaler()), ('ABLR', AdaBoostRegressor(LinearRegression()))])
ensembles['ScaledRFR'] = Pipeline([('Scaler', StandardScaler()), ('RFR', RandomForestRegressor())])
ensembles['ScaledETR'] = Pipeline([('Scaler', StandardScaler()), ('ETR', ExtraTreesRegressor())])
ensembles['ScaledGBR'] = Pipeline([('Scaler', StandardScaler()), ('RBR', GradientBoostingRegressor())])results = []
for key in ensembles:kfold = KFold(n_splits=num_flods, random_state=feed)cv_result = cross_val_score(ensembles[key], x_train, y_train, cv=kfold, scoring=scoring)results.append(cv_result)print('%s: %f (%f)' % (key, cv_result.mean(), cv_result.std()))

二、模型优化(网格搜索,随便写写)

使用GridSearchCV进行网格搜索

一、普通模型网格搜索——随机森林

from sklearn.model_selection import GridSearchCV
from sklearn.ensemble import RandomForestRegressorparam_grid= {'n_estimators':[1,5,10,15,20,25,30,35,40,45,50,55,60,65,70,75,80,85,90,95,100,125,150,200],'max_features':('auto','sqrt','log2')}
#最佳迭代次数
#最大特征数
m = GridSearchCV(RandomForestRegressor(random_state=827),param_grid)
m = m.fit(X_train,y_train)
mse = mean_squared_error(y_test,m.predict(X_test))
print("该参数下得到的MSE值为:{}".format(mse))
print("该参数下得到的最佳得分为:{}".format(m.best_score_))
print("最佳参数为:{}".format(m.best_params_))

二、集成模型网格搜索——XGB

%%time
from xgboost import XGBClassifier
from sklearn.model_selection import GridSearchCV
# xgb  网格搜索,参数调优
# c初始参数
params = {'learning_rate': 0.1, 'n_estimators': 500, 'max_depth': 5, 'min_child_weight': 1, 'seed': 0,'subsample': 0.8, 'colsample_bytree': 0.8, 'gamma': 0, 'reg_alpha': 0, 'reg_lambda': 1}
XGB_Regressor_Then_params = {'learning_rate': 0.1, 'n_estimators': 200, 'max_depth': 6, 'min_child_weight': 9, 'seed': 0,'subsample': 0.8, 'colsample_bytree': 0.8, 'gamma': 0.3, 'reg_alpha': 0, 'reg_lambda': 1}
# 最佳迭代次数:n_estimators、min_child_weight 、最大深度 max_depth、后剪枝参数 gamma、样本采样subsample 、 列采样colsample_bytree
# L1正则项参数reg_alpha 、 L2正则项参数reg_lambda、学习率learning_rate
param_grid= {'n_estimators':[50,100,150,200,250,300,350,400,450,500,550,600,650,700,750,800,850,900,950,1000,1250,1500,1750,2000],}
m = GridSearchCV(XGBClassifier(objective ='reg:squarederror',**params),param_grid,scoring='roc_auc')
m = m.fit(X_train,y_train)
mse = mean_squared_error(y_test, m.predict(X_test))
print('该参数下得到的最佳AUC为:{}'.format(m.best_score_))
print('最佳参数为:{}'.format(m.best_params_))print('XGB的AUC图:')
lr_fpr, lr_tpr, lr_thresholds = roc_curve(y_test,m.predict_proba(X_test)[:,1])
lr_roc_auc = metrics.auc(lr_fpr, lr_tpr)
plt.figure(figsize=(8, 5))
plt.plot([0, 1], [0, 1],'--', color='r')
plt.plot(lr_fpr, lr_tpr, label='XGB(area = %0.2f)' % lr_roc_auc)
plt.xlim([0.0, 1.0])
plt.ylim([0.0, 1.0])
plt.show()

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

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

相关文章

Mysql标量子查询

目录 子查询标量子查询数据准备 子查询 SQL语句中嵌套select语句,称为嵌套查询,又称子查询。 SELECT * FROM t1 WHERE column1 ( SELECT column1 FROM t2 ... );子查询外部的语句可以是insert / update / delete / select 的任何一个&…

git的安装、使用

文章目录 安装gitgit学习网站git初始配置具体配置信息 新建版本库(仓库)git的工作区域和文件状态工作区域文件状态git文件提交的基础指令 git基础指令1. 版本提交2. 分支创建3. 分支切换4. 分支合并(1) git merge(2) git rebase 5. 在git的提交树上移动(…

Ps:锐化工具

锐化工具 Sharpen Tool可用于增强图像局部区域的对比度,从而提高图像的清晰度和细节,特别适用于提升照片的边缘定义和纹理细节。 快捷键:无 ◆ ◆ ◆ 常用操作方法与技巧 1、如果直接在像素图像上使用锐化工具,可尝试使用“渐隐…

怎么优雅地访问ChatGPT

ChatGPT,这颗璀璨的智能结晶,在2022年岁末之际,由OpenAI实验室倾力铸就,犹如夜空中跃动的智慧星辰,点亮了人工智能领域的新纪元。犹如汪洋中的一座灯塔,ChatGPT以其独特的智慧光辉引人注目,然而…

Linux:kubernetes(k8s)node节点加入master主节点(3)

Linux:kubernetes(k8s)搭建mater节点(kubeadm,kubectl,kubelet)-CSDN博客https://blog.csdn.net/w14768855/article/details/136415575?spm1001.2014.3001.5502 我在上一章部署好了主节点&…

前端打包部署(黑马学习笔记)

我们的前端工程开发好了,但是我们需要发布,那么如何发布呢?主要分为2步: 1.前端工程打包 2.通过nginx服务器发布前端工程 前端工程打包 接下来我们先来对前端工程进行打包 我们直接通过VS Code的NPM脚本中提供的build按钮来完…

从下一代车规MCU厘清存储器的发展(2)

目录 1.概述 2.MCU大厂的选择 2.1 瑞萨自研STT-MRAM 2.2 ST专注PCM 2.3 英飞凌和台积电联手RRAM 2.4 NXP如何计划eNVM 3.小结 1.概述 上篇文章,我们简述了当前主流的存储器技术,现在我们来讲讲各大MCU大厂的技术选择 2.MCU大厂的选择 瑞萨日…

Tomcat布署及优化二-----Mysql和虚拟机

1.Mysql搭Blog 1.1下载安装包 看一下tomcat状态 1.2放到指定目录 cp jpress-v3.2.1.war /usr/local/tomcat/webapps/ cd /usr/local/tomcat/webapps/ 1.3路径优化 ln -s jpress-v3.2.1 jpress 看jpress权限 1.4生成配置文件 cat >/etc/yum.repos.d/mysql.repo <<E…

您的计算机已被pings勒索病毒感染?恢复您的数据的方法在这里!

导言&#xff1a; 在数字时代&#xff0c;数据是企业和个人生活中不可或缺的一部分。然而&#xff0c;随着勒索病毒的不断进化和传播&#xff0c;我们的数据面临着前所未有的威胁。其中&#xff0c;.pings 勒索病毒是最新一轮威胁之一&#xff0c;它以其独特的加密算法和无情的…

【Redis | 第一篇】快速了解Redis

文章目录 1.快速了解Redis1.1简介1.2与其他key-value存储的不同处1.3Redis安装——Windows环境1.3.1下载redis1.3.2启动redis1.3.3进入redis客户端1.3.4修改配置 1.4Redis安装——Linux环境1.4.1安装命令1.4.2启动redis1.4.3进入redis客户端 1.5配置修改1.6小结 1.快速了解Redi…

MyBatis 学习(七)之 缓存

目录 1 MyBatis 缓存介绍 2 一级缓存 3 二级缓存 3.1 二级缓存介绍 3.2 二级缓存配置 3.3 二级缓存测试 4 参考文档 1 MyBatis 缓存介绍 MyBatis 缓存是 MyBatis 中的一个重要特性&#xff0c;用于提高数据库查询的性能。MyBatis 提供了一级缓存和二级缓存两种类型的缓存…

Git与GitHub:解锁版本控制的魔法盒子

✨✨ 欢迎大家来访Srlua的博文&#xff08;づ&#xffe3;3&#xffe3;&#xff09;づ╭❤&#xff5e;✨✨ &#x1f31f;&#x1f31f; 欢迎各位亲爱的读者&#xff0c;感谢你们抽出宝贵的时间来阅读我的文章。 我是Srlua&#xff0c;在这里我会分享我的知识和经验。&#x…

cetos7 Docker 安装 gitlab

一、gitlab 简单介绍和安装要求 官方文档&#xff1a;https://docs.gitlab.cn/jh/install/docker.html 1.1、gitlab 介绍 gitLab 是一个用于代码仓库管理系统的开源项目&#xff0c;使用git作为代码管理工具&#xff0c;并在此基础上搭建起来的Web服务平台&#xff0c;通过该平…

(六)Dropout抑制过拟合与超参数的选择--九五小庞

过拟合 即模型在训练集上表现的很好&#xff0c;但是在测试集上效果却很差。也就是说&#xff0c;在已知的数据集合中非常好&#xff0c;再添加一些新数据进来效果就会差很多 欠拟合 即模型在训练集上表现的效果差&#xff0c;没有充分利用数据&#xff0c;预测准确率很低&a…

笨办法学 Python3 第五版(预览)(一)

原文&#xff1a;Learn Python the Hard Way, 5th Edition (Early Release) 译者&#xff1a;飞龙 协议&#xff1a;CC BY-NC-SA 4.0 模块 1&#xff1a;Python 入门 练习 0&#xff1a;准备工作 这个练习没有代码。这只是你完成的练习&#xff0c;让你的计算机运行 Python。…

Unity 游戏设计模式:单例模式

本文由 简悦 SimpRead 转码&#xff0c; 原文地址 mp.weixin.qq.com 单例模式 在 C# 游戏设计中&#xff0c;单例模式是一种常见的设计模式&#xff0c;它的主要目的是确保一个类只有一个实例&#xff0c;并提供一个全局访问点。单例模式在游戏开发中具有以下几个作用&#xf…

Matlab 机器人工具箱 Link类

文章目录 1 Link类1.1 机械臂Link类1.2 构造函数1.3 信息/显示方法1.4 转换方法1.5 操作方法1.6 测试方法1.7 重载操作1.8 属性(读/写)1.9 例子2 Link.Link2.1 创建机器人连杆对象2.2 OPTIONS2.3 注意2.4 旧语法2.5 例子3 Link的其他函数3.1 Link.A3.2 Link.char3.3 Link.displ…

unity学习(44)——选择角色菜单——顺利收到服务器的数据

本节的思路参考自&#xff0c;内容并不相同&#xff1a;13ARPG网络游戏编程实践&#xff08;十三&#xff09;&#xff1a;角色选择UI及创建面板制作&#xff08;四&#xff09;_哔哩哔哩_bilibili 现在的代码写在MessageManager.cs中&#xff0c;函数名UserHandler(是从OnMess…

Revit-二开之创建墙-(6)

Revit API窗间墙 protected override Result OnExecute(ExternalCommandData commandData, ref string message, ElementSet elements) {try{// 获取当前活动的文档

你是否知道Python的列表翻转、排序和多维列表

1.reverse() 表示翻转列表中的元素&#xff0c;不会生成新列表 list1 [2343, 55, 4, 345, 676, 768] list1.reverse() print(list1) # [768, 676, 345, 4, 55, 2343] 2.sort() 对原列表元素进行排序&#xff0c;默认是升序 list1 [2343, 55, 4, 345, 676, 768] list1…