【乾貨】Python機器學習項目實戰2——模型選擇,超參數調整和評估(附代碼)

2021-03-02 專知

【導讀】這是一篇完全手把手進行機器學習項目構建的教程,包含:1. 數據清理和格式化 2. 探索性數據分析 3. 特徵工程和特徵選擇 4. 在性能指標上比較幾種機器學習模型 5. 對最佳模型執行超參數調整 6. 在測試集合中評估最佳模型 7. 解釋模型結果 8. 得出結論。在第一篇文章中,我們對數據進行了清理和結構化,進行了探索性的數據分析,開發了一組用於我們模型的特徵,並建立了一個基準(baseline)來衡量性能。在本文中,我們將討論如何實現和比較Python中的幾種機器學習模型,執行超參數優化,對最佳模型進行優選,並對測試集上的最終模型進行評估。

【乾貨】Python機器學習項目實戰1(附代碼)

作者 | William Koehrsen

編譯 | 專知

用python完成一個完整的機器學習項目:第二部分

——Model Selection, Hyperparameter Tuning, and Evaluation

集合解決問題所需的所有機器學習程序可能是一項艱巨的任務。在本系列文章中,我們將通過使用真實數據集實現機器學習工作流程,以了解各個技術是如何結合在一起的。

此項目的完整代碼在GitHub上,並附上與本文相對應的參考筆記。您可以隨意使用、共享和修改代碼!

第二部分代碼:

https://github.com/WillKoehrsen/machine-learning-project-walkthrough/blob/master/Machine%20Learning%20Project%20Part%202.ipynb

模型評估和選擇(Model Evaluation and Selection)

作為一個提醒,我們正在研究一個有監督的回歸任務(a supervised regression task):利用紐約市建築能源數據(New York City building energy data),我們想開發一個模型,可以預測建築物的能源之星得分(Energy Star Score)。我們關注的重點是預測的準確性和模型的可解釋性。

有大量的機器學習模型可供選擇,這會讓你難以決定從哪裡開始。雖然有些圖表試圖告訴你要使用哪種算法,但我更願意多嘗試幾種算法,並查看哪種算法效果最好!機器學習仍然是一個主要由經驗(實驗)而不是理論結果驅動的領域,事先知道哪種模型最好,幾乎是不可能的。

一般來說,從簡單的可解釋模型(如線性回歸)開始是一個好辦法,如果性能不足,繼而轉向更複雜但通常更準確的模型。下圖顯示了一種版本的準確性與可解釋性之間的權衡:

我們將評估五種不同的模型:

• 線性回歸(Linear Regression)

• K最近鄰回歸(K-Nearest Neighbors Regression)

• 隨機森林回歸(Random Forest Regression)

• 梯度增強回歸(Gradient Boosted Regression)

• 支持向量機回歸(Support Vector Machine Regression)

在這篇文章中,我們將著重於實現這些方法而不是背後的理論。對於想要了解背景知識的人來說,我強烈推薦閱讀「An Introduction to Statistical Learning 「【1】,或者「Hands-On Machine Learning with Scikit-Learn and TensorFlow」【2】。這兩本書都很好地解釋了理論,並展示了如何分別有效地使用R和Python中的方法。


填補缺失值(Imputing Missing Values)

雖然我們在處理數據時丟失了超過50%缺失值的列,但仍有不少觀察結果丟失。 機器學習模型無法處理任何缺失值,因此我們必須把它們填充進去,這是一個稱為Imputing的過程【3】。

首先,我們將讀入所有數據並提醒自己這些數據是什麼樣子的:

import pandas as pd
import numpy as np
# Read in data into dataframes
train_features = pd.read_csv('data/training_features.csv')
test_features = pd.read_csv('data/testing_features.csv')
train_labels = pd.read_csv('data/training_labels.csv')
test_labels = pd.read_csv('data/testing_labels.csv')
Training Feature Size: (6622, 64)
Testing Feature Size: (2839, 64)
Training Labels Size: (6622, 1)
Testing Labels Size: (2839, 1)

顯示NaN的值都代表缺少觀察結果。雖然有很多方法可以填補缺失數據,但我們將使用一種相對簡單的方法,即中值插補法(median imputation)。這將使用該列的中值(the median value)替換列中的所有缺失值。

