前言
最近在看AutoML檩咱,業(yè)界在 automl 上的進展還是很不錯的,個人比較看好這個方向胯舷,所以做了一些了解:
- Google: Cloud AutoML, Google’s Prediction API
- Microsoft: Custom Vision, Azure Machine Learning
- Amazon: Amazon Machine Learning
- BaiDu:EasyE
- Alibaba Group:PAI
- others: BigML.com, Wise.io, SkyTree.com, RapidMiner.com, Dato.com, Prediction.io, DataRobot.com,H2O.AI
github上的開源項目也是有不少的刻蚯,我所看到的包括:
- tpot
- 多項式特征組合
- 無監(jiān)督特征篩選
- 集成分類
- auto_ml
- 集成分類
- 可選深度模型前置
- auto_sklearn
- 特征清洗
- 特征篩選
- 元學習前置
- 超參數(shù)自動學習
- 自動集成分類
auto_sklearn
上述開源項目中,我主要看了auto_sklearn桑嘶,對他的架構設計炊汹,算法設計還是很感興趣的,論文在這邊Efficient and Robust Automated Machine Learning:
-
- 這邊auto_sklearn已經(jīng)內置諾干個參數(shù)選配好了的模型(可能是手動調參數(shù)逃顶,也有可能是也通過貝葉斯優(yōu)化的方法在小樣本上選擇)讨便,我們實際去用的時候是根據(jù)元特征相似度進行選擇即可
- 《Initializing Bayesian Hyperparameter Optimization via Meta-Learning》指出可以用L1和特征協(xié)方差來篩選,聰明的你一定發(fā)現(xiàn)口蝠,對離散值真不友好
-
元特征就是站在常規(guī)數(shù)據(jù)之上的匯總信息:
- 這邊auto_sklearn已經(jīng)內置諾干個參數(shù)選配好了的模型(可能是手動調參數(shù)逃顶,也有可能是也通過貝葉斯優(yōu)化的方法在小樣本上選擇)讨便,我們實際去用的時候是根據(jù)元特征相似度進行選擇即可
-
常規(guī) ML framework 如下圖灰色部分:導入數(shù)據(jù)-數(shù)據(jù)清洗-特征工程-分類器-輸出預測值
- 這邊都是常規(guī)操作器钟,我擴充了他里面的各種方法,總結在數(shù)據(jù)預處理
-
Bayesian optimizer
- 這個等下細講妙蔗,是這個論文中最有價值的地方之一
-
build-ensemble
- 模型集成
Bayesian optimizer
通常我們在參數(shù)嘗試的時候都是依賴如下:
- 暴力法
- Grid Search 網(wǎng)格搜索/窮舉搜索
- Random Search 隨機搜索
- Bayesian Optimization
- 能利用先驗知識高效地調節(jié)超參數(shù)傲霸,通過減少計算任務而加速尋找最優(yōu)參數(shù)的進程。不依賴人為猜測所需的樣本量為多少,優(yōu)化技術基于隨機性昙啄,概率分布
- Neural Network
- 用深度神經(jīng)網(wǎng)絡代替常規(guī)配置穆役,通過線性+非線性變化擬合任何曲線
Bayesian optimizer在實際被應用的過程中使用的較多,是實現(xiàn)自動參數(shù)選擇的核心梳凛,讓我們來仔細看下耿币,偽代碼:
- 構建超參數(shù)與優(yōu)化函數(shù)的關系(代理函數(shù)):比如gbdt中的樹數(shù)量與output的AUC之間的函數(shù)f,這一般都是模型韧拒,黑盒的
- 隨機初始化原始數(shù)據(jù)集合
- 通過高斯過程/隨機森林等對代理函數(shù)進行建模
- 設計acquisition function淹接,(EI,UCB叛溢,TS等)塑悼,獲取最大acquisition function對于假設數(shù)據(jù)集作為新增數(shù)據(jù)集
- 把新增數(shù)據(jù)集擴充到2中的數(shù)據(jù)集中重復更新整個過程
上述代碼實現(xiàn),非常簡單楷掉,完整代碼自取GP_Bayes_Optimizaion
init:
init_xs = np.random.uniform(bound_dict.get("x", [0, 0])[0],bound_dict.get("x", [1, 1])[1],size=self.init_point_number)
init_ys = np.random.uniform(bound_dict.get("y", [0, 0])[0], bound_dict.get("y", [1, 1])[1],size=self.init_point_number)
init_points = zip(init_xs, init_ys)
init_labels = map(self.target_loss_function, init_xs)
train_features = np.asarray(list(init_points))
train_negative_loss = np.asarray(list(init_labels))
current_max_negative_loss = max(train_negative_loss)
Acquision function computes the max value
x_tries = np.random.uniform(bounds[:, 0], bounds[:, 1], size=(100000, bounds.shape[0]))
mean, std = gp.predict(x_tries, return_std=True)
acquisition_fucntion_values = self.Acquision_function(mean, std)
x_max = x_tries[np.argmax(acquisition_fucntion_values)]
max_acquision_fucntion_value = max(acquisition_fucntion_values)
x_max = np.clip(x_max, bounds[:, 0], bounds[:, 1])
因為我寫的是簡單的高斯過程這種形式厢蒜,很多人對高斯過程為什么能擬合出方差均值不清楚,我手寫了一些推導過程高斯過程回歸烹植。
Bayesian optimizer來解決這類問題斑鸦,有很多的優(yōu)點的:
- 利用先驗知識高效地調節(jié)超參數(shù),每個試驗不獨立草雕,有點boost味道
- 通過高效的猜測而加速尋找最優(yōu)參數(shù)的進程
- 數(shù)據(jù)要求低巷屿,在目標函數(shù)未知且計算復雜度高的情況下極其強大
- 泛化性/魯棒性好,不易陷入局部最優(yōu)
其他優(yōu)秀資料
- Efficient and Robust Automated Machine Learning
- User Modeling and Hierarchical Reinforcement Learning
- Practical Bayesian Optimization of Machine Learning Algorithms
- Initializing Bayesian Hyperparameter Optimization via Meta-Learning
- A Conceptual Explanation of Bayesian Hyperparameter Optimization for Machine Learning
- Automated Machine Learning Hyperparameter Tuning in Python
auto-sklearn快速體驗
>>> import autosklearn.classification
>>> import sklearn.model_selection
>>> import sklearn.datasets
>>> import sklearn.metrics
>>> X, y = sklearn.datasets.load_digits(return_X_y=True)
>>> X_train, X_test, y_train, y_test = \
sklearn.model_selection.train_test_split(X, y, random_state=1)
>>> automl = autosklearn.classification.AutoSklearnClassifier()
>>> automl.fit(X_train, y_train)
>>> y_hat = automl.predict(X_test)
>>> print("Accuracy score", sklearn.metrics.accuracy_score(y_test, y_hat))
歡迎大家關注我的個人bolg墩虹,知乎攒庵,更多代碼內容歡迎follow我的個人Github,如果有任何算法败晴、代碼疑問都歡迎通過郵箱發(fā)消息給我浓冒。