如何為你的迴歸問題選擇最合適的機器學習方法?
在目前的機器學習領域中,最常見的三種任務就是:迴歸分析、分類分析、聚類分析。在之前的文章中,我曾寫過一篇< 15分鐘帶你入門sklearn與機器學習——分類演算法篇>。那麼什麼是迴歸呢?迴歸分析是一種預測性的建模技術,它研究的是因變數(目標)和自變數(預測器)之間的關係。 迴歸分析在機器學習領域應用非常廣泛,例如,商品的銷量預測問題,交通流量預測問題。 那麼,如何為這些迴歸問題選擇最合適的機器學習演算法呢?這篇文章將從以下一個方面介紹:
1、常用的迴歸演算法
2、迴歸競賽問題以及解決方案
3、正在進行中的迴歸競賽問題
常用的迴歸演算法
這裡介紹一些迴歸問題中常用的機器學習方法, 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 importDecisionTreeRegressor
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)
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有如下優點,訓練速度更快,效率更高效;低記憶體的使用量。對於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——房價預測
這個比賽作為最基礎的迴歸問題之一,很適合入門機器學習的小夥伴們。
網址: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演算法之心 ",並回復"迴歸比賽資料集 ",可以直接下載到上述比賽資料集!
為了幫助小夥伴們入門機器學習,推薦幾本機器學習入門資料,歡迎關注" AI演算法之心 ",後臺回覆" 機器學習入門書籍 "。