在下面的代碼中,我們創建了一個Scikit-Learn Imputer對象,並將strategy設置為median。 然後我們在訓練數據上訓練這個對象(使用imputer.fit),並用它來填充訓練和測試數據中的缺失值(使用imputer.transform)。 這意味著測試數據中的缺失值將填入訓練數據的相應中值。

(我們必須這樣做插補(imputation),而不是對所有數據進行訓練,這樣做是為了避免測試數據洩漏問題(test data leakage),測試數據集中的信息會溢出到訓練數據中。)

# Create an imputer object with a median filling strategy
imputer = Imputer(strategy='median')
# Train on the training features
imputer.fit(train_features)
# Transform both training data and testing data
X = imputer.transform(train_features)
X_test = imputer.transform(test_features)
Missing values in training features: 0
Missing values in testing features: 0

現在所有的特徵都具有真實的,有限的值,沒有缺失值。


縮放(Scaling)是指改變特徵範圍的一般過程。這是必要的,因為特徵是以不同單位測量的,因此涵蓋了不同的範圍。比如支持向量機(svm)和考慮到觀測之間的距離度量的K-近鄰的方法,這兩種方法顯著地受到特徵範圍的影響,Scaling使得他們可以學習(learn)。儘管線性回歸和隨機森林等方法實際上並不需要特徵縮放,但在比較多種算法時採取這一步驟仍然是最佳做法。

我們將每個特徵縮放至0-1之間。通過獲取每個特徵值,減去特徵中的最小值並除以最大值減去最小值(範圍)來完成。這種縮放通常稱為歸一化(normalization),或者標準化(standardization)。

雖然這個過程很容易通過人工計算實現,但我們可以在Scikit-Learn中使用MinMaxScaler對象來完成。此方法的代碼與imputation相同,除了使用scaler來代替imputer!再次,我們確保僅使用訓練數據進行訓練,之後再轉換所有數據。

# Create the scaler object with a range of 0-1
scaler = MinMaxScaler(feature_range=(0, 1))
# Fit on the training data
scaler.fit(X)
# Transform both the training and testing data
X = scaler.transform(X)
X_test = scaler.transform(X_test)

現在,每個特徵的最小值為0,最大值為1。缺少值插補(Missing value imputation)和特徵縮放(feature scaling)是幾乎所有機器學習流程所需的兩個步驟,因此很有必要理解它們的工作原理!


在Scikit-Learn中實現機器學習模型(Implementing Machine Learning Models in Scikit-Learn)

在我們花費大量時間對數據進行清理和格式化之後,實際創建,訓練和預測模型相對簡單。我們將在Python中使用Scikit-Learn庫,它有著很好的說明文檔和一致的模型構建語法。 一旦你知道如何在Scikit-Learn中創建一個模型,你就可以快速實現各種算法。

我們通過一個例子來說明如何進行模型的創建,訓練(.fit)和測試(.predict),使用Gradient Boosting Regressor:

from sklearn.ensemble import GradientBoostingRegressor

# Create the model
gradient_boosted = GradientBoostingRegressor()

# Fit the model on the training data
gradient_boosted.fit(X, y)

# Make predictions on the test data
predictions = gradient_boosted.predict(X_test)

# Evaluate the model
mae = np.mean(abs(predictions - y_test))

print('Gradient Boosted Performance on the test set: MAE = %0.4f' % mae)
Gradient Boosted Performance on the test set: MAE = 10.0132

模型的創建,訓練和測試都是一條線!構建其他模型,我們使用相同的語法,只改變算法的名稱。 結果如下:

為了使這些數字正確,用目標的中值計算的樸素baseline是24.5。顯然,機器學習適用於我們的問題,因為相比於baseline有顯著的提高!

梯度增強回歸(MAE = 10.013)略優於隨機森林(MAE = 10.014)。這些結果並不完全公平,因為我們主要使用了超參數的默認值。特別是在支持向量機等模型中,性能高度依賴於這些設置。最終,從這些比較的結果中,我們將選擇梯度增強回歸(gradient boosted regressor)模型來進行模型優化。

模型優化的超參數調整(Hyperparameter Tuning for Model Optimization)

在機器學習中,在我們選擇了一個模型後,我們可以通過調整模型超參數來對我們的問題進行優化。

