【机器学习】Auto-Sklearn:使用 AutoML 加速你的机器学习模型
AutoML 是機器學習中一個相對較新的領域,它主要將機器學習中所有耗時過程自動化,如數據預處理、最佳算法選擇、超參數調整等,這樣可節約大量時間在建立機器學習模型過程中。
今天我將用一個簡單的示例來全面講解 AutoML 工具:Auto-Sklearn,相信你會愛上這個這么省心的工具。
Auto-Sklearn 簡介
熟悉機器學習的人都知道 scikit-learn,這是著名的 python 包,由不同的分類和回歸算法組成,用于構建機器學習模型。
Auto-Sklearn 是一個基于 Python 的開源工具包,用于執行 AutoML,它采用著名的 Scikit-Learn 機器學習包進行數據處理和機器學習算法。在本文中,我們將了解如何利用 Auto-Sklearn 進行分類和回歸任務。
讓我們先安裝 Auto-Sklearn 包
pip?install?auto-sklearn現在我們已經安裝了 AutoML 工具,我們將導入用于預處理數據集和可視化的基本包。
import?pandas?as?pd import?numpy?as?np import?matplotlib.pyplot?as?plt import?seaborn?as?sns from?sklearn.model_selection?import?train_test_split分類任務
我們將使用 UCI 存儲庫中提供的心臟病預測數據集。為方便起見,讓我們使用來自 Kaggle 的數據的.csv 版本。你還可以使用其他分類數據集。
數據集詳細信息:該數據集包含 303 個樣本和 14 個屬性(原始數據集有76個特征,而.csv 版本有原始數據集的14個子集)。
導入數據集
df=pd.read_csv('/content/heart.csv') df.head()讓我們檢查數據集中的目標變量"target"
df['target'].value_counts()只有兩類(0=健康,1=心臟病),所以這是一個二元分類問題。此外,還表明這是一個不平衡的數據集。因此,該模型的準確度得分將不太可靠。
但是,我們將首先通過將不平衡數據集直接饋送到 autosklearn 分類器來測試它。稍后我們將調整這兩個類的樣本數量并測試準確率,看看分類器的表現如何。
#creating?X?and?y? X=df.drop(['target'],axis=1) y=df['target'] #split?into?train?and?test?sets X_train,?X_test,?y_train,?y_test=?train_test_split(X,y,?test_size=0.2,?random_state=42) X_train.shape,?X_test.shape,y_train.shape,?y_test.shape接下來,我們將使用以下命令從 autosklearn 導入分類模型。
import?autosklearn.classification然后我們將為分類任務創建一個 AutoSklearnClassifier 的實例。
automl?=?autosklearn.classification.AutoSklearnClassifier(?time_left_for_this_task=5*60,per_run_time_limit=30,tmp_folder='/temp/autosklearn_classification_example_tmp')說明一下,在這里我們使用time_left_for_this_task參數設置此任務的最長時間,并為其分配5分鐘。如果沒有為此參數指定任何內容,則該過程將運行一個小時,即60分鐘。使用per_run_time_limit參數將分配給每個模型評估的時間設置為 30 秒。
此外,還有其他參數,如n_jobs(并行作業數)、ensemble_size、initial_configurations_via_metalearning,可用于微調分類器。默認情況下,上述搜索命令會創建一組表現最佳的模型。為了避免過度擬合,我們可以通過更改設置ensemble_size = 1和initial_configurations_via_metalearning = 0來禁用它。我們在設置分類器時排除了這些以保持方法的簡單。
我們還將提供一個臨時的日志保存路徑,我們可以在以后使用它來打印運行詳細信息。
現在,我們將擬合分類器
automl.fit(X_train,?y_train)sprint_statistics()函數總結了上述搜索和選擇的最佳模型的性能。
pprint(automl.sprint_statistics())我們還可以使用以下命令為搜索考慮的所有模型打印排行榜
print(automl.leaderboard())分類器選擇的前兩個模型分別是隨機森林和 Passive_aggressive。
此外,我們可以使用以下命令打印有關所考慮模型的信息:
pprint(automl.show_models())我們還可以打印集成的最終分數和混淆矩陣。
#?Score?of?the?final?ensemble from?sklearn.metrics?import?accuracy_score m1_acc_score=?accuracy_score(y_test,?y_pred) m1_acc_score from?sklearn.metrics?import?confusion_matrix,?accuracy_score y_pred=?automl.predict(X_test) conf_matrix=?confusion_matrix(y_pred,?y_test) sns.heatmap(conf_matrix,?annot=True)我們可以使用以下命令來分離數據集中的健康和不健康樣本
from?sklearn.utils?import?resample healthy=?df[df["target"]==0] unhealthy=df[df["target"]==1]隨著不健康樣本的數量越來越多,我們將使用重采樣技術(過采樣)并增加數據集中健康個體的樣本。要調整偏斜,我們可以使用以下命令
up_sampled=resample(healthy,?replace=True,?n_samples=len(unhealthy),?random_state=42) up_sampled=pd.concat([unhealthy,?up_sampled]) #check?updated?class?counts up_sampled['target'].value_counts()我們還可以使用SMOTE、集成學習(bagging、boosting)、NearMiss 算法等技術來解決數據集中的不平衡問題。此外,我們可以使用 F1-score、精度和召回等指標來評估模型的性能。
現在我們已經調整了傾斜,我們將再次創建 X 和 y 集進行分類。讓我們將它們命名為 X1 和 y1 以避免混淆。
X1=up_sampled.drop(['target'],axis=1) y1=up_sampled['target']我們需要重復從設置分類器到為這個新的 X1 和 y1 打印混淆矩陣的所有步驟。
最后,我們可以使用以下方法比較偏斜數據和調整數據的兩種準確度
model_eval?=?pd.DataFrame({'Model':?['skewed','adjusted'],?'Accuracy':?[m1_acc_score,m2_acc_score]}) model_eval?=?model_eval.set_index('Model').sort_values(by='Accuracy',ascending=False) fig?=?plt.figure(figsize=(12,?4)) gs?=?fig.add_gridspec(1,?2) gs.update(wspace=0.8,?hspace=0.8) ax0?=?fig.add_subplot(gs[0,?0]) sns.heatmap(model_eval,cmap="PiYG",annot=True,fmt=".1%",?linewidths=4,cbar=False,ax=ax0) plt.show()從上圖中,模型精度在過采樣后略有下降,我們可以看到模型現在優化得更好。盡管我們使用了很多額外的命令來預處理數據和評估結果,但運行 AutoSklearn 分類器只需要一行代碼。即使有傾斜的數據,模型實現的準確性也非常好。
回歸任務
現在我們將在本節中使用來自 AutoSklearn 的回歸模型。
對于這項任務,讓我們使用 seaborn 數據集庫中的簡單"航班"數據集。我們將使用以下命令加載數據集。
#loading?the?dataset df?=?sns.load_dataset('flights') df.head()數據集詳情:該數據集包含144行3列,分別為年、月、旅客人數。
這里的任務是使用其他兩個特征來預測乘客數量。
X=df.drop(["passengers"],axis=1) y=df["passengers"] X.shape,?y.shapeX_train,?X_test,?y_train,?y_test?=?train_test_split(X,?y,?test_size=0.2,?random_state=42) X_train.shape,?X_test.shape,y_train.shape,?y_test.shape我們現在使用 autosklearnregressor 來完成這個回歸任務。
import?autosklearn.regression automl?=?autosklearn.regression.AutoSklearnRegressor( time_left_for_this_task=5*60,per_run_time_limit=30,tmp_folder='/temp/autosklearn_regression_example_tmp') automl.fit(X_train,?y_train) from?sklearn.metrics?import?mean_absolute_error from?autosklearn.metrics?import?mean_absolute_error?as?auto_mean_absolute_error現在,讓我們看一下模型的統計數據
#?summarize print(automl.sprint_statistics())從上面總結中,我們了解到回歸器一共跑了 59 個模型,最終回歸模型的計算性能為 0.985 的 R2,相當不錯。
由于回歸器默認優化了 R2 指標,讓我們打印平均絕對誤差來更好地評估模型的性能。
#?evaluate?the?best?model y_pred?=?automl.predict(X_test) mae?=?mean_absolute_error(y_test,?y_pred) print("MAE:?%.3f"?%?mae)從模型實現的 R2 值和用于此任務的示例數據集的大小來看,平均絕對誤差是可以接受的。
我們還可以使用 matplotlib 繪制預測值與實際值,如下所示
plt.figure(figsize=(8,6)) plt.scatter(y_test,?y_pred,?c='blue') p1?=?max(max(y_pred),?max(y_test)) p2?=?min(min(y_pred),?min(y_test)) plt.plot([p1,?p2],?[p1,?p2],?'r-') plt.xlabel('Actual',?fontsize=10) plt.ylabel('Predicted',?fontsize=10) plt.legend(['Actual',?'Predicted']) plt.axis('equal') plt.show()總的來說,可以說MAE值很小,模型取得了很高的驗證分數,為0.985,說明模型性能不錯。
保存訓練好的模型。
上面訓練的分類和回歸模型可以使用 python 包 Pickle 和 JobLib 保存。然后可以使用這些保存的模型直接對新數據進行預測。我們可以將模型保存為:
1、Pickle
import?pickle #?save?the?model? filename?=?'final_model.sav'? pickle.dump(model,?open(filename,?'wb'))這里的"wb"參數意味著我們正在以二進制模式將文件寫入磁盤。此外,我們可以將此保存的模型加載為:
#load?the?model loaded_model?=?pickle.load(open(filename,?'rb')) result?=?loaded_model.score(X_test,?Y_test) print(result)這里的"rb"命令表示我們正在以二進制模式讀取文件
2、JobLib 同樣,我們可以使用以下命令將訓練好的模型保存在 JobLib 中。
import?joblib #?save?the?model? filename?=?'final_model.sav' joblib.dump(model,?filename)我們還可以稍后重新加載這些保存的模型,以預測新數據。
#?load?the?model?from?disk load_model?=?joblib.load(filename) result?=?load_model.score(X_test,?Y_test) print(result)結論
在本文中,我們看到了Auto-Sklearn在分類和回歸模型中的應用。對于這兩個任務,我們不需要指定特定的算法。
相反,該工具本身迭代了幾種內置算法并取得了良好的結果(分類模型的準確性更高,回歸模型的平均絕對誤差更低)。
因此,AutoSklearn 可以成為使用幾行代碼構建更好的機器學習模型的寶貴工具。
往期精彩回顧適合初學者入門人工智能的路線及資料下載(圖文+視頻)機器學習入門系列下載中國大學慕課《機器學習》(黃海廣主講)機器學習及深度學習筆記等資料打印《統計學習方法》的代碼復現專輯 AI基礎下載機器學習交流qq群955171419,加入微信群請掃碼:總結
以上是生活随笔為你收集整理的【机器学习】Auto-Sklearn:使用 AutoML 加速你的机器学习模型的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Chorme控制台console的用法;
- 下一篇: java常用class类_java常用类