在目前的機器學習領域中,最常見的三種任務就是:回歸分析、分類分析、聚類分析。在之前的文章中,我曾寫過一篇<15分鐘帶你入門sklearn與機器學習——分類算法篇>。那么什么是回歸呢?回歸分析是一種預測性的建模技術,它研究的是因變量(目標)和自變量(預測器)之間的關系?;貧w分析在機器學習領域應用非常廣泛,例如,商品的銷量預測問題,交通流量預測問題。那么,如何為這些回歸問題選擇最合適的機器學習算法呢?這篇文章將從以下一個方面介紹:
1、常用的回歸算法
2、回歸競賽問題以及解決方案
3、正在進行中的回歸競賽問題
常用的回歸算法
這里介紹一些回歸問題中常用的機器學習方法,sklearn作為機器學習中一個強大的算法包,內置了許多經典的回歸算法,下面將一一介紹各個算法:
注:下面回歸算法的代碼已上傳至網盤,如果有小伙伴感興趣,后臺回復"回歸算法"。
1、線性回歸
線性回歸擬合一個帶系數的線性模型,以最小化數據中的觀測值與線性預測值之間的殘差平方和。
sklearn中也存在線性回歸的算法庫的接口,代碼示例如下所示:
#加載線性模型算法庫fromsklearnimportlinear_model#創建線性回歸模型的對象regr=linear_model.LinearRegression()#利用訓練集訓練線性模型regr.fit(X_train,y_train)#使用測試集做預測y_pred=regr.predict(X_test)
2、嶺回歸
上述的線性回歸算法使用最小二乘法優化各個系數,對于嶺回歸來說,嶺回歸通過對系數進行懲罰(L2范式)來解決普通最小二乘法的一些問題,例如,當特征之間完全共線性(有解)或者說特征之間高度相關,這個時候適合用嶺回歸。
#加載線性模型算法庫fromsklearn.linear_modelimportRidge#創建嶺回歸模型的對象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模型算法庫fromsklearn.linear_modelimportLasso#創建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模型算法庫fromsklearn.linear_modelimportElasticNet#加載數據集fromsklearn.datasetsimportmake_regressionX,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、貝葉斯嶺回歸
貝葉斯嶺回歸模型和嶺回歸類似。貝葉斯嶺回歸通過最大化邊際對數似然來估計參數。
fromsklearn.linear_modelimportBayesianRidgeX=[[0.,0.],[1.,1.],[2.,2.],[3.,3.]]Y=[0.,1.,2.,3.]reg=BayesianRidge()reg.fit(X,Y)
6、SGD回歸
上述的線性模型通過最小二乘法來優化損失函數,SGD回歸也是一種線性回歸,不同的是,它通過隨機梯度下降最小化正則化經驗損失。
importnumpyasnpfromsklearnimportlinear_modeln_samples,n_features=10,5np.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模型算法庫fromsklearn.svmimportSVR#訓練集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]fromsklearn.neighborsimportKNeighborsRegressorneigh=KNeighborsRegressor(n_neighbors=2)neigh.fit(X,y)print(neigh.predict([[1.5]]))
9、決策樹回歸
決策樹也可以應用于回歸問題,使用sklearn的DecisionTreeRegressor類。
fromsklearn.treeimportDecisionTreeRegressorX=[[0,0],[2,2]]y=[0.5,2.5]clf=DecisionTreeRegressor()clf=clf.fit(X,y)clf.predict([[1,1]])
10、神經網絡
神經網絡使用slearn中MLPRegressor類實現了一個多層感知器(MLP),它使用在輸出層中沒有激活函數的反向傳播進行訓練,也可以將衡等函數視為激活函數。因此,它使用平方誤差作為損失函數,輸出是一組連續的值。
fromsklearn.neural_networkimportMLPRegressormlp=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回歸也是一種經典的集成算法之一。
fromsklearn.ensembleimportRandomForestRegressorfromsklearn.datasetsimportmake_regressionX,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]]))
12、XGBoost回歸
XGBoost近些年在學術界取得的成果連連捷報,基本所有的機器學習比賽的冠軍方案都使用了XGBoost算法,對于XGBoost的算法接口有兩種,這里我僅介紹XGBoost的sklearn接口。更多請參考:
https://xgboost.readthedocs.io/en/latest/python/index.html
importxgboostasxgbxgb_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))
13、LightGBM回歸
LightGBM作為另一個使用基于樹的學習算法的梯度增強框架。在算法競賽也是每逢必用的神器,且要想在競賽取得好成績,LightGBM是一個不可或缺的神器。相比于XGBoost,LightGBM有如下優點,訓練速度更快,效率更高效;低內存的使用量。對于LightGBM的算法接口有兩種,這里我同樣介紹LightGBM的sklearn接口。更多請參考:https://lightgbm.readthedocs.io/en/latest/
importlightgbmaslgbgbm=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))
-
算法
+關注
關注
23文章
4612瀏覽量
92901 -
機器學習
+關注
關注
66文章
8418瀏覽量
132646
原文標題:入門 | 如何為你的回歸問題選擇最合適的機器學習方法?
文章出處:【微信號:AI_shequ,微信公眾號:人工智能愛好者社區】歡迎添加關注!文章轉載請注明出處。
發布評論請先 登錄
相關推薦
評論