首先,超參數是什麼,它們與參數有什麼不同?【4】


 模型超參數(hyperparameters)被認為是機器學習算法的最好設置,該算法是由數據科學家在訓練之前設置的。例如,隨機森林中樹木的數量,或者k -最近鄰居算法中使用的鄰居數。

 模型參數(parameters)是模型在訓練過程中學習的內容,例如線性回歸中的權重。

通過改變模型中欠擬合和過擬合的平衡來控制影響模型性能的超參數。當我們的模型不夠複雜(它沒有足夠的自由度)來學習從特徵到目標的映射時,就是欠擬合(Underfitting)。一個欠擬合的模型有很高的偏置(bias),我們可以改變我們的模型使其更複雜來糾正。

過擬合(Overfitting)是當我們的模型基本上擬合了所有訓練數據點的時候。過擬合模型具有很高的方差(variance),我們可以通過正則化(regularization)來限制模型的複雜性來糾正。欠擬合和過擬合模型都不能很好地適用於測試數據(test data)。

•選擇正確的超參數的問題在於,對於每個機器學習問題,最優集都會有所不同!因此,找到最佳設置的唯一方法是在每個新數據集上嘗試一些設置。幸運的是,Scikit-Learn有許多方法可以讓我們高效地評估超參數。此外,Epistasis Lab的TPOT等項目正試圖使用遺傳編程(genetic programming)等方法優化超參數搜索。在這個項目中,我們將使用Scikit-Learning來完成這一任務,但是我們將繼續關注自動ML場景中的更多工作。

我們將要實現的特定超參數調整方法稱為隨機搜索和交叉驗證:

• 隨機搜索(Random Search)是指我們用來選擇超參數的技術。 我們定義一個網格,然後隨機抽樣不同的組合,而不是網格搜索(grid search),我們會徹底地嘗試每一個組合。 (令人驚訝的是,隨機搜索的結果幾乎和網格搜索一樣,但大大縮短了運行時間。)

• 交叉驗證(Cross Validation)是我們用來評估所選超參數組合的技術。 我們使用K折交叉驗證,而不是將訓練集分成單獨的訓練集和驗證集,這會減少我們可以使用的訓練數據量。交叉驗證涉及到將訓練數據分成K個folds,然後經歷一個迭代過程,在這個迭代過程中,我們首先訓練前K-1個folds的數據,然後在第K個fold的數據上進行評估表現。我們重複這個過程K次,在K-fold交叉驗證結束時,我們將每個K次迭代的平均誤差作為最終的性能度量。

K = 5的K-fold交叉驗證的過程如下所示:

使用交叉驗證執行隨機搜索的整個過程是:

建立一個待評估超參數網格

隨機抽樣一組超參數

用選定的組合創建一個模型

使用K-fold交叉驗證評估模型

確定哪些超參數運行得最好

當然,我們實際上並沒有手動做這件事,而是讓Scikit-Learn的RandomizedSearchCV處理所有的工作!

Gradient Boosted Methods(梯度增強方法)

由於我們將使用梯度增強回歸模型,我應該至少給出一點背景知識!這個模型是一個集成方法,這意味著它是由許多弱的學習器(weak learners)構建的,在這個例子中是決策樹(individual decision trees)。諸如隨機森林之類的bagging算法會對弱的學習器進行並行訓練,並讓他們投票(vote)進行預測,但像梯度增強這樣的方法,將會依次訓練學習器,並且每個學習器都「集中了」前面的所有錯誤。

增強方法近年來越來越流行,並且頻繁贏得機器學習競賽。梯度增強方法(Gradient Boosting Method)是一種特殊的實現,它使用梯度下降,基於前面的殘差進行連續訓練來最小化成本函數。scikit-learn實現的梯度增強通常被認為效率低於XGBoost等其他庫,但它對於我們的小數據集來說足夠好,並且相當準確。


回歸超參數調整(Back to Hyperparameter Tuning)

在Gradient Boosted Regressor中有許多超參數可以調整(tune),您可以查看Scikit-Learn文檔以了解詳細信息。在這個項目中,我們將優化以下超參數:

• loss:用來最小化的損失函數。

• n_estimators:弱學習器(決策樹)的使用數量。

• max_depth:每個決策樹的最大深度。

