如何为回归问题选择最合适的机器学习方法?
作者 | 何从庆
本文经授权转载自 AI算法之心(id:AIHeartForYou)
在目前的机器学习领域中,最常见的三种任务就是:回归分析、分类分析、聚类分析。在之前的文章中,我曾写过一篇《15分钟带你入门sklearn与机器学习——分类算法篇》。
那么什么是回归呢?回归分析是一种预测性的建模技术,它研究的是因变量(目标)和自变量(预测器)之间的关系。回归分析在机器学习领域应用非常广泛,例如,商品的销量预测问题,交通流量预测问题。那么,如何为这些回归问题选择最合适的机器学习算法呢?这篇文章将从以下一个方面介绍:
常用的回归算法
回归竞赛问题以及解决方案
正在进行中的回归竞赛问题
常用的回归算法
这里介绍一些回归问题中常用的机器学习方法,sklearn作为机器学习中一个强大的算法包,内置了许多经典的回归算法,下面将一一介绍各个算法:
注:下面回归算法的代码已上传至网盘,如果有小伙伴感兴趣,欢迎关注"AI算法之心",后台回复"回归算法"。
1、线性回归
线性回归拟合一个带系数的线性模型,以最小化数据中的观测值与线性预测值之间的残差平方和。
sklearn中也存在线性回归的算法库的接口,代码示例如下所示:
#加载线性模型算法库
from sklearn import linear_model
# 创建线性回归模型的对象
regr = linear_model.LinearRegression()
# 利用训练集训练线性模型
regr.fit(X_train, y_train)
# 使用测试集做预测
y_pred = regr.predict(X_test)
2、岭回归
上述的线性回归算法使用最小二乘法优化各个系数,对于岭回归来说,岭回归通过对系数进行惩罚(L2范式)来解决普通最小二乘法的一些问题,例如,当特征之间完全共线性(有解)或者说特征之间高度相关,这个时候适合用岭回归。
#加载线性模型算法库
from sklearn.linear_model import Ridge
# 创建岭回归模型的对象
reg = Ridge(alpha=.5)
# 利用训练集训练岭回归模型
reg.fit([[0, 0], [0, 0], [1, 1]], [0, .1, 1])
#输出各个系数
reg.coef_
reg.intercept_
3、Lasso回归
Lasso是一个估计稀疏稀疏的线性模型。它在某些情况下很有用,由于它倾向于选择参数值较少的解,有效地减少了给定解所依赖的变量的数量。Lasso模型在最小二乘法的基础上加入L1范式作为惩罚项。
#加载Lasso模型算法库
from sklearn.linear_model import Lasso
# 创建Lasso回归模型的对象
reg = Lasso(alpha=0.1)
# 利用训练集训练Lasso回归模型
reg.fit([[0, 0], [1, 1]], [0, 1])
"""
Lasso(alpha=0.1, copy_X=True, fit_intercept=True, max_iter=1000,
normalize=False, positive=False, precompute=False, random_state=None,
selection='cyclic', tol=0.0001, warm_start=False)
"""
# 使用测试集做预测
reg.predict([[1, 1]])
4、Elastic Net回归
Elastic Net 是一个线性模型利用L1范式和L2范式共同作为惩罚项。这种组合既可以学习稀疏模型,同时可以保持岭回归的正则化属性。
#加载ElasticNet模型算法库
from sklearn.linear_model import ElasticNet
#加载数据集
from sklearn.datasets import make_regression
X, y = make_regression(n_features=2, random_state=0)
#创建ElasticNet回归模型的对象
regr = ElasticNet(random_state=0)
# 利用训练集训练ElasticNet回归模型
regr.fit(X, y)
print(regr.coef_)
print(regr.intercept_)
print(regr.predict([[0, 0]]))
5、贝叶斯岭回归
贝叶斯岭回归模型和岭回归类似。贝叶斯岭回归通过最大化边际对数似然来估计参数。
from sklearn.linear_model import BayesianRidge
X = [[0., 0.], [1., 1.], [2., 2.], [3., 3.]]
Y = [0., 1., 2., 3.]
reg = BayesianRidge()
reg.fit(X, Y)
6、SGD回归
上述的线性模型通过最小二乘法来优化损失函数,SGD回归也是一种线性回归,不同的是,它通过随机梯度下降最小化正则化经验损失。
import numpy as np
from sklearn import linear_model
n_samples, n_features = 10, 5
np.random.seed(0)
y = np.random.randn(n_samples)
X = np.random.randn(n_samples, n_features)
clf = linear_model.SGDRegressor(max_iter=1000, tol=1e-3)
clf.fit(X, y)
"""
SGDRegressor(alpha=0.0001, average=False, early_stopping=False,
epsilon=0.1, eta0=0.01, fit_intercept=True, l1_ratio=0.15,
learning_rate='invscaling', loss='squared_loss', max_iter=1000,
n_iter=None, n_iter_no_change=5, penalty='l2', power_t=0.25,
random_state=None, shuffle=True, tol=0.001, validation_fraction=0.1,
verbose=0, warm_start=False)
"""
7、SVR
众所周知,支持向量机在分类领域应用非常广泛,支持向量机的分类方法可以被推广到解决回归问题,这个就称为支持向量回归。支持向量回归算法生成的模型同样地只依赖训练数据集中的一个子集(和支持向量分类算法类似)。
#加载SVR模型算法库
from sklearn.svm import SVR
#训练集
X = [[0, 0], [2, 2]]
y = [0.5, 2.5]
#创建SVR回归模型的对象
clf = SVR()
# 利用训练集训练SVR回归模型
clf.fit(X, y)
"""
SVR(C=1.0, cache_size=200, coef0=0.0, degree=3, epsilon=0.1,
gamma='auto_deprecated', kernel='rbf', max_iter=-1, shrinking=True,
tol=0.001, verbose=False)
"""
clf.predict([[1, 1]])
8、KNN回归
在数据标签是连续变量而不是离散变量的情况下,可以使用KNN回归。分配给查询点的标签是根据其最近邻居标签的平均值计算的。
X = [[0], [1], [2], [3]]
y = [0, 0, 1, 1]
from sklearn.neighbors import KNeighborsRegressor
neigh = KNeighborsRegressor(n_neighbors=2)
neigh.fit(X, y)
print(neigh.predict([[1.5]]))
9、决策树回归
决策树也可以应用于回归问题,使用sklearn的DecisionTreeRegressor类。
from sklearn.tree import DecisionTreeRegressor
X = [[0, 0], [2, 2]]
y = [0.5, 2.5]
clf = DecisionTreeRegressor()
clf = clf.fit(X, y)
clf.predict([[1, 1]])
10、神经网络
神经网络使用slearn中MLPRegressor类实现了一个多层感知器(MLP),它使用在输出层中没有激活函数的反向传播进行训练,也可以将衡等函数视为激活函数。因此,它使用平方误差作为损失函数,输出是一组连续的值。
from sklearn.neural_network import MLPRegressor
mlp=MLPRegressor()
mlp.fit(X_train,y_train)
"""
MLPRegressor(activation='relu', alpha=0.0001, batch_size='auto', beta_1=0.9,
beta_2=0.999, early_stopping=False, epsilon=1e-08,
hidden_layer_sizes=(100,), learning_rate='constant',
learning_rate_init=0.001, max_iter=200, momentum=0.9,
n_iter_no_change=10, nesterovs_momentum=True, power_t=0.5,
random_state=None, shuffle=True, solver='adam', tol=0.0001,
validation_fraction=0.1, verbose=False, warm_start=False)
"""
y_pred = mlp.predict(X_test)
11.RandomForest回归
RamdomForest回归也是一种经典的集成算法之一。
from sklearn.ensemble import RandomForestRegressor
from sklearn.datasets import make_regression
X, y = make_regression(n_features=4, n_informative=2,
random_state=0, shuffle=False)
regr = RandomForestRegressor(max_depth=2, random_state=0,
n_estimators=100)
regr.fit(X, y)
print(regr.feature_importances_)
print(regr.predict([[0, 0, 0, 0]]))
11、XGBoost回归
XGBoost近些年在学术界取得的成果连连捷报,基本所有的机器学习比赛的冠军方案都使用了XGBoost算法,对于XGBoost的算法接口有两种,这里我仅介绍XGBoost的sklearn接口。更多请参考:
https://xgboost.readthedocs.io/en/latest/python/index.html
import xgboost as xgb
xgb_model = xgb.XGBRegressor(max_depth = 3,
learning_rate = 0.1,
n_estimators = 100,
objective = 'reg:linear',
n_jobs = -1)
y_train,
eval_set=[(X_train, y_train)],
eval_metric='logloss',
verbose=100)
y_pred = xgb_model.predict(X_test)
y_pred))
12、LightGBM回归
LightGBM作为另一个使用基于树的学习算法的梯度增强框架。在算法竞赛也是每逢必用的神器,且要想在竞赛取得好成绩,LightGBM是一个不可或缺的神器。相比于XGBoost,LightGBM有如下优点,训练速度更快,效率更高效;低内存的使用量。对于LightGBM的算法接口有两种,这里我同样介绍LightGBM的sklearn接口。
更多请参考:https://lightgbm.readthedocs.io/en/latest/
import lightgbm as lgb
gbm = lgb.LGBMRegressor(num_leaves=31,
learning_rate=0.05,
n_estimators=20)
y_train,
eval_set=[(X_train, y_train)],
eval_metric='logloss',
verbose=100)
y_pred = gbm.predict(X_test)
y_pred))
回归竞赛问题以及解决方案
为了方便小伙伴们练习机器学习中的相关项目,这里整理一些回归竞赛问题,帮助入门机器学习的小伙伴们更加深入的掌握机器学习中的回归问题。
入门级比赛:
Kaggle——房价预测
这个比赛作为最基础的回归问题之一,很适合入门机器学习的小伙伴们。
网址:https://www.kaggle.com/c/house-prices-advanced-regression-techniques
经典解决方案:
XGBoost解决方案: https://www.kaggle.com/dansbecker/xgboost
Lasso解决方案: https://www.kaggle.com/mymkyt/simple-lasso-public-score-0-12102
进阶比赛:
Kaggle——销售量预测
这个比赛作为经典的时间序列问题之一,目标是为了预测下个月每种产品和商店的总销售额。
网址:https://www.kaggle.com/c/competitive-data-science-predict-future-sales
经典解决方案:
LightGBM: https://www.kaggle.com/sanket30/predicting-sales-using-lightgbm
XGBoost: https://www.kaggle.com/fabianaboldrin/eda-xgboost
第一名解决方案:https://www.kaggle.com/c/competitive-data-science-predict-future-sales/discussion/74835#latest-503740
TOP比赛方案:
Kaggle——餐厅访客预测
网址:https://www.kaggle.com/c/recruit-restaurant-visitor-forecasting
解决方案:
1st 方案: https://www.kaggle.com/plantsgo/solution-public-0-471-private-0-505
7th 方案:https://www.kaggle.com/c/recruit-restaurant-visitor-forecasting/discussion/49259#latest-284437
8th 方案:https://github.com/MaxHalford/kaggle-recruit-restaurant
12th 方案:https://www.kaggle.com/c/recruit-restaurant-visitor-forecasting/discussion/49251#latest-282765
Kaggle——CorporaciónFavoritaGrocery销售预测
网址:https://www.kaggle.com/c/favorita-grocery-sales-forecasting
解决方案:
1st 方案: https://www.kaggle.com/c/favorita-grocery-sales-forecasting/discussion/47582#latest-360306
2st 方案:https://www.kaggle.com/c/favorita-grocery-sales-forecasting/discussion/47568#latest-278474
3st 方案:https://www.kaggle.com/c/favorita-grocery-sales-forecasting/discussion/47560#latest-302253
4st 方案:https://www.kaggle.com/c/favorita-grocery-sales-forecasting/discussion/47529#latest-271077
5st方案:https://www.kaggle.com/c/favorita-grocery-sales-forecasting/discussion/47556#latest-270515
6st方案:https://www.kaggle.com/c/favorita-grocery-sales-forecasting/discussion/47575#latest-269568
正在进行中的回归竞赛
小伙伴们看到上面的解决方案是不是跃跃欲试,最近国内也有各大回归比赛,赶紧趁热打铁,来学习学习回归比赛吧!
2019年腾讯广告大赛——广告曝光预估
网址:https://algo.qq.com/application/home/home/index.html
(本文为AI科技大本营转载文章,转载请联系原作者)
◆
CTA核心技术及应用峰会
◆
5月25-27日,由中国IT社区CSDN与数字经济人才发展中心联合主办的第一届CTA核心技术及应用峰会将在杭州国际博览中心隆重召开,峰会将围绕人工智能领域,邀请技术领航者,与开发者共同探讨机器学习和知识图谱的前沿研究及应用。
更多重磅嘉宾请识别海报二维码查看,目前会议早鸟票发售中(原票价1099元),点击阅读原文即刻抢购。添加小助手微信15101014297,备注“CTA”,了解票务以及会务详情。
推荐阅读
他25岁进贝尔实验室,32岁提信息论,40岁办达特茅斯会议,晚年患上阿兹海默 | 人物志
微软沈向洋,百度李彦宏、王海峰,阿里王坚均候选中国工程院院士
小样,加张图你就不认识我了?“补丁”模型骗你没商量!| 技术头条
东大漆桂林、清华李涓子、复旦肖仰华等大牛确认出席CTA峰会!5月一起打卡杭州
京东 60 天哗变!CTO 成优化第一人 | 畅言
异构计算=未来?一文带你秒懂3大主流异构
《互联网人叹气图鉴》
回报率29%! 大神用情感分析创建一个比特币交易算法, 原来交易玩的是心理战
她说:为啥程序员都特想要机械键盘?这答案我服!
相关文章:

