充分利用可用的計算資源——用阿里雲訓練你的XGBoost

充分利用可用的計算資源——用阿里雲訓練你的XGBoost

來自專欄新交通人的技術閑談3 人贊了文章

一分鐘讀完全文

XGB調參是十分吃電腦資源的,在沒錢買工作站又需要一個臨時的訓練場所的情況下,阿里雲不失為一個很好的選擇。學生版的阿里雲目前一個月只需十元不到,價格實惠,搭載方便(搭載詳見 :阿里雲Ubuntu下的Python配置 - Song的文章 - 知乎

Song:阿里雲Ubuntu下的Python配置?

zhuanlan.zhihu.com圖標

缺點則是內存太小,對於小型數據尚可,大型的數據或網路集估計會比較吃力。本文介紹了如何藉助阿里雲的輕量伺服器實現XGB的訓練。順帶介紹了XGB的基本訓練流程。本文基於Python3實現,數據傳輸藉助mysql。

導入數據

第一步:將本地訓練集導入到IP為阿里雲伺服器內網的MYSQL上。注意我這裡將數據拆分為多個一萬行的子集,分批導入,因為一次導入多行會報錯。

import numpy as npimport pandas as pdfrom sqlalchemy import create_enginefrom pandas.io import sql# 導出數據os.chdir(/Users/husonghua/Desktop/Dur Files/RTMSPAPER/RTMS/)VL518 = pd.read_pickle(VL518.pkl)VL518 = VL518.rename(columns={day: date0})engine = create_engine(mysql://root:password@ip/sys) # 阿里雲for jj in range(0, int(len(VL518) / 10000) + 1): print(jj) temraw = VL518.iloc[jj * 10000:(jj + 1) * 10000, :] temraw.to_sql(con=engine, name=yangpu_vl518, if_exists=append)

在阿里雲上讀取數據

類似的,在阿里雲中進入到python工作環境,執行下面的語言,將資料庫中的訓練集讀取至內存。如果沒有相關包,請提前pip。

import numpy as npimport pandas as pdfrom sqlalchemy import create_enginefrom pandas.io import sql# 在阿里雲中導入數據engine = create_engine(mysql://root:password@ip/sys) # 阿里雲connection2 = engine.connect()resoverall = connection2.execute("SELECT * FROM sys.yangpu_vl518")rawdata = pd.DataFrame(resoverall.fetchall())rawdata.columns = resoverall.keys()rawdata.drop(index, axis=1, inplace=True)

準備訓練

訓練前的準備工作,調包,定義自己的評分模型(也可以直接用它給的,不過sklearn的score並不豐富):

# 模型調參from sklearn import preprocessingfrom sklearn import cross_validationfrom sklearn.cross_validation import train_test_splitfrom sklearn.cross_validation import *from sklearn.grid_search import GridSearchCVimport xgboost as xgbfrom sklearn.metrics import mean_squared_error, make_scorer# 定義自己的評分模型def mean_squared_error_(ground_truth, predictions): return mean(np.square(ground_truth - predictions)) ** 0.5RMSE = make_scorer(mean_squared_error_, greater_is_better=False) # greater_is_better=False說明越大越不好def F_MAPE(ground_truth, predictions): return np.mean(abs(ground_truth - predictions) / ground_truth)MAPE = make_scorer(F_MAPE, greater_is_better=False)

開始訓練

採用GridSearchCV進行參數比選,主要調了三個參數。最耗時的也是這一步。

L_train = rawdata[(rawdata.date0 < 2016-06-29)]X_train = L_train.drop([volume, date0], axis=1)cv_params = {max_depth: [1, 2, 3, 5, 7, 10], learning_rate: [1, 0.5, 0.1, 0.01], n_estimators: [10, 50, 100, 250, 500]}ind_params = {seed: 0, subsample: 1, colsample_bytree: 1, objective: reg:linear}optimized_GBM = GridSearchCV(xgb.XGBRegressor(**ind_params),cv_params, scoring=MAPE, cv=5, n_jobs=-1, verbose=10)optimized_GBM.fit(X_train, L_train[volume])

開始運行後效果如下,和在電腦上運行一個樣:

存儲結果

訓練完畢後,將訓練結果進行提取,返回至MYSQL:

tem1 = pd.DataFrame({mean: [-var[1] for var in optimized_GBM.grid_scores_]})tem2 = pd.DataFrame([var[0] for var in optimized_GBM.grid_scores_])fin_tem = pd.concat([tem1, tem2], axis=1)fin_tem.to_sql(con=engine, name=yangpu_grid_res, if_exists=replace)

打開MYSQL進行查看,可見結果已經入庫成功了:

繪製調參曲線

由於參數較多,調參曲線的繪製一般採用控制變數法,一幅圖一般可以繪製兩個參數,並將其餘的參數控制為最優參數不變:

# Number of trees(N)fig = plt.figure(figsize=(6.5, 6))ax = fig.add_subplot(1, 1, 1)FS = 18ccou = 0mmm = [o, <, *, d, p, >]for jj in set(grisc[max_depth]): tem = grisc[(grisc[max_depth] == jj) & (grisc[learning_rate] == 0.01)] ax.plot(tem[n_estimators], tem[mean], -, marker=mmm[ccou], markersize=10, label=Tree complexity= + str(jj), linewidth=2, alpha=0.8) # 對每一行進行繪製 ax.legend(loc=upper right, fontsize=FS) ax.set_xlabel(Number of trees, fontsize=FS) # X軸表示sub的變化 ax.set_ylabel(MAPE, fontsize=FS) plt.yticks(fontsize=FS) plt.xticks(fontsize=FS) plt.title((Learning rate=0.01), fontsize=FS) ccou = ccou + 1

繪製結果:

推薦閱讀:

微軟亞馬遜昂首走進來,阿里雲挺胸邁出去
阿里雲宣布推出Serverless Kubernetes服務 30秒即可完成應用部署
阿里雲確認與12306合作 後者或不再癱瘓|阿里雲|飛天
權威分析機構將阿里雲定級為DDoS防護領域全球「第一陣營
CDN邊緣節點容器調度實踐(下)

TAG:阿里雲 | xgboost | 機器學習 |