• min_samples_leaf:決策樹的葉節點所需的最小示例數量。

• min_samples_split:拆分決策樹節點所需的最小示例數量。

• max_features:用於拆分節點的最大特徵數。

我不確定是否有人真正了解所有這些超參數之間的相互作用,找到最佳組合的唯一方法就是try!

在下面的代碼中,我們構建一個超參數網格,創建一個RandomizedSearchCV對象,並在超過25個不同的超參數組合中使用4-fold交叉驗證來執行超參數搜索:

# Loss function to be optimized
loss = ['ls', 'lad', 'huber']

# Number of trees used in the boosting process
n_estimators = [100, 500, 900, 1100, 1500]

# Maximum depth of each tree
max_depth = [2, 3, 5, 10, 15]

# Minimum number of samples per leaf
min_samples_leaf = [1, 2, 4, 6, 8]

# Minimum number of samples to split a node
min_samples_split = [2, 4, 6, 10]

# Maximum number of features to consider for making splits
max_features = ['auto', 'sqrt', 'log2', None]

# Define the grid of hyperparameters to search
hyperparameter_grid = {'loss': loss,
                      'n_estimators': n_estimators,
                      'max_depth': max_depth,
                      'min_samples_leaf': min_samples_leaf,
                      'min_samples_split': min_samples_split,
                      'max_features': max_features}

# Create the model to use for hyperparameter tuning
model = GradientBoostingRegressor(random_state = 42)

# Set up the random search with 4-fold cross validation
random_cv = RandomizedSearchCV(estimator=model,
                              param_distributions=hyperparameter_grid,
                              cv=4, n_iter=25,
                              scoring = 'neg_mean_absolute_error',
                              n_jobs = -1, verbose = 1,
                              return_train_score = True,
                              random_state=42)

# Fit on the training data
random_cv.fit(X, y)

在執行搜索之後,我們可以檢查RandomizedSearchCV對象以找到最佳模型:

# Find the best combination of settings
random_cv.best_estimator_
GradientBoostingRegressor(loss='lad', max_depth=5,
                         max_features=None,
                         min_samples_leaf=6,
                         min_samples_split=6,
                         n_estimators=500)

然後, 我們可以使用這些結果來執行網格搜索, 方法是選擇接近這些最優值的網格參數。但是, 進一步調整不太可能顯著改善我們的模型。作為一般規則, 適當的特徵工程(feature engineering)對模型性能的影響要比最廣泛的超參數調整更大。這是機器學習中的收益遞減法則:特徵工程在大多數情況下會對實現目標有很大的幫助, 而超參數調整通常只會帶來很小的收益。

我們可以嘗試的一個實驗是改變估計器(決策樹)的數量, 同時保持其他超參數穩定。這直接讓我們觀察到這個特定設置的效果。具體實現方法請參閱筆記, 但結果顯示如下:

隨著模型使用的樹的數量增加,訓練和測試的誤差都會減少。 但是,訓練誤差比測試誤差下降得快得多,我們可以看到我們的模型過擬合了:它在訓練數據上表現非常好,但在測試集上無法達到相同的性能。

我們總是期望在測試集上的表現或多或少會有所下降,但是測試集和訓練集的差距太顯著則表明過擬合。我們可以通過獲取更多訓練數據來解決過度擬合問題,或者通過超參數來降低模型的複雜性。在這種情況下,我們將超參數保留在原來的位置,但我鼓勵大家嘗試任何可行的方法來減少過擬合。

對於最終模型,我們將使用800個估計器(estimators),因為這得到了在交叉驗證中的最低誤差。現在,測試這個模型的時間到了!

在測試集進行評估(Evaluating on the Test Set)

作為負責任的機器學習工程師,我們確保不讓我們的模型在任何訓練點上看到測試集的數據。 因此,我們可以使用測試集的表現作為我們的模型在現實世界中部署時的表現。

對測試集進行預測並計算性能是相對簡單的。在這裡,我們將比較默認的梯度增強回歸器(the default Gradient Boosted Regressor)與調參之後的模型的性能:

# Make predictions on the test set using default and final model
default_pred = default_model.predict(X_test)
final_pred = final_model.predict(X_test)
Default model performance on the test set: MAE = 10.0118.
Final model performance on the test set: MAE = 9.0446.

