前言

居然又拖到了最后一天才开始打卡,。果然 ddl 是第一生产力。

放上这次的教程链接:Datawhale 零基础入门数据挖掘-Task4 建模调参

看标题就知道这次的这次的内容是建模和调参。虽然说是零基础入门系列,但是这次的教程对真的零基础的人来讲并不是很友好,还是需要很多前置知识的。主要是机器学习模型方面的教程,教程里给出了几篇作者写的文章。个人感觉需要一定门槛,如果看不懂建议参考其他的。

这次打卡还是按照教程走一遍,先梳理一下主要内容的结构。这次任务主体分为五大部分:

  • 线性回归模型
  • 模型验证
  • 嵌入式特征选择(上一次任务没讲的)
  • 模型对比
  • 模型调参

开始之前,先把数据准备好。

还是依旧要先读取数据,不过这次任务的读取数据有两点不同:

  1. 读取的数据是上一次任务中做特征工程时生成的,没有的话需要运行一下 task3 的代码生成一下
  2. 教程中作者写了一个 reduce_mem_usage() 函数。通过转换数据的存储类型来达到节约内存空间的目的。

代码就不全粘贴了,没什么可说的,后面需要用到的变量是 sample_featurecontinuous_feature_names

sample_feature = reduce_mem_usage(pd.read_csv('data_for_tree.csv'))
continuous_feature_names = [x for x in sample_feature.columns if x not in ['price','brand','model','brand']]

需要根据所选特征构造训练集。

# 特征处理,删除空的数据并重置数据下标和类型
sample_feature = sample_feature.dropna().replace('-', 0).reset_index(drop=True)
sample_feature['notRepairedDamage'] = sample_feature['notRepairedDamage'].astype(np.float32)
# 构造训练数据
train = sample_feature[continuous_feature_names + ['price']]
train_X = train[continuous_feature_names]
train_y = train['price']

线性回归模型

线性回归模型就是简单的线性关系,类似于 a1x1+a2x2+a3x3+...+anxn+b=ya_1x_1 + a_2x_2 + a_3x_3 + ... + a_nx_n + b = ya1​x1​+a2​x2​+a3​x3​+...+an​xn​+b=y

就是说,每个自变量 xix_ixi​ 的单位变化都会导致因变量 yyy 的成比例的变化(aixia_ix_iai​xi​)

这里使用的是 sklearn 库下的 LinearRegression 函数。

# 简单的线性建模
from sklearn.linear_model import LinearRegression
model = LinearRegression(normalize=True)
model = model.fit(train_X, train_y)
print('intercept:'+ str(model.intercept_))
print(sorted(dict(zip(continuous_feature_names, model.coef_)).items(), key=lambda x:x[1], reverse=True))

运行结果:

intercept:-111820.66151155639
[(‘v_6’, 3372669.6439296836), (‘v_8’, 701432.2110340319), (‘v_9’, 169509.42711357534), (‘v_7’, 32757.63135064817), (‘v_12’, 23807.649529600818), (‘v_3’, 19739.216689565477), (‘v_11’, 13163.940983386958), (‘v_13’, 11963.46498465866), (‘v_10’, 3659.757920045777), (‘gearbox’, 878.481625388411), (‘fuelType’, 372.24870228828286), (‘bodyType’, 185.9175590029288), (‘city’, 46.98275955422143), (‘power’, 30.882991521559063), (‘brand_price_median’, 0.46125248465967494), (‘brand_amount’, 0.14337558626062372), (‘brand_price_std’, 0.13126146237474134), (‘brand_price_max’, 0.01264373865111078), (‘used_time’, 0.0006779416045904323), (‘SaleID’, 5.0161735988244534e-05), (‘train’, 3.982800990343094e-06), (‘seller’, -5.443580448627472e-06), (‘offerType’, -6.388872861862183e-06), (‘brand_price_sum’, -1.969811652902229e-05), (‘name’, -0.00024808160266330667), (‘brand_price_average’, -0.22234169615526606), (‘brand_price_min’, -1.9643720815997738),
(‘power_bin’, -56.46399500590243), (‘v_14’, -340.80766284241344), (‘kilometer’, -372.8800824482724), (‘notRepairedDamage’, -490.61611815679447), (‘v_0’, -2054.722036477167), (‘v_5’, -4343.72864602462), (‘v_4’, -15543.94705998868), (‘v_2’, -29430.03630720955), (‘v_1’, -45074.18455513423)]

