第四次打卡 建模调参
建模调参
模型介绍
线性回归
f=w’ x +b
损失函数 (f - y) ^2
常采用最小二乘和梯度下降优化决策树模型
GBDT模型:梯度提升树
一个集成模型,可以看做很多基模型的线性相加,基模型是CART回归树。这是一个决策树模型,主要特征是,二分树,节点特征取值为是和不是。
决策树可能还需要进行剪枝,根据需求调节精度。Xgboost
是GBDT算法的一个工程实现,并进行一些优化。增加了衰减银子,减少加的树对于原模型的影响;在GBDT上增加了一个正则项,对于树的叶子节点的权重做了约束;增加了在随机森林上常用的col subsample策略;使用二阶泰勒展开去拟合损失函数,加快优化效率;不需要遍历所有分裂点,提出了一个估计分裂点的算法。lightGBM
LGB不需要通过所有样本计算信息增益,而且内置特征降维技术。采用少量的样本计算信息增益。
代码实战
将整理好的数据先进行一次简单建模 ,看表现情况。
from sklearn.linear_model import LinearRegression
model = LinearRegression(normalize=True)
model = model.fit(train_X, train_y)# 查看训练的线性回归模型的截距(intercept)与权重(coef)
'intercept:'+ str(model.intercept_)
sorted(dict(zip(continuous_feature_names, model.coef_)).items(), key=lambda x:x[1], reverse=True)from matplotlib import pyplot as plt
subsample_index = np.random.randint(low=0, high=len(train_y), size=50)
plt.scatter(train_X['v_9'][subsample_index], train_y[subsample_index], color='black')
plt.scatter(train_X['v_9'][subsample_index], model.predict(train_X.loc[subsample_index]), color='blue')
plt.xlabel('v_9')
plt.ylabel('price')
plt.legend(['True Price','Predicted Price'],loc='upper right')
print('The predicted price is obvious different from true price')
plt.show()
绘制特征v_9的值与标签的散点图,图片发现模型的预测结果(蓝色点)与真实标签(黑色点)的分布差异较大,且部分预测值出现了小于0的情况,说明我们的模型存在一些问题。
回归分析的五个基本假设
import seaborn as sns
print('It is clear to see the price shows a typical exponential distribution')
plt.figure(figsize=(15,5))
plt.subplot(1,2,1)
sns.distplot(train_y)
plt.subplot(1,2,2)
sns.distplot(train_y[train_y < np.quantile(train_y, 0.9)])
通过作图我们发现数据的标签(price)呈现长尾分布,不利于我们的建模预测。原因是很多模型都假设数据误差项符合正态分布,而长尾分布的数据违背了这一假设。因此需要进行变换,使得数据满足正态分布进行下一步预测。
train_y_ln = np.log(train_y + 1) #进行log(x+1)变换model = model.fit(train_X, train_y_ln)
print('intercept:'+ str(model.intercept_))
sorted(dict(zip(continuous_feature_names, model.coef_)).items(), key=lambda x:x[1], reverse=True)plt.scatter(train_X['v_9'][subsample_index], train_y[subsample_index], color='black')
plt.scatter(train_X['v_9'][subsample_index], np.exp(model.predict(train_X.loc[subsample_index])), color='blue')
plt.xlabel('v_9')
plt.ylabel('price')
plt.legend(['True Price','Predicted Price'],loc='upper right')
print('The predicted price seems normal after np.log transforming')
plt.show()
#再次进行可视化,发现预测结果与真实值较为接近,且未出现异常状况
五折交叉验证
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
#使用线性回归模型,对未处理标签的特征数据进行五折交叉验证(Error 1.36)
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))#使用线性回归模型,对处理过标签的特征数据进行五折交叉验证(Error 0.19)
scores = cross_val_score(model, X=train_X, y=train_y_ln, verbose=1, cv = 5, scoring=make_scorer(mean_absolute_error))
print('AVG:', np.mean(scores))
#查看评分
scores = pd.DataFrame(scores.reshape(1,-1))
scores.columns = ['cv' + str(x) for x in range(1, 6)]
scores.index = ['MAE']
scores
由于交叉检验也具有一定的局限性,还可以采用时间顺序对数据集进行分隔。
#绘制学习率曲线与验证曲线
from sklearn.model_selection import learning_curve, validation_curve
模型对比
线性:
在过滤式和包裹式特征选择方法中,特征选择过程与学习器训练过程有明显的分别。而嵌入式特征选择在学习器训练过程中自动地进行特征选择。嵌入式选择最常用的是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)]model = LinearRegression().fit(train_X, train_y_ln)
print('intercept:'+ str(model.intercept_))
sns.barplot(abs(model.coef_), continuous_feature_names) #修改model分别看评价指标
对于三个不同模型进行对比。L2正则化在拟合过程中通常都倾向于让权值尽可能小,最后构造一个所有参数都比较小的模型,抗扰动能力强;L1正则化有助于生成一个稀疏权值矩阵,进而可以用于特征选择。
非线性:
from sklearn.linear_model import LinearRegression
from sklearn.svm import SVC
from sklearn.tree import DecisionTreeRegressor
from sklearn.ensemble import RandomForestRegressor
from sklearn.ensemble import GradientBoostingRegressor
from sklearn.neural_network import MLPRegressor
from xgboost.sklearn import XGBRegressor
from lightgbm.sklearn import LGBMRegressor
使用同上测试方法,查看模型评分。
模型调参
- 贪心算法
- 网格调参
- 贝叶斯调参
学习资料
第四次打卡 建模调参相关推荐
- 【数据挖掘】心跳信号分类预测 之 建模调参 —— 学习笔记(四)
目录 四.建模调参 4.1 内容简介 4.2 模型原理与性质概述 4.2.1 分类模型 4.2.2 时间序列模型 4.2.3 推荐教材 4.3 模型对比与性能评估 4.3.1 逻辑回归 4.3.2 决 ...
- 心电图心跳信号多分类预测-建模调参(四)
1.相关模型及调参方法 1.1 相关模型介绍 逻辑回归模型 https://blog.csdn.net/han_xiaoyang/article/details/49123419 决策树模型 http ...
- Python机器学习建模的标准流程(特征工程+建模调参+模型评估+全流程可视化)
作者CSDN:进击的西西弗斯 本文链接:https://blog.csdn.net/qq_42216093/article/details/116994199 版权声明:本文为作者原创文章,转载需征得 ...
- 【算法竞赛学习】二手车交易价格预测-Task4建模调参
二手车交易价格预测-Task4 建模调参 四.建模与调参 Tip:此部分为零基础入门数据挖掘的 Task4 建模调参 部分,带你来了解各种模型以及模型的评价和调参策略,欢迎大家后续多多交流. 赛题:零 ...
- 「建模调参」之零基础入门数据挖掘
Datawhale 作者:徐韬 ,Datawhale优秀学习者 摘要:对于数据挖掘项目,本文将学习如何建模调参?从简单的模型开始,如何去建立一个模型:如何进行交叉验证:如何调节参数优化等. 建模调参: ...
- 【零基础入门数据挖掘】-建模调参
Datawhale 作者:徐韬 ,Datawhale优秀学习者 摘要:对于数据挖掘项目,本文将学习如何建模调参?从简单的模型开始,如何去建立一个模型:如何进行交叉验证:如何调节参数优化等. 建模调参: ...
- 数据挖掘-二手车价格预测 Task04:建模调参
数据挖掘-二手车价格预测 Task04:建模调参 模型调参部分 利用xgb进行五折交叉验证查看模型的参数效果 ## xgb-Model xgr = xgb.XGBRegressor(n_estimat ...
- #数据挖掘--第3章:建模调参之支持向量机SVM初体验
#数据挖掘--第3章:建模调参之支持向量机SVM初体验 序言:本系列博客面向初学者,只讲浅显易懂易操作的知识. 基础知识准备: 一.我们在进行训练之前,常常要对样本进行归一化.标准化或正则 ...
- 数据挖掘流程(四):建模调参
建模效果不好原因: model 模型 调参.调参可以影响5%的模型准确率. data 不同列差异过大.不同量纲可能导致模型效果不好-->取log/归一化. 同列差距过大,离散化.建模效果肯定不好 ...
- Datawhale 零基础入门数据挖掘-Task4 建模调参
本节内容为各种模型以及模型的评价和调参策略. 一.读取数据 import pandas as pd import numpy as np import warnings warnings.filter ...
最新文章
- wordpress on Zencart (WOZ) Ultimate SEO URLs 静态化
- [基础语法] SEARCH搜索指定字符串详解
- charles代理手机调试_Mac 上使用 Charles 进行手机抓包调试
- sql:CallableStatement执行存储过程
- dbc连接mysql_Spring WebFlux 使用 R2DBC 访问 MySQL
- 为什么说Pravega是流处理统一批处理的最后一块拼图?
- mysql left join中on后加条件判断和where中加条件的区别
- 海量数据挖掘MMDS week6: 支持向量机Support-Vector Machines,SVM
- 搭建VMware6.5+Win2003 MSCS群集实验环境
- redismanager 获取不到yml中的密码_恋爱物语APP:在城市的孤独中,获取真爱密码...
- python 快速排名发包_2019年SEO快速排名发包技术及原理 - 立金哥
- FileLocator Pro:强大高效的无索引全文搜索软件
- python 手机号码归属地 软件,Python查询手机号码归属地几种方法
- 2020年杭州电子科技大学计算机考研经验分享
- 计算机摄影采用的成像媒介,探讨computed tomography的中文名称
- 人脸识别扫描(活体检测功能,眨眼、摇头、点头),身份证认证
- 如何把Pod本地化(Localize)
- mysql统计每半小时内的数据(查寻某段时间内的数据)
- 读取excel文件数据,封装成hashmap
- Base64编码解码C代码实现
热门文章
- 论文阅读:《Bridging the Gap in 3D Object Detection for Autonomous Driving》
- OpenGL学习之旅(三)——Bezier曲线理论与OpenGL实现
- 【手写源码-设计模式7】-桥接模式-基于苹果小米手机刷机场景
- 基于Pytorch实现人脸关键点检测模型MTCNN
- dimm和udimm_RDIMM和UDIMM内存的区别
- matlab解方程 中det,matlab中det函数
- 杰出人士的七种共性之5-独木求林
- Hyperledge Fabric-身份与角色认证
- 关于php的梗儿_php是世界上最好的语言是什么梗?
- centos设置ftp默认端口