使用scikit-learn构建模型的万能模板(机器学习入门必看)

简介: 使用scikit-learn构建模型的万能模板(机器学习入门必看)

    算法工程师是伴随着人工智能火起来的一个领域。听着名字似乎门槛很高。但是,得益于Python生态下的包共享机制,机器模型构建的过程其实已经变得非常简单了,很多听起来牛逼的算法,其实根本不需要自己实现,甚至都不需要知道这些算法的具体原理。


你只需要两步就能构建起自己的机器学习模型:


  1. 明确你需要解决的问题是什么类型,以及知道解决该类型问题所对应的算法。


  1. 从skicit-learn中调用相应的算法构建模型即可。是的!在机器学习领域,如果你只是抱着体验机器学习的心态,实现起来就是这么简单。

第一步很好解决

       常见的问题类型只有三种:分类、回归、聚类。而明确具体问题对应的类型也很简单。比如,如果你需要通过输入数据得到一个类别变量,那就是分类问题。分成两类就是二分类问题,分成两类以上就是多分类问题。常见的有:判别一个邮件是否是垃圾邮件、根据图片分辩图片里的是猫还是狗等等。


如果你需要通过输入数据得到一个具体的连续数值,那就是回归问题。比如:预测某个区域的房价等。


       常用的分类和回归算法算法有:SVM (支持向量机) 、xgboost、, KNN、LR算法、SGD (随机梯度下降算法)、Bayes (贝叶斯估计)以及随机森林等。这些算法大多都既可以解分类问题,又可以解回归问题。


       如果你的数据集并没有对应的属性标签,你要做的,是发掘这组样本在空间的分布, 比如分析哪些样本靠的更近,哪些样本之间离得很远, 这就是属于聚类问题。常用的聚类算法有k-means算法。


       在本文中,我们主要解决第二步:通过skicit-learn构建模型。告诉你你一套让你简单到想笑的通用模型构建模板。只要scikit-learn实现的算法,都可以通过这种方式快速调用。牢记这个万能模板,你就能轻松构建起自己的机器学习模型。

预备工作

       在介绍万能模板之前,为了能够更深刻地理解这三个模板,我们加载一个Iris(鸢尾花)数据集来作为应用万能模板的小例子,Iris数据集在前边的文章中已经提到过多次了,这里不再赘述。它是一个典型的多分类问题。加载步骤如下:

1、加载数据集

因为原始的数据集中包含很多空值,而且类别特征用英文名表示各个花的名字,也需要我们转换成数字。


在scikit-learn下的datasets子包里,也自带了一个Iris数据集,这个数据集和原始数据集的区别就是scikit-learn已经帮我们提前处理好了空值等问题,可以直接输入模型用来训练。所以为了方便起见,我们直接使用scikit-learn的数据集。加载方法如下:

from sklearn.datasets import load_iris
data = load_iris()
x = data.data
y = data.target

x值如下,可以看到scikit-learn把数据集经过去除空值处理放在了array里,所以x是一个(150,4)的数组,保存了150个数据的4个特征:

