如何为你的回归问题选择最合适的机器学习方法?
本文作者:何從慶
在目前的機器學習領域中,最常見的三種任務就是:回歸分析、分類分析、聚類分析。在之前的文章中,我曾寫過一篇<15分鐘帶你入門sklearn與機器學習——分類算法篇>。那么什么是回歸呢?回歸分析是一種預測性的建模技術,它研究的是因變量(目標)和自變量(預測器)之間的關系。回歸分析在機器學習領域應用非常廣泛,例如,商品的銷量預測問題,交通流量預測問題。那么,如何為這些回歸問題選擇最合適的機器學習算法呢?這篇文章將從以下一個方面介紹:
1、常用的回歸算法
2、回歸競賽問題以及解決方案
3、正在進行中的回歸競賽問題
常用的回歸算法
這里介紹一些回歸問題中常用的機器學習方法,sklearn作為機器學習中一個強大的算法包,內置了許多經典的回歸算法,下面將一一介紹各個算法:
注:下面回歸算法的代碼已上傳至網(wǎng)盤,如果有小伙伴感興趣,歡迎關注作者公眾號"AI算法之心",后臺回復"回歸算法"。
1、線性回歸
線性回歸擬合一個帶系數(shù)的線性模型,以最小化數(shù)據(jù)中的觀測值與線性預測值之間的殘差平方和。
sklearn中也存在線性回歸的算法庫的接口,代碼示例如下所示:
#加載線性模型算法庫 from sklearn import linear_model # 創(chuàng)建線性回歸模型的對象 regr = linear_model.LinearRegression() # 利用訓練集訓練線性模型 regr.fit(X_train, y_train) # 使用測試集做預測 y_pred = regr.predict(X_test)2、嶺回歸
上述的線性回歸算法使用最小二乘法優(yōu)化各個系數(shù),對于嶺回歸來說,嶺回歸通過對系數(shù)進行懲罰(L2范式)來解決普通最小二乘法的一些問題,例如,當特征之間完全共線性(有解)或者說特征之間高度相關,這個時候適合用嶺回歸。
#加載線性模型算法庫 from sklearn.linear_model import Ridge # 創(chuàng)建嶺回歸模型的對象 reg = Ridge(alpha=.5) # 利用訓練集訓練嶺回歸模型 reg.fit([[0, 0], [0, 0], [1, 1]], [0, .1, 1]) #輸出各個系數(shù) reg.coef_ reg.intercept_3、Lasso回歸
Lasso是一個估計稀疏稀疏的線性模型。它在某些情況下很有用,由于它傾向于選擇參數(shù)值較少的解,有效地減少了給定解所依賴的變量的數(shù)量。Lasso模型在最小二乘法的基礎上加入L1范式作為懲罰項。
#加載Lasso模型算法庫 from sklearn.linear_model import Lasso # 創(chuàng)建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 #加載數(shù)據(jù)集 from sklearn.datasets import make_regression X, y = make_regression(n_features=2, random_state=0) #創(chuàng)建ElasticNet回歸模型的對象 regr = ElasticNet(random_state=0) # 利用訓練集訓練ElasticNet回歸模型 regr.fit(X, y) print(regr.coef_) print(regr.intercept_) print(regr.predict([[0, 0]]))5、貝葉斯嶺回歸
貝葉斯嶺回歸模型和嶺回歸類似。貝葉斯嶺回歸通過最大化邊際對數(shù)似然來估計參數(shù)。
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回歸
上述的線性模型通過最小二乘法來優(yōu)化損失函數(shù),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
眾所周知,支持向量機在分類領域應用非常廣泛,支持向量機的分類方法可以被推廣到解決回歸問題,這個就稱為支持向量回歸。支持向量回歸算法生成的模型同樣地只依賴訓練數(shù)據(jù)集中的一個子集(和支持向量分類算法類似)。
#加載SVR模型算法庫 from sklearn.svm import SVR #訓練集 X = [[0, 0], [2, 2]] y = [0.5, 2.5] #創(chuàng)建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回歸
在數(shù)據(jù)標簽是連續(xù)變量而不是離散變量的情況下,可以使用KNN回歸。分配給查詢點的標簽是根據(jù)其最近鄰居標簽的平均值計算的。
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、神經網(wǎng)絡
神經網(wǎng)絡使用slearn中MLPRegressor類實現(xiàn)了一個多層感知器(MLP),它使用在輸出層中沒有激活函數(shù)的反向傳播進行訓練,也可以將衡等函數(shù)視為激活函數(shù)。因此,它使用平方誤差作為損失函數(shù),輸出是一組連續(xù)的值。
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) xgb_model.fit(X_train, y_train,eval_set=[(X_train, y_train)], eval_metric='logloss',verbose=100) y_pred = xgb_model.predict(X_test) print(mean_squared_error(y_test, y_pred))12、LightGBM回歸
LightGBM作為另一個使用基于樹的學習算法的梯度增強框架。在算法競賽也是每逢必用的神器,且要想在競賽取得好成績,LightGBM是一個不可或缺的神器。相比于XGBoost,LightGBM有如下優(yōu)點,訓練速度更快,效率更高效;低內存的使用量。對于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) gbm.fit(X_train, y_train,eval_set=[(X_train, y_train)], eval_metric='logloss',verbose=100) y_pred = gbm.predict(X_test) print(mean_squared_error(y_test, y_pred))回歸競賽問題以及解決方案
為了方便小伙伴們練習機器學習中的相關項目,這里整理一些回歸競賽問題,幫助入門機器學習的小伙伴們更加深入的掌握機器學習中的回歸問題。
入門級比賽:
Kaggle——房價預測
這個比賽作為最基礎的回歸問題之一,很適合入門機器學習的小伙伴們。
網(wǎng)址: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——銷售量預測
這個比賽作為經典的時間序列問題之一,目標是為了預測下個月每種產品和商店的總銷售額。
網(wǎng)址: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——餐廳訪客預測
網(wǎng)址: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銷售預測
網(wǎng)址: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年騰訊廣告大賽——廣告曝光預估
網(wǎng)址:https://algo.qq.com/application/home/home/index.html
數(shù)據(jù)集下載:
關注作者的公眾號"AI算法之心",并回復"回歸比賽數(shù)據(jù)集",可以直接下載到上述比賽數(shù)據(jù)集!
請關注和分享↓↓↓?
本站的知識星球(黃博的機器學習圈子)ID:92416895
目前在機器學習方向的知識星球排名第一
往期精彩回顧
良心推薦:機器學習入門資料匯總及學習建議(2018版)
黃海廣博士的github鏡像下載(機器學習及深度學習資源)
吳恩達老師的機器學習和深度學習課程筆記打印版
機器學習小抄-(像背托福單詞一樣理解機器學習)
首發(fā):深度學習入門寶典-《python深度學習》原文代碼中文注釋版及電子書
科研工作者的神器-zotero論文管理工具
機器學習的數(shù)學基礎
機器學習必備寶典-《統(tǒng)計學習方法》的python代碼實現(xiàn)、電子書及課件
吐血推薦收藏的學位論文排版教程(完整版)
機器學習入門的百科全書-2018年“機器學習初學者”公眾號文章匯總
Python環(huán)境的安裝(Anaconda+Jupyter notebook+Pycharm)
Python代碼寫得丑怎么辦?推薦幾個神器拯救你
總結
以上是生活随笔為你收集整理的如何为你的回归问题选择最合适的机器学习方法?的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 重磅推荐《南瓜书》:周志华《机器学习》的
- 下一篇: 为什么越来越多的程序员开始学机器学习的原