这里我得到的结果跟教程稍微不同,猜测特征工程部分做的操作不完全一样。

可视化可以发现,预测目标拟合得并不好。由于很多模型都假设预测目标是正态分布的,因此后面对预测的目标 price 做了一个 log 操作。可视化后发现效果还不错。

v_9 单一特征进行预测,不取 log 和 取 log 的对比如下:

模型验证

五折交叉验证

对模型进行五折交叉验证,这里需要说明的是 cross_val_score 函数,它可以将数据分为训练集和测试集,并返回每次验证时模型的得分情况。

# 交叉验证
from sklearn.model_selection import cross_val_score
from sklearn.metrics import mean_absolute_error,  make_scorerdef log_transfer(func):def wrapper(y, yhat):result = func(np.log(y), np.nan_to_num(np.log(yhat)))return resultreturn wrapper
# 使用线性模型对未经过 log 变换的数据进行预测
scores = cross_val_score(model, X=train_X, y=train_y_org, verbose=1, cv = 5, scoring=make_scorer(log_transfer(mean_absolute_error)))
print('AVG-org:', np.mean(scores))
# 使用线性模型对 log 变换后的数据进行预测
scores = cross_val_score(model, X=train_X, y=train_y, verbose=1, cv = 5, scoring=make_scorer(log_transfer(mean_absolute_error)))
print('AVG:', np.mean(scores))

运行结果如下:

[Parallel(n_jobs=1)]: Using backend SequentialBackend with 1 concurrent workers.
[Parallel(n_jobs=1)]: Done 5 out of 5 | elapsed: 1.1s finished
AVG-org: 1.3684950216832068
[Parallel(n_jobs=1)]: Using backend SequentialBackend with 1 concurrent workers.
[Parallel(n_jobs=1)]: Done 5 out of 5 | elapsed: 0.7s finished
AVG: 0.02487489588467453

可以看到,做 log 处理后,模型的效果提升了两个数量级。

模拟真实环境

需要说明的一点是,有时数据是存在时序性的,我们不能拥有上帝视角预测未来的数据。因此划分验证集时,需要考虑数据的时序性,模拟真实环境。即前一部分是训练集,后一部分是验证集,验证集后不应再有训练集。这是作者当时直播强调的一点,不过在这里,并没有什么影响。

绘制学习率曲线

这里利用了教程里的 plot_learning_curve 函数来绘制,其中最主要的是调用了 learning_curve 来获得测试和训练时的得分。

plot_learning_curve(LinearRegression(), 'Liner_model', train_X[:1000], train_y[:1000], ylim=(0.0, 0.5), cv=5, n_jobs=1)
plt.show()

运行结果:

嵌入式特征选择

上一次任务中讲的,特征选择一共有三种。前两种是过滤式和包裹式,他们在做特征选择时,可以明显的与训练过程分离开。但嵌入式特征选择是边训练便选择,典型的方法是L1正则化与L2正则化。(以前只知道L1、L2正则化,但并不知道这是属于嵌入式特征选择,。孤陋寡闻了)

线性回归模型加入两种正则化方法后,就分别变成了岭回归与Lasso回归。

代码粘贴一下:

from sklearn.linear_model import LinearRegression
from sklearn.linear_model import Ridge
from sklearn.linear_model import Lassomodels = [LinearRegression(),Ridge(),Lasso()]result = dict()
for model in models:model_name = str(model).split('(')[0]scores = cross_val_score(model, X=train_X, y=train_y_ln, verbose=0, cv = 5, scoring=make_scorer(mean_absolute_error))result[model_name] = scoresprint(model_name + ' is finished')result = pd.DataFrame(result)
result.index = ['cv' + str(x) for x in range(1, 6)]
print(result)