array([[5.1, 3.5, 1.4, 0.2], [4.9, 3. , 1.4, 0.2], [4.7, 3.2, 1.3, 0.2], [4.6, 3.1, 1.5, 0.2], [5. , 3.6, 1.4, 0.2], [5.4, 3.9, 1.7, 0.4], [4.6, 3.4, 1.4, 0.3], [5. , 3.4, 1.5, 0.2], [4.4, 2.9, 1.4, 0.2], [4.9, 3.1, 1.5, 0.1], [5.4, 3.7, 1.5, 0.2], [4.8, 3.4, 1.6, 0.2], [4.8, 3. , 1.4, 0.1], [4.3, 3. , 1.1, 0.1], …………

y值如下,共有150行,其中0、1、2分别代表三类花:

array([0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2]) 

2、数据集拆分

       数据集拆分是为了验证模型在训练集和测试集是否过拟合,使用train_test_split的目的是保证从数据集中均匀拆分出测试集。这里,简单把10%的数据集拿出来用作测试集。

from sklearn.model_selection import train_test_split
train_x,test_x,train_y,test_y = train_test_split(x,y,test_size=0.1,random_state=0)

万能模板

助你快速构建一个基本的算法模型

不同的算法只是改变了名字,以及模型的参数不同而已。

有了这个万能模板,接下来就是简单的复制粘贴改名字了:

而且在scikit-learn中,每个包的位置都是有规律的,比如:随机森林就是在集成学习文件夹下。


模板应用案例:

1、构建SVM分类模型


通过查阅资料,我们知道svm算法在scikit-learn.svm.SVC下,所以:

  1. 算法位置填入:svm
  2. 算法名填入:SVC()
  3. 模型名自己起,这里我们就叫svm_model

套用模板得到程序如下:

# svm分类器
from sklearn.svm import SVC
from sklearn.metrics import accuracy_score
svm_model = SVC()
svm_model.fit(train_x,train_y)
pred1 = svm_model.predict(train_x)
accuracy1 = accuracy_score(train_y,pred1)
print('在训练集上的精确度: %.4f'%accuracy1)
pred2 = svm_model.predict(test_x)
accuracy2 = accuracy_score(test_y,pred2)
print('在测试集上的精确度: %.4f'%accuracy2)

输出:

在训练集上的精确度: 0.9810
在测试集上的精确度: 0.9778

2、构建LR分类模型

同理,找到LR算法在sklearn.linear_model.LogisticRegression下,所以:

  1. 算法位置填入:linear_model
  2. 算法名填入:LogisticRegression
  3. 模型名叫做:lr_model。


程序如下:

套用模板得到程序如下:

# LogisticRegression分类器
from sklearn.linear_model import LogisticRegression
from sklearn.metrics import accuracy_score #评分函数用精确度评估
lr_model = LogisticRegression()
lr_model.fit(train_x,train_y)
pred1 = lr_model.predict(train_x)
accuracy1 = accuracy_score(train_y,pred1)
print('在训练集上的精确度: %.4f'%accuracy1)
pred2 = lr_model.predict(test_x)
accuracy2 = accuracy_score(test_y,pred2)
print('在测试集上的精确度: %.4f'%accuracy2)

输出:

在训练集上的精确度: 0.9429

在测试集上的精确度: 0.8889

3、构建随机森林分类模型

随机森林算法在sklearn.ensemble.RandomForestClassifier 下,好了,现在你应该可以自己写了,这个作为本文的一个小测试,欢迎在评论区写下你的答案。

万能模板改进版

加入交叉验证,让算法模型评估更加科学


在1.0版的模板中,当你多次运行同一个程序就会发现:每次运行得到的精确度并不相同,而是在一定范围内浮动,这是因为数据输入模型之前会进行选择,每次训练时数据输入模型的顺序都不一样。所以即使是同一个程序,模型最后的表现也会有好有坏。


       更糟糕的是,有些情况下,在训练集上,通过调整参数设置使模型的性能达到了最佳状态,但在测试集上却可能出现过拟合的情况。这个时候,我们在训练集上得到的评分不能有效反映出模型的泛化性能。


       为了解决上述两个问题,还应该在训练集上划分出验证集(validation set)并结合交叉验证来解决。首先,在训练集中划分出不参与训练的验证集,只是在模型训练完成以后对模型进行评估,接着再在测试集上进行最后的评估。


       但这样大大减少了可用于模型学习的样本数量,所以还需要采用交叉验证的方式多训练几次。比如说最常用的k-折交叉验证如下图所示,它主要是将训练集划分为 k 个较小的集合。然后将k-1份训练子集作为训练集训练模型,将剩余的 1 份训练集子集作为验证集用于模型验证。这样需要训练k次,最后在训练集上的评估得分取所有训练结果评估得分的平均值。


         这样一方面可以让训练集的所有数据都参与训练,另一方面也通过多次计算得到了一个比较有代表性的得分。唯一的缺点就是计算代价很高,增加了k倍的计算量。


       原理就是这样,但理想很丰满,现实很骨干。在自己实现的时候却有一个很大的难题摆在面前:怎么能够把训练集均匀地划分为K份?


       这个问题不用思考太多,既然别忘了,我们现在是站在巨人的肩膀上,scikit-learn已经将优秀的数学家所想到的均匀拆分方法和程序员的智慧融合在了cross_val_score() 这个函数里了,只需要调用该函数即可,不需要自己想什么拆分算法,也不用写for循环进行循环训练。


万能模板改进如下:


把模型、数据、划分验证集的个数一股脑输入函数,函数会自动执行上边所说的过程。

在求精确度的时候,我们可以简单地输出平均精确度:

# 输出精确度的平均值
print("训练集上的精确度: %0.2f " % scores1.mean())

改进模板应用案例:

1、构建SVM分类模型

程序如下:

### svm分类器
from sklearn.model_selection import cross_val_score
from sklearn.svm import SVC
svm_model = SVC()
svm_model.fit(train_x,train_y)
scores1 = cross_val_score(svm_model,train_x,train_y,cv=5, scoring='accuracy')
# 输出精确度的平均值和置信度区间
print("训练集上的精确度: %0.2f (+/- %0.2f)" % (scores1.mean(), scores1.std() * 2))
scores2 = cross_val_score(svm_model,test_x,test_y,cv=5, scoring='accuracy')
# 输出精确度的平均值和置信度区间
print("测试集上的平均精确度: %0.2f (+/- %0.2f)" % (scores2.mean(), scores2.std() * 2))
print(scores1)
print(scores2)

输出:

输出:

训练集上的精确度: 0.97 (+/- 0.08)

测试集上的平均精确度: 0.91 (+/- 0.10)

[1. 1. 1. 0.9047619 0.94736842]

[1. 0.88888889 0.88888889 0.875 0.875 ]


2、构建LR分类模型  

代码如下

# LogisticRegression分类器
from sklearn.model_selection import cross_val_score
from sklearn.linear_model import LogisticRegression
lr_model = LogisticRegression()
lr_model.fit(train_x,train_y)
scores1 = cross_val_score(lr_model,train_x,train_y,cv=5, scoring='accuracy')
# 输出精确度的平均值和置信度区间
print("训练集上的精确度: %0.2f (+/- %0.2f)" % (scores1.mean(), scores1.std() * 2))
scores2 = cross_val_score(lr_model,test_x,test_y,cv=5, scoring='accuracy')
# 输出精确度的平均值和置信度区间
print("测试集上的平均精确度: %0.2f (+/- %0.2f)" % (scores2.mean(), scores2.std() * 2))
print(scores1)
print(scores2)

输出:

训练集上的精确度: 0.94 (+/- 0.07)
测试集上的平均精确度: 0.84 (+/- 0.14)
[0.90909091 1. 0.95238095 0.9047619 0.94736842]
[0.90909091 0.88888889 0.88888889 0.75 0.75 ]

随机森林依旧留作小测试。

注: 如果想要一次性评估多个指标,也可以使用可以一次性输入多个评估指标的 cross_validate()函数。

目录
打赏
0
0
0
0
38
分享
相关文章
特征时序化建模:基于特征缓慢变化维度历史追踪的机器学习模型性能优化方法
本文探讨了数据基础设施设计中常见的一个问题:数据仓库或数据湖仓中的表格缺乏构建高性能机器学习模型所需的历史记录,导致模型性能受限。为解决这一问题,文章介绍了缓慢变化维度(SCD)技术,特别是Type II类型的应用。通过SCD,可以有效追踪维度表的历史变更,确保模型训练数据包含完整的时序信息,从而提升预测准确性。文章还从数据工程师、数据科学家和产品经理的不同视角提供了实施建议,强调历史数据追踪对提升模型性能和业务洞察的重要性,并建议采用渐进式策略逐步引入SCD设计模式。
105 8
特征时序化建模:基于特征缓慢变化维度历史追踪的机器学习模型性能优化方法
PAI Model Gallery 支持云上一键部署 DeepSeek-V3、DeepSeek-R1 系列模型
DeepSeek 系列模型以其卓越性能在全球范围内备受瞩目,多次评测中表现优异,性能接近甚至超越国际顶尖闭源模型(如OpenAI的GPT-4、Claude-3.5-Sonnet等)。企业用户和开发者可使用 PAI 平台一键部署 DeepSeek 系列模型,实现 DeepSeek 系列模型与现有业务的高效融合。
云上一键部署 DeepSeek-V3 模型,阿里云 PAI-Model Gallery 最佳实践
本文介绍了如何在阿里云 PAI 平台上一键部署 DeepSeek-V3 模型,通过这一过程,用户能够轻松地利用 DeepSeek-V3 模型进行实时交互和 API 推理,从而加速 AI 应用的开发和部署。
DMS+X构建Gen-AI时代的一站式Data+AI平台
本文整理自阿里云数据库团队Analytic DB、PostgreSQL产品及生态工具负责人周文超和龙城的分享,主要介绍Gen-AI时代的一站式Data+AI平台DMS+X。 本次分享的内容主要分为以下几个部分: 1.发布背景介绍 2.DMS重磅发布:OneMeta 3.DMS重磅发布:OneOps 4.DMS+X最佳实践,助力企业客户实现产业智能化升级
DMS+X构建Gen-AI时代的一站式Data+AI平台
FastAPI + ONNX 部署机器学习模型最佳实践
本文介绍了如何结合FastAPI和ONNX实现机器学习模型的高效部署。面对模型兼容性、性能瓶颈、服务稳定性和安全性等挑战,FastAPI与ONNX提供了高性能、易于开发维护、跨框架支持和活跃社区的优势。通过将模型转换为ONNX格式、构建FastAPI应用、进行性能优化及考虑安全性,可以简化部署流程,提升推理性能,确保服务的可靠性与安全性。最后,以手写数字识别模型为例,展示了完整的部署过程,帮助读者更好地理解和应用这些技术。
97 20
全网首发 | PAI Model Gallery一键部署阶跃星辰Step-Video-T2V、Step-Audio-Chat模型
Step-Video-T2V 是一个最先进的 (SoTA) 文本转视频预训练模型,具有 300 亿个参数,能够生成高达 204 帧的视频;Step-Audio 则是行业内首个产品级的开源语音交互模型,通过结合 130B 参数的大语言模型,语音识别模型与语音合成模型,实现了端到端的文本、语音对话生成,能和用户自然地进行高质量对话。PAI Model Gallery 已支持阶跃星辰最新发布的 Step-Video-T2V 文生视频模型与 Step-Audio-Chat 大语言模型的一键部署,本文将详细介绍具体操作步骤。
多元线性回归:机器学习中的经典模型探讨
多元线性回归是统计学和机器学习中广泛应用的回归分析方法,通过分析多个自变量与因变量之间的关系,帮助理解和预测数据行为。本文深入探讨其理论背景、数学原理、模型构建及实际应用,涵盖房价预测、销售预测和医疗研究等领域。文章还讨论了多重共线性、过拟合等挑战,并展望了未来发展方向,如模型压缩与高效推理、跨模态学习和自监督学习。通过理解这些内容,读者可以更好地运用多元线性回归解决实际问题。
|
1月前
如何看PAI产品下训练(train)模型任务的费用细节
PAI产品下训练(train)模型任务的费用细节
86 6
PAI企业级能力升级:应用系统构建、高效资源管理、AI治理
PAI平台针对企业用户在AI应用中的复杂需求,提供了全面的企业级能力。涵盖权限管理、资源分配、任务调度与资产管理等模块,确保高效利用AI资源。通过API和SDK支持定制化开发,满足不同企业的特殊需求。典型案例中,某顶尖高校基于PAI构建了融合AI与HPC的科研计算平台,实现了作业、运营及运维三大中心的高效管理,成功服务于校内外多个场景。
利用机器学习算法改善电商推荐系统的效率
电商行业日益竞争激烈,提升用户体验成为关键。本文将探讨如何利用机器学习算法优化电商推荐系统,通过分析用户行为数据和商品信息,实现个性化推荐,从而提高推荐效率和准确性。
279 14
AI助理

你好,我是AI助理

可以解答问题、推荐解决方案等