【Qt】获取本地IP(IPv4)
1、问题描述 获取本地IP列表有“127.0.0.1”、IPv4、IPv6等,一般使用IPv4,如何从已经获取的IP列表中挑出IPv4。 2、解决方法 QString ipv4; auto ips = QNetworkInterface::allAddresses(); foreach (auto ip, ipps) {if ( (ip.

2.2元组介绍+字符串操作
元组可以理解为“一旦创建就不能再修改的列表”,所以也叫只读列表 语法:names("A","B","C","D") 他只有两个方法: ①count ②index 字符串操作: 示例:name"chan" 1…

医生再添新助手!深度学习诊断传染病 | 完整代码+实操
作者 | Dipanjan (DJ) Sarkar译者 | Monanfei编辑 | Rachel、Jane出品 | AI科技大本营(id:rgznai100)【导读】文本基于深度学习和迁移学习方法,对疟疾等传染病检测问题进行了研究。作者对疟疾的检测原理以及迁移学习理论进行了介绍…

DIV限制宽度,字符断行,避免变形
代码如下:<div style"width:740px;word-break:break-all;word-wrap:break-word;">参考文章怎么强制限制div宽度转载于:https://www.cnblogs.com/leftfist/archive/2012/02/07/4258078.html

【渗透】node.js经典问题
1.循环问题 当循环调用 require() 时,一个模块可能在未完成执行时被返回。例如以下情况:a.js: exports.done false; const b require(./b.js); console.log(在 a 中,b.done %j, b.done); exports.done true; console.log(a 结束); b.js: console.log…

【Qt】Ubuntu下Qt应用程序自启动设置
1、问题描述 第一步,确保手动启动Qt程序没有报错!如果报以下错误,参见博客 qt.qpa.xcb: could not connect to display qt.qpa.plugin: Could not load the Qt platform plugin "xcb" in "" even though it was found. This application failed to s…

Tarjan算法应用 (割点/桥/缩点/强连通分量/双连通分量/LCA(最近公共祖先)问题)...
转载自:http://hi.baidu.com/lydrainbowcat/blog/item/2194090a96bbed2db1351de8.html 基本概念: 1.割点:若删掉某点后,原连通图分裂为多个子图,则称该点为割点。 2.割点集合:在一个无向连通图中࿰…

【JavaScript】Ubuntu16.04安装vscode+npm+yarn
一、安装vscode vscode官网(https://code.visualstudio.com/)下载linux deb文件 下载deb后,使用dpkg -i 命令安装 sudo dpkg -i code_1.45.1-1589445302_amd64.deb在终端执行命令code来启动vscode 二、安装nodejs curl -sL https://deb…

C++大数加法
1 #include <iostream>2 #include<deque>3 #include<string>4 5 using namespace std;6 7 string add(string a, string b) //此函数默认a的长度大于b(可以在main函数里用if语句控制a的长度大于b)8 {9 deque<int>sum; //sum用来存储和的每…

重磅!Facebook更新PyTorch 1.1,打算跨GPU分割神经网络
时隔半年不到,PyTorch 已经从之前的 1.0 升级到 1.1 版本了。刚刚,Facebook 在年度开发者大会 F8 上宣布正式发布 PyTorch 1.1 版本,这是对 PyTorch 1.0 的一次大的功能升级。 作者 | 琥珀 出品 | AI科技大本营(ID:rgznai100&…

红旗Linux认证简介
红旗Linux认证 一、课程名称:红旗Linux认证产品专家(RAP) 课程简介: 主要针对初次使用红旗Linux desktop的学员而编制,注重实用性,是红旗Linux的一门入门课程。 采用的教材是《红旗Linux桌面应用教程》&…

【Git】git clone时下载速度太慢的解决方法(亲测有效)
1、参考博客 https://www.jianshu.com/p/3f6477049ece2、原因 git clone特别慢是因为github.global.ssl.fastly.net域名被限制了。 只要找到这个域名对应的ip地址,然后在hosts文件中加上ip–>域名的映射,刷新DNS缓存便可。 3、解决方法 3.1 获取I…

JHipster技术简介
本文简单介绍Jhipster是什么,为什么用Jhipster,怎么用Jhipster。 WHAT - 技术栈 JHipster是什么 JHipster是一个开发平台,用于生成,开发,部署Spring Boot Angular/React Web Application和Spring microservices。 JHi…

如何确定最佳训练数据集规模?6 大必备“锦囊”全给你了
【导读】对于机器学习而言,获取数据的成本有时会非常昂贵,因此为模型选择一个合理的训练数据规模,对于机器学习是至关重要的。在本文中,作者针对线性回归模型和深度学习模型,分别介绍了确定训练数据集规模的方法。 作者…

Android实现左右滑动效果
本示例演示在Android中实现图片左右滑动效果。 关于滑动效果,在Android中用得比较多,本示例实现的滑动效果是使用ViewFlipper来实现的,当然也可以使用其它的View来实现。接下来就让我们开始实现这种效果。为了方便大家理解,我们先…

假如AI也会diss人类,他们会这样.....
1酷炫、未来感、强大、没灵气、不给力、垃圾、高深——如果有一个东西适用于以上所有这些词,那它一定是人工智能。人工智能的火爆一直伴随着争议和调侃。尤其是现在,大数据和机器学习已经融入到我们的生活,网上关于人工智障的吐槽却只增不减。…

[Go]在vscode中添加对模板文件tmpl的html语法自动补全的支持
1、打开设置界面 依次点击:“文件” --> “首选项” --> “设置” 2、打开文件配置 依次点击:“文本编辑器” --> “文件” --> “在settings.json中编辑” 3、添加对tmpl后缀文件的html语法自动补全支持 4、效果 html关键字高亮显示…

Docker 宿主机定时清除容器的运行日志
为什么80%的码农都做不了架构师?>>> docker 宿主机定时清除容器的运行日志 一般docker容器都是最小化安装,不仅如此系统定时器相关的服务也不存在,自己去安装也很麻烦,故此直接使用宿主机的定时器即可。 一、在容器中…

企业数据库合规的最佳实践
PCI DSS当前对于数据库要求有下述明确的控制措施: • 对访问任意数据库的所有用户进行认证。 • 所有用户访问任何数据库时,用户的查询和操作(例如移动、拷贝和删除)只能通过编程性事务(例如存储过程)。 •…

Docker网络解决方案-Flannel部署记录
Docker跨主机容器间网络通信实现的工具有Pipework、Flannel、Weave、Open vSwitch(虚拟交换机)、Calico实现跨主机容器间的通信。其中Pipework、Weave、Flannel,三者的区别是: Weave的思路 12在每个宿主机上布置一个特殊的route的…

【FFmpeg】警告:[hls] pkt.duration = 0, maybe the hls segment duration will not precise
1、问题描述 在使用ffmpeg编程生成m3u8文件时,报警告 [hls @ 0x7f26b4181840] pkt->duration = 0, maybe the hls segment duration will not precise2、原因分析 根据警告提示信息, AVPacket.duration的值设为了0,可能会导致hls在分段时时间不精确。 根据警告信息搜索…

反转字符串/列表、改变递归次数限制、else用法...Python 冷知识(四)
本文转载自Python编程时光(ID:Python-Time)冷知识系列,已经更新至第四篇。前三篇传送门在此,还没阅读的可以学习一下。谈谈 Python 那些不为人知的冷知识(一)谈谈 Python 那些不为人知的冷知识(…

我学Delphi心得与笔记-------在控件上如何禁用Ctrl+V
项目中用到一个TJamShellList组件,此组件实现绑定查询图片,发现在使用CtrlC的同时也可以使用CtrlV结果将一个图处复制了多份,这样就不行了:( 于是,想了一个办法,禁用了CtrlV组合按键,代码如下: //在KeyDown事件中写如下…

15分钟带你入门sklearn与机器学习——分类算法篇
作者 | 何从庆本文转载自AI算法之心(ID:AIHeartForYou)【导读】众所周知,Scikit-learn(以前称为scikits.learn)是一个用于Python编程语言的免费软件机器学习库。它具有各种分类,回归和聚类算法,…

【FFmpeg】警告:[mpegts] H.264 bitstream error, startcode missing, size 0
1、问题描述 在使用FFmpeg编程,编码成h.264后,再封装成hls时,报警告 [mpegts] H.264 bitstream error, startcode missing, size 02、原因分析 根据警告提示信息可知:264位流错误,开始码丢失,大小为0。 根据警告信息搜索源码,在 FFmpeg-n4.2.2/libavformat/mpegtsenc…

svg: svg预定义的形状
SVG 有一些预定义的形状元素,可被开发者使用和操作:矩形 <rect>圆形 <circle>椭圆 <ellipse>线 <line>折线 <polyline>多边形 <polygon>路径 <path> 矩形 <rect x"20" y"20" width&qu…

[转]会自动消失的对话框API函数:MessageBoxTimeout
//以下两个函数由user32.dll导出,只是没有微软官方文档记载,大家在cpp中包含了以下部分,就可以调用MessageBoxTimeout了。 extern "C"{int WINAPI MessageBoxTimeoutA(IN HWND hWnd, IN LPCSTR lpText, IN LPCSTR lpCaption, IN UI…

GitHub告急!黑客威胁程序员不交钱就删库
作者 | 伍杏玲出品 | CSDN(ID:CSDNnews)5月3日,当中国程序员正愉快地过五一节时,国外程序员突然发现自己GitHub上的代码不翼而飞!自己的GitHub一秒变成悬疑片现场,不仅被黑客攻击删代码了&#…

【FFmpeg】ffmpeg中函数返回的错误码:AVERROR及AVERROR_*
1、AVERROR FFmpeg的错误码大部分使用的PIOSIX标准中错误码的负值。 AVERROR定义在文件 FFmpeg-n4.2.1/libavutil/error.h 中 #define AVERROR(e) (-(e)) // Returns a negative error code from a POSIX error code, to return from library functions. //FFmpeg库的错误…

entjs 键盘监听
1.应用在textfield中的回车方式: var siteName new Ext.form.Field({id: loadUrl,//表单元素最好使用Id,不然在IE浏览器中表单内容将变形fieldLabel: 密码,listeners : {specialkey : function(field, e) {if (e.getKey() Ext.EventObject.ENTER) {ale…