机器学习入门第三集——如何完整实现一次模型训练
这次完成了模型的完整的一次训练,从数据集导入,数据简单处理以及最后模型的训练,总体来看,机器学习训练部分很简单就可以完成,之所以这么简单,主要原因是数据采用别人处理好的数据。但是现实中,最难的往往是数据处理,也就是特征工程部分。个人认为对于我这种学者来说,开发一种新的机器学习算法几乎不大可能,所以我个人觉得如果单纯使用别人的算法,这个难度其实不大,可以说算法“不值钱”,最难的地方就在于如何将你要用
提示:如何完整的从数据导入到最后模型训练以及模型保存,本集进行介绍。
上集回顾
提示:上集已经对机器学习基础知识分类常用算法等进行了描述,这集开始是如何完整训练模型,
前两集已经介绍了机器学习的通俗解释,已经常见分类,还有机器学习深度学习强化学习的关系和区别。有想看的小伙伴可以翻我主页去找,全部免费哈。
一、数据集是什么?
简单来说,机器学习中的数据集就像是一个装满了各种数据样本的大仓库。这些数据样本可以是各种各样的东西,比如图像、文字、数字等。每一个数据样本都包含了一些特征和一个对应的标签(在有监督学习中)。以预测天气为例,数据样本可能包含每天的温度、湿度、气压等特征,而标签就是当天实际的天气情况,如下雨、晴天等。数据集就是由大量这样的数据样本组成的,它是机器学习模型进行学习和训练的基础。
1.数据集的划分
通常情况下,数据集会被划分为以下几个部分:
训练集: 这是数据集的主要部分,就好比是学习用的课本和练习题。机器学习模型会从训练集中学习特征和标签之间的关系,通过不断地学习和调整自身的参数,来尝试找到一种能够准确预测的模式。例如在预测房价的模型中,训练集里有大量房屋的面积、房间数量、地理位置等特征数据,以及它们对应的实际价格,模型通过学习这些数据来掌握如何根据房屋特征来预测价格。(类似于平时交作业,想成高中生完成和提交平时作业哈,大学生就…懂得都懂哈哈哈)
验证集: 验证集就像是在学习过程中的自我测试题。模型在训练过程中,会时不时地用验证集来检查自己的学习成果,看看自己在新的数据上表现得怎么样。它的作用是帮助我们调整模型的超参数,比如在训练一个神经网络时,我们可以通过验证集来确定网络的层数、学习率等参数的最佳取值,使得模型在未知数据上有更好的表现。(其实有点类似于月考找你的问题和不足)
测试集: 测试集相当于期末考试的试卷,是用来最终检验模型的性能的。在模型训练和调整好之后,我们会用测试集来评估模型的准确性、泛化能力等指标。测试集的数据是模型在训练和验证过程中完全没有见过的,通过模型在测试集上的表现,我们可以知道这个模型在实际应用中的效果如何。(好比我们用高考来测试你的能力,毕竟高考的试卷大家都没见过)
2.划分数据集的方法有很多种,常见的有以下两种:
简单随机划分:就是把整个数据集按照一定的比例随机地分成训练集、验证集和测试集。比如,我们可以把 70% 的数据作为训练集,15% 作为验证集,15% 作为测试集。这种方法简单直接,适用于大多数情况。(还有721划分法)
K 折交叉验证:把数据集分成 K 个大小差不多的子集,每次选其中一个子集作为测试集,其余 K-1 个子集作为训练集,这样会进行 K 次训练和测试,最后把 K 次的结果平均起来作为模型的评估结果。这种方法可以更充分地利用数据,减少因数据划分带来的误差,尤其适用于数据量比较小的情况。
提示:一般我们的训练只划分训练集和测试集,然后验证集在训练集里面抽取,按照80%训练集和20%测试集。(如有不同意见可以讨论哈)
二、完整训练过程
本文只进行XGboost算法的完整代码展示,其他算法的代码只需您将xgboost部分替换即可。(可替换内容可以去我上一集扒拉,但不限于我上一集内容)
1.导入数据
本文采用波士顿房价预测数据集进行代码的实战:
(这里波士顿房价数据集不进行介绍,想了解可以去其他地方哈)
import numpy as np
import pandas as pd
dataset=pd.read_csv('data/Classification_Boston/train_dataset.csv') #数据导入,注意你数据储存位置
# values = dataset.values[:,2:] #只取第2列数据,要写成1:2;只取第3列数据,要写成2:3,取第2列之后(包含第二列)的所有数据,写成 1
values = dataset.values # 取全部数据,如果第一列是编号,则考虑使用上一行程序
2.数据集划分
这段代码主要做了两件大事:一是把数据集划分成训练集和测试集;二是对划分好的训练集和测试集进行归一化处理。这在机器学习里可是很常见的操作,就好比做菜前先把食材切好、洗干净,这样后续的 “烹饪”(也就是模型训练)才能更顺利。(为什么需要归一化也是比较老的一个问题,简单说就是不归一化的效果没有归一化好)
代码如下(示例):
import numpy as np # 导入numpy模块,用于数值计算
from sklearn.preprocessing import MinMaxScaler # 导入sklearn中的MinMaxScaler,用于特征缩放
# 把数据集分为训练集和测试集
values = np.array(values)
# 将前面处理好的DataFrame(data)转换成numpy数组,方便后续的数据操作。
num_samples = values.shape[0]
per = np.random.permutation(num_samples) #打乱后的行号
n_train_number = per[:int(num_samples * 0.8)] #选择80%作为训练集
n_test_number = per[int(num_samples * 0.8):] #选择除过80%之外的作为测试集
# 计算训练集的大小。
# 设置80%作为训练集
# int(...) 确保得到的训练集大小是一个整数。
# 先划分数据集,再进行归一化,这才是正确的做法!
Xtrain = values[n_train_number, :-1] #取特征列
Ytrain = values[n_train_number, -1] #取最后一列为目标列
Ytrain = Ytrain.reshape(-1,1)
Xtest = values[n_test_number, :-1]
Ytest = values[n_test_number, -1]
Ytest = Ytest.reshape(-1,1)
# 对训练集和测试集进行归一化
m_in = MinMaxScaler()
vp_train = m_in.fit_transform(Xtrain) # 注意fit_transform() 和 transform()的区别
vp_test = m_in.transform(Xtest) # 注意fit_transform() 和 transform()的区别
m_out = MinMaxScaler()
vt_train = m_out.fit_transform(Ytrain) # 注意fit_transform() 和 transform()的区别
vt_test = m_out.transform(Ytest) # 注意fit_transform() 和 transform()的区别
注:带fit和不带fit的区别,想象你要给一群不同身高的人做统一尺码的衣服。fit_transform() 就像是你先拿一把尺子去测量这一群人的身高范围(最小身高和最大身高),然后根据这个测量结果来确定做衣服的尺码标准,最后按照这个标准给这群人做出合适的衣服。而 transform() 是当你已经有了之前确定好的尺码标准,来了另一群人,你直接按照这个已有的标准给这群新的人做衣服,不需要再重新测量身高范围了。
再通俗一点就是x和y原本可以对应,如果x和y采用两种手段归一化会出现不能对应的情况。不带fit的就是说它的最大值最小值不用自己的,采用之前带fit的。
3. 模型训练
训练部分可以参照上一集的描述。
1.xgboost训练
import xgboost as xgb
model = xgb.XGBRegressor(n_estimators = 500,
learning_rate=0.08,
subsample=0.75,
colsample_bytree=1,
max_depth=7,
gamma=0)
model.fit(vp_train, vt_train)
2.核岭回归
from sklearn.kernel_ridge import KernelRidge
model = KernelRidge(kernel="rbf", gamma=0.1)
model.fit(vp_train, vt_train)
4.模型保存以及加载
下面演示保存为json格式,还可以使用 joblib 或 pickle 库保存训练好的模型。
# 保存模型
model.save_model('xgb_model.json')
# 加载模型
loaded_model = xgb.XGBRegressor()
loaded_model.load_model('xgb_model.json')
# 使用加载的模型进行预测
predictions = loaded_model.predict(vp_test)
至此模型训练完成,从数据导入到模型训练,比较重要的部分是数据集的划分部分。可以说目前的程序,市面上见到的机器学习模型基本上都可以拿来训练,只需更换第三部分即可。
总结
本文的内容人至此也即将结束,这次完成了模型的完整的一次训练,从数据集导入,数据简单处理以及最后模型的训练,总体来看,机器学习训练部分很简单就可以完成,之所以这么简单,主要原因是数据采用别人处理好的数据。但是现实中,最难的往往是数据处理,也就是特征工程部分。个人认为对于我这种学者来说,开发一种新的机器学习算法几乎不大可能,所以我个人觉得如果单纯使用别人的算法,这个难度其实不大,可以说算法“不值钱”,最难的地方就在于如何将你要用的数据处理好传给机器学习的算法之中。好了本集分享到此结束啦,提前祝大家新年年快乐!
下集预告
1.算法好不好是不是需要评估呀,所以下集带来算法性能评估。(会有可视化的结果呦)
2.下集可能要结束基础的机器学习算法,进入到深度学习领域的分享。
3.下次的文章估计得过完年年后分享喽,再次祝大家新年快乐。
友善提示:本文分享完全免费,若有小伙伴想要完整代码可以下方留言自己的邮箱号,我会挨个回复并转发程序。本文的数据去网上自行搜索哈,实在找不到可以给我发私信留言。
魔乐社区(Modelers.cn) 是一个中立、公益的人工智能社区,提供人工智能工具、模型、数据的托管、展示与应用协同服务,为人工智能开发及爱好者搭建开放的学习交流平台。社区通过理事会方式运作,由全产业链共同建设、共同运营、共同享有,推动国产AI生态繁荣发展。
更多推荐




所有评论(0)