超參數調整將模型的準確率提高了約10%。這取決於使用情況,10%可能是一個巨大的改進,但它需要大量的時間投入!

我們也可以使用Jupyter Notebooks中的%timeit命令來計算訓練這兩個模型(默認模型和調參後模型)需要多長時間。首先是默認模型:

%%timeit -n 1 -r 5
default_model.fit(X, y)
1.09 s ± 153 ms per loop (mean ± std. dev. of 5 runs, 1 loop each)

1秒的訓練時間似乎挺合理的。最終的調參後的模型並沒有那麼快:

%%timeit -n 1 -r 5
final_model.fit(X, y)
12.1 s ± 1.33 s per loop (mean ± std. dev. of 5 runs, 1 loop each)

這證明了機器學習的一個基本特點:它總是一種權衡的遊戲。我們必須不斷平衡準確性與可解釋性,偏差與方差,準確性與運行時間等。這些將最終取決於所要解決的問題。在我們的例子中,相對而言,運行時間增加了12倍是很大的,但從絕對意義上講,它並沒有那麼重要。

一旦我們有了最終的預測值,我們就可以看看他們是否表現出明顯的偏差。左邊是預測值和實際值的密度圖,右邊是殘差的直方圖:

模型預測似乎遵循實際值的分布,儘管密度的峰值出現在訓練集的中值(66)附近,而非密度的真實峰值(接近100)。 殘差幾乎是正態分布,儘管在模型預測值遠低於真實值的情況下,我們會看到一些大的負值。我們將在下一篇文章中深入探討模型的結果。

總結(Conclusions)

在本文中,我們介紹了機器學習工作流程中的幾個步驟:

• 缺失值的插補和特徵的縮放

• 評估和比較幾種機器學習模型

• 使用隨機網格搜索和交叉驗證進行超參數調整

• 評估測試集上的最佳模型

這項工作的結果表明,機器學習適用於我們的任務(使用可用數據預測建築物的Energy Star Score)。使用梯度增強回歸法,我們可以預測測試集的分數在真實值的9.1分以內。 此外,我們還看到,超參數的調優可以提高模型的性能,但是需要相當大的時間成本。這是我們在開發機器學習解決方案時必須考慮的眾多權衡之一。

在下一篇文章中,我們將著眼於我們創建的黑盒子,並試圖理解我們的模型如何進行預測。 我們也將確定影響Energy Star Score的最大因素。雖然我知道我們的模型是準確的,但我們想知道它為什麼會做出預測,以及它告訴我們什麼問題!

原文連結:

https://towardsdatascience.com/a-complete-machine-learning-project-walk-through-in-python-part-two-300f1f8147e2

代碼連結:

https://github.com/WillKoehrsen/machine-learning-project-walkthrough/blob/master/Machine%20Learning%20Project%20Part%202.ipynb

人工智慧領域主題知識資料查看與加入專知人工智慧服務群

【專知AI服務計劃】專知AI知識技術服務會員群加入與人工智慧領域26個主題知識資料全集獲取

[點擊上面圖片加入會員]

請PC登錄www.zhuanzhi.ai或者點擊閱讀原文,註冊登錄專知,獲取更多AI知識資料

請加專知小助手微信(掃一掃如下二維碼添加),加入專知主題群(請備註主題類型:AI、NLP、CV、 KG等)交流~

關注專知公眾號,獲取人工智慧的專業知識!

點擊「閱讀原文」,使用專知