运行结果:

     LinearRegression     Ridge     Lasso
cv1          0.190851  0.194948  0.383810
cv2          0.193835  0.197714  0.382179
cv3          0.194196  0.198252  0.383611
cv4          0.191812  0.195694  0.380331
cv5          0.195868  0.199817  0.383783

这里简单介绍一下 L1 和 L2 的区别,就不粘贴教程里的可视化代码了。

L1 的惩罚项是权值的绝对值之和,因此学到的权值参数小的会尽可能趋向于0,大的会尽可能变大,最后会得到一个稀疏矩阵,0 很多;L2 的惩罚项是权值的平方和,因此权值的绝对值会尽可能小,这样平方求和后的值就会变小,最后得到一个所有权值都向 0 靠近的参数矩阵。

模型对比

这部分教程介绍的比较少,主要是做了一个简单模型性能的对比,包括线性模型、决策树模型、随机森林、梯度提升树、多层感知机、XGBoost 和 LGBM。

运行教程代码的结果:

可以明显看出来,随机森林、XGBoost 和 LGBM的效果比较好。

模型调参

主要有三种方式:贪心、网格和贝叶斯。

需要提前设定好可能的参数集合。

这部分代码就不粘贴了,主要记录一下我的理解。

贪心调参

主要思路是遍历每一个参数,使用其中效果最好的参数继续训练模型,搜索下一个参数。

网格搜索

教程里使用的是 sklearn.model_selection 库里的 GridSearchCV 函数。网格调参是一种穷举搜索方法,遍历所有的参数组合,选出最好的那一组。

贝叶斯调参

教程中使用的是 BayesianOptimization 函数来做的。

贝叶斯调参的方法是一种自动调参的方式。前两种调参的方法运行效率比较低,运行时间很慢。贝叶斯的方法在于,他会建立一个概率模型,基于以前的评估结果,来最小化这个模型值。简而言之,在尝试下一组参数时,会参考以前的参数结果,避免做无用功。

最后

不得不说,还是高估了自己的自控力,拖延症真的得治呀。

不过这次学习还是学到了很多东西,虽然很多东西没有深入了解。最让人兴奋的还是大佬的各种可视化操作,看着各种数据被各种可视化出来,感觉好TM神奇。

好好学习,天天向上。又是瞎捅咕的一天,没干毕设的事内心还是有点愧疚。