相關焦點

  • PyTorch 模型訓練實用教程(附代碼)
    PyTorch 模型訓練實用教程(附代碼)關注微信公眾號 datayx  然後回復  訓練  即可獲取。2.1.2 模型定義多說兩句上面只是介紹了模型定義的要素和過程,但是在工程應用中會碰到各種各樣的網絡模型,這時,我們就需要一些實用工具來幫助我們定義模型了。這裡以 Resnet34 為例介紹「複雜」模型的定義,這部分代碼從 github 上獲取。
  • 機器學習實戰:模型評估和優化
    最簡單的機器學習回歸模型之一就是內核平滑技術。內核平滑即計算局部平均:對於每一個新的數據來說,用與其特徵值接近的訓練數據點求平均值來對其目標變量建模。唯一一個參數——寬參數,是用來控制局部平均的窗口大小。圖2演示了內核平滑窗寬參數取值不同所產生的效果。窗寬值較大時,幾乎是用所有訓練數據的平均值來預測測試集裡每個數據點的目標值。這
  • 深度學習中的正則化技術概述(附Python+keras實現代碼)
    並附python+keras實戰。關注公眾號並發送關鍵字"正則化數據集"獲取數據集下載指引,發送關鍵字"正則化代碼"獲取完整代碼。歡迎大家點擊上方藍字關注我們的公眾號:磐創AI。介紹數據科學研究者們最常遇見的問題之一就是怎樣避免過擬合。
  • [Hulu百面機器學習]python實戰系列(2.7)——過擬合和欠擬合
    每期更新的定價會根據實際情況調整。當然自己也會更加注重原創,尊重人家葫蘆娃的版權!Q1: 在評估模型過程中,過擬合和欠擬合具體是指什麼樣的現象?欠擬合指的是訓練集表現就已經比較差的情況了,泛化能力強的模型訓練集的誤差剛好介於過擬合和欠擬合之間。Q2: 能否說出集中降低模型過擬合和欠擬合風險的辦法?(1⭐)從數據入手,獲得更多訓練數據。更多數據能讓模型學到更多特徵,噪音就更小。
  • 豬臉識別(附數據集)
    (2)數據預處理: data argumentation。包括數據類型轉換(float32)、在圖像中按一定長寬比和面積比crop圖像區域、隨機左右翻轉、隨機顏色變換、擴大像素區間範圍。(3)網絡訓練: 基礎網絡選擇Inception-ResNet-v2 ,softmax交叉熵損失函數(要區別30頭豬),batchsize是28,優化器選擇adam,學習率0.01,訓練80個epoch後,降為0.0001微調網絡。在訓練這一階段,主要是調節網絡優化器及參數,觀察是否過擬合等,選擇訓練最好的模型。
  • 圖像超解析度重建算法,讓模糊圖像變清晰(附數據和代碼)
    概念圖像解析度是一組用於評估圖像中蘊含細節信息豐富程度的性能參數,包括時間解析度、空間解析度及色階解析度等,體現了成像系統實際所能反映物體細節信息的能力。相較於低解析度圖像,高解析度圖像通常包含更大的像素密度、更豐富的紋理細節及更高的可信賴度。
  • cnocr:用來做中文OCR的Python3包,裝上就能用!
    cnocr.consts中內置了兩個候選集合:(1) 數字和標點 NUMBERS;(2) 英文字母、數字和標點 ENG_LETTERS。root: 模型文件所在的根目錄。每個參數都有默認取值,所以可以不傳入任何參數值進行初始化:ocr = CnOcr()。類CnOcr主要包含三個函數,下面分別說明。
  • 海量中文語料上預訓練ALBERT模型:參數更少,效果更好
    2)跨層參數共享 Cross-Layer Parameter Sharing 參數共享能顯著減少參數。共享可以分為全連接層、注意力層的參數共享;注意力層的參數對效果的減弱影響小一點。3)段落連續性任務 Inter-sentence coherence loss.
  • Flask 和 Google App Engine 部署模型服務
    本文項目代碼 方式:關注微信公眾號 datayx  然後回復  服務  即可獲取。AI項目體驗地址 https://loveai.tech本文方案的模型部署和服務調用框架如下圖所示:Flask 服務和 AJAX 調用Flask 服務封裝為了將模型代碼和 Flask 服務進行整合,首先假設你已經對模型部分代碼做了完美的封裝 🕶,整個工程先叫做 model-serving-demo 吧。整理一下代碼的目錄結構,給一個我中意的 Python 目錄結構風格:
  • 基於yolo5工地安全帽和禁入危險區域識別系統,附數據集
    /models 下選擇一個你需要的模型然後複製一份出來,將文件開頭的 nc = 修改為數據集的分類數,下面是借鑑 ./data/gen_data/merge_data.py 中的自己數據集標籤所在的路徑,執行這個python腳本,會進行 person 類型的合併閱讀過本文的人還看了以下文章:TensorFlow 2.0深度學習案例實戰
  • 自動機器學習工具全景圖:精選22種框架,解放煉丹師
    自動機器學習框架能幫助數據科學家減輕負擔,降低特徵工程和超參數調優的工作量,讓他們能花更多時間來嘗試模型架構。快速驗證可能的方案不僅能讓數據科學家很快地評估目標數據集,也能提供基準性能用以改進。本文儘可能全面地介紹現有的自動機器學習框架,也附上了對應的代碼地址。綜述我們對現有的自動機器學習開源框架展開了充分調研,它們一般作用於機器學習的單個或多個步驟。
  • 深度學習超參數調優實戰
    超參數搜索策略既然已經明白了超參數搜索的重要性和緊迫性,那麼我們一起來看一下超參數搜索的常用策略。主要包含以下幾種:(1)(2)3、超參數搜索實戰實驗數據:California Housing dataset 房價預測數據(1)手動參數搜索實現首先先來看看最原始的手動參數搜索的實現方式。
  • 在機器學習回歸問題中,你應該使用哪種評估指標?
    簡而言之,讓我們看看調整後的R²和機器學習與統計數據。調整後的R²說明增加了更多的預測變量(特徵)。當一個新的預測變量對模型性能的改善超過預期時,調整後的R²只會隨著該變量的增加而增加。調整後的R²有助於您集中精力使用最節省的模型。😉調整後的R²在統計推斷中比在機器學習中更常見。scikitlearn是用於機器學習的主要Python庫,甚至沒有調整過的R²度量。Statsmodels是Python的主要統計庫。如果您想進一步了解何時使用哪個Python庫進行數據科學,我在這裡編寫了一個指南。
  • 用PyTorch實現各種GANs(附論文和代碼地址)
    在原先圖像質量評估標準的基礎上,我們擴展了兩個新的評估條件,分別用於分析圖像合成模型中樣本的可變性和多樣性。分析表明,高解析度樣本圖像中含有的分類信息在低解析度圖像中不存在。在ImageNet的1000個類別中,128×128的圖像樣本的可辨別性是人工調整的32×32的樣本圖像的兩倍。此外,84.7%的類別具有與真實ImageNet數據集相媲美的樣本。
  • 機器學習|模型選擇之劃分數據集及Sklearn實現
    也就是說測試誤差是用來評估模型對於新樣本的學習能力,因此我們更關注的是測試誤差,我們希望模型可以從現有的數據中學習到普遍規律而用於新樣本。 因此我們需要將現有數據集(data set)劃分為訓練集(training set)和測試集(test set),其中訓練集用來訓練模型,而測試集用來驗證模型對新樣本的判別能力。
  • 基於Keras框架實現加入Attention與BiRNN的機器翻譯模型
    由於該模型的訓練語料過少(僅有13W,是個小語料),而模型待學習參數較多,且本身我的機器也不足以訓練大型語料,因此我並沒有劃分train和val,以下所有的評估都將在train上進行評估,因此評估的結果並不能客觀反映模型的好壞,僅提供模型思路。我們可以隨機選取幾個樣本進行翻譯,並可視化其Attention層的結果,來進一步了解Attention在翻譯過程中到底是如何工作的。
  • 模型秒變API只需一行代碼,支持TensorFlow等框架
    還在為機器學習模型打包成 API 發愁?這個工具能讓你一行代碼直接打包。
  • 自製人臉數據,利用keras庫訓練人臉識別模型
    導致這種現象的原因是模型的參數很多,但訓練樣本太少,導致模型擬合過度。為了解決這個問題,Dropout層將有意識的隨機減少模型參數,讓模型變得簡單,而越簡單的模型越不容易產生過擬合。代碼中Dropout()函數只有一個輸入參數——指定拋棄比率,範圍為0~1之間的浮點數,其實就是百分比。這個參數亦是一個可調參數,我們可以根據訓練結果調整它以達到更好的模型成熟度。
  • 模型評估和性能度量
    模型評估方法主要是為了通過分配訓練集和測試集來估算模型在未知數據集中的泛化能力,以此調整參數或選擇模型;性能度量主要是通過設立的不同指標,從各方面衡量模型的性能,如模型預測的精確性等。大白話來說,就是如何評價機器學習模型好不好。由於各類方法和指標的概念較多,因此現實中許多人錯誤理解或使用相關概念,從而造成了一些事與願違的案例。