datawhale 学习笔记——建模调参入门相关推荐

  1. 深度学习学习笔记——如何调参

    调参就是调整超参数,使模型的表达能力达到最大程度 实际调参案例 调参过程中要观察训练集损失函数和验证集损失函数和验证集的准确率. 当训练集损失函数降到一定程度不再降低时(不是固定值,是在一定区间内), ...

  2. 「建模调参」之零基础入门数据挖掘

    Datawhale 作者:徐韬 ,Datawhale优秀学习者 摘要:对于数据挖掘项目,本文将学习如何建模调参?从简单的模型开始,如何去建立一个模型:如何进行交叉验证:如何调节参数优化等. 建模调参: ...

  3. 【零基础入门数据挖掘】-建模调参

    Datawhale 作者:徐韬 ,Datawhale优秀学习者 摘要:对于数据挖掘项目,本文将学习如何建模调参?从简单的模型开始,如何去建立一个模型:如何进行交叉验证:如何调节参数优化等. 建模调参: ...

  4. 【数据挖掘】心跳信号分类预测 之 建模调参 —— 学习笔记(四)

    目录 四.建模调参 4.1 内容简介 4.2 模型原理与性质概述 4.2.1 分类模型 4.2.2 时间序列模型 4.2.3 推荐教材 4.3 模型对比与性能评估 4.3.1 逻辑回归 4.3.2 决 ...

  5. 【算法竞赛学习】二手车交易价格预测-Task4建模调参

    二手车交易价格预测-Task4 建模调参 四.建模与调参 Tip:此部分为零基础入门数据挖掘的 Task4 建模调参 部分,带你来了解各种模型以及模型的评价和调参策略,欢迎大家后续多多交流. 赛题:零 ...

  6. Flowable学习笔记(一、入门)

    转载自  Flowable学习笔记(一.入门) 一.Flowable简介 1.Flowable是什么 Flowable是一个使用Java编写的轻量级业务流程引擎.Flowable流程引擎可用于部署BP ...

  7. python网格搜索核函数_机器学习笔记——模型调参利器 GridSearchCV(网格搜索)参数的说明...

    算法 数据结构 机器学习笔记--模型调参利器 GridSearchCV(网格搜索)参数的说明 GridSearchCV,它存在的意义就是自动调参,只要把参数输进去,就能给出最优化的结果和参数.但是这个 ...

  8. 深度学习这么调参训练_聊一聊深度学习中的调参技巧?

    本期问题能否聊一聊深度学习中的调参技巧? 我们主要从以下几个方面来讲.1. 深度学习中有哪些参数需要调? 2. 深度学习在什么时候需要动用调参技巧?又如何调参? 3. 训练网络的一般过程是什么? 1. ...

  9. Python机器学习建模的标准流程(特征工程+建模调参+模型评估+全流程可视化)

    作者CSDN:进击的西西弗斯 本文链接:https://blog.csdn.net/qq_42216093/article/details/116994199 版权声明:本文为作者原创文章,转载需征得 ...

  10. 心电图心跳信号多分类预测-建模调参(四)

    1.相关模型及调参方法 1.1 相关模型介绍 逻辑回归模型 https://blog.csdn.net/han_xiaoyang/article/details/49123419 决策树模型 http ...

最新文章

  1. 因特尔显卡自定义分辨率_蓝宝石RX 5600XT 6G D6 白金版OC显卡评测:两千价位段好选择...
  2. Scrum Mastery:有效利用组织的5个步骤
  3. Windwos 08R2_DNS全面图文详解
  4. 读《中台架构与实现》
  5. 如何取消计算机用户名,Win10如何取消登录界面显示用户名?
  6. 画质评测|一次关于视频画质的探(zhǎn)讨(xiàn)
  7. 运行100万秒无错误!
  8. 以下计算机网络新技术是什么,计算机网络新技术概述
  9. while循环python次数定义_Python学习笔记之While循环用法分析
  10. 主机无法复制文件到ubuntu虚拟机的解决方法
  11. OKR:目标要定性,关键结果要定量
  12. ENVI纹理特征提取
  13. iphone5s已停用连接itunes怎么办?苹果5s已停用连接itunes解决方法
  14. 小米微信与电脑连接到服务器,小米微信多开文件怎么上传电脑
  15. autojs切换输入法
  16. 机器学习:特征选择之RFormula(SparkMLlib中的RFormula)
  17. 《计算机文件管理》教学设计,《文件和文件夹的操作》教学设计
  18. 自建服务器和购买云服务器的过程总结
  19. 自动化手工操作工具PyAutoGUI :鼠标操作
  20. ICCV2019 | AutoGAN:自动搜索生成对抗网络的结构

热门文章

  1. 一分钟入门typescript
  2. 屏蔽所有统计代码(51.la cnzz 百度统计 谷歌分析师adsense、屏蔽淘宝客广告代码)的方法
  3. Android中前景,背景 和 Gravity的设置属性
  4. pip安装指定清华镜像源
  5. Cups打印机驱动延迟Bug解决
  6. html 超链接打开pdf,HTML利用超链接打开链接文件
  7. 【熟知水星无线路由器的安装步骤】
  8. 改进YOLOv7系列:21.添加ShuffleAttention注意力机制
  9. 台式机鼠标失灵打开计算机,台式电脑鼠标不动怎么办
  10. java毕业设计成品SpringBoot+VUE实现的电影院会员积分管理系统