【机器学习】Auto-Sklearn:使用 AutoML 加速你的机器学习模型
AutoML 是機(jī)器學(xué)習(xí)中一個(gè)相對(duì)較新的領(lǐng)域,它主要將機(jī)器學(xué)習(xí)中所有耗時(shí)過(guò)程自動(dòng)化,如數(shù)據(jù)預(yù)處理、最佳算法選擇、超參數(shù)調(diào)整等,這樣可節(jié)約大量時(shí)間在建立機(jī)器學(xué)習(xí)模型過(guò)程中。
今天我將用一個(gè)簡(jiǎn)單的示例來(lái)全面講解 AutoML 工具:Auto-Sklearn,相信你會(huì)愛(ài)上這個(gè)這么省心的工具。
Auto-Sklearn 簡(jiǎn)介
熟悉機(jī)器學(xué)習(xí)的人都知道 scikit-learn,這是著名的 python 包,由不同的分類和回歸算法組成,用于構(gòu)建機(jī)器學(xué)習(xí)模型。
Auto-Sklearn 是一個(gè)基于 Python 的開源工具包,用于執(zhí)行 AutoML,它采用著名的 Scikit-Learn 機(jī)器學(xué)習(xí)包進(jìn)行數(shù)據(jù)處理和機(jī)器學(xué)習(xí)算法。在本文中,我們將了解如何利用 Auto-Sklearn 進(jìn)行分類和回歸任務(wù)。
讓我們先安裝 Auto-Sklearn 包
pip?install?auto-sklearn現(xiàn)在我們已經(jīng)安裝了 AutoML 工具,我們將導(dǎo)入用于預(yù)處理數(shù)據(jù)集和可視化的基本包。
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分類任務(wù)
我們將使用 UCI 存儲(chǔ)庫(kù)中提供的心臟病預(yù)測(cè)數(shù)據(jù)集。為方便起見(jiàn),讓我們使用來(lái)自 Kaggle 的數(shù)據(jù)的.csv 版本。你還可以使用其他分類數(shù)據(jù)集。
數(shù)據(jù)集詳細(xì)信息:該數(shù)據(jù)集包含 303 個(gè)樣本和 14 個(gè)屬性(原始數(shù)據(jù)集有76個(gè)特征,而.csv 版本有原始數(shù)據(jù)集的14個(gè)子集)。
導(dǎo)入數(shù)據(jù)集
df=pd.read_csv('/content/heart.csv') df.head()讓我們檢查數(shù)據(jù)集中的目標(biāo)變量"target"
df['target'].value_counts()只有兩類(0=健康,1=心臟病),所以這是一個(gè)二元分類問(wèn)題。此外,還表明這是一個(gè)不平衡的數(shù)據(jù)集。因此,該模型的準(zhǔn)確度得分將不太可靠。
但是,我們將首先通過(guò)將不平衡數(shù)據(jù)集直接饋送到 autosklearn 分類器來(lái)測(cè)試它。稍后我們將調(diào)整這兩個(gè)類的樣本數(shù)量并測(cè)試準(zhǔn)確率,看看分類器的表現(xiàn)如何。
#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接下來(lái),我們將使用以下命令從 autosklearn 導(dǎo)入分類模型。
import?autosklearn.classification然后我們將為分類任務(wù)創(chuàng)建一個(gè) AutoSklearnClassifier 的實(shí)例。
automl?=?autosklearn.classification.AutoSklearnClassifier(?time_left_for_this_task=5*60,per_run_time_limit=30,tmp_folder='/temp/autosklearn_classification_example_tmp')說(shuō)明一下,在這里我們使用time_left_for_this_task參數(shù)設(shè)置此任務(wù)的最長(zhǎng)時(shí)間,并為其分配5分鐘。如果沒(méi)有為此參數(shù)指定任何內(nèi)容,則該過(guò)程將運(yùn)行一個(gè)小時(shí),即60分鐘。使用per_run_time_limit參數(shù)將分配給每個(gè)模型評(píng)估的時(shí)間設(shè)置為 30 秒。
此外,還有其他參數(shù),如n_jobs(并行作業(yè)數(shù))、ensemble_size、initial_configurations_via_metalearning,可用于微調(diào)分類器。默認(rèn)情況下,上述搜索命令會(huì)創(chuàng)建一組表現(xiàn)最佳的模型。為了避免過(guò)度擬合,我們可以通過(guò)更改設(shè)置ensemble_size = 1和initial_configurations_via_metalearning = 0來(lái)禁用它。我們?cè)谠O(shè)置分類器時(shí)排除了這些以保持方法的簡(jiǎn)單。
我們還將提供一個(gè)臨時(shí)的日志保存路徑,我們可以在以后使用它來(lái)打印運(yùn)行詳細(xì)信息。
現(xiàn)在,我們將擬合分類器
automl.fit(X_train,?y_train)sprint_statistics()函數(shù)總結(jié)了上述搜索和選擇的最佳模型的性能。
pprint(automl.sprint_statistics())我們還可以使用以下命令為搜索考慮的所有模型打印排行榜
print(automl.leaderboard())分類器選擇的前兩個(gè)模型分別是隨機(jī)森林和 Passive_aggressive。
此外,我們可以使用以下命令打印有關(guān)所考慮模型的信息:
pprint(automl.show_models())我們還可以打印集成的最終分?jǐn)?shù)和混淆矩陣。
#?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)我們可以使用以下命令來(lái)分離數(shù)據(jù)集中的健康和不健康樣本
from?sklearn.utils?import?resample healthy=?df[df["target"]==0] unhealthy=df[df["target"]==1]隨著不健康樣本的數(shù)量越來(lái)越多,我們將使用重采樣技術(shù)(過(guò)采樣)并增加數(shù)據(jù)集中健康個(gè)體的樣本。要調(diào)整偏斜,我們可以使用以下命令
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、集成學(xué)習(xí)(bagging、boosting)、NearMiss 算法等技術(shù)來(lái)解決數(shù)據(jù)集中的不平衡問(wèn)題。此外,我們可以使用 F1-score、精度和召回等指標(biāo)來(lái)評(píng)估模型的性能。
現(xiàn)在我們已經(jīng)調(diào)整了傾斜,我們將再次創(chuàng)建 X 和 y 集進(jìn)行分類。讓我們將它們命名為 X1 和 y1 以避免混淆。
X1=up_sampled.drop(['target'],axis=1) y1=up_sampled['target']我們需要重復(fù)從設(shè)置分類器到為這個(gè)新的 X1 和 y1 打印混淆矩陣的所有步驟。
最后,我們可以使用以下方法比較偏斜數(shù)據(jù)和調(diào)整數(shù)據(jù)的兩種準(zhǔn)確度
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()從上圖中,模型精度在過(guò)采樣后略有下降,我們可以看到模型現(xiàn)在優(yōu)化得更好。盡管我們使用了很多額外的命令來(lái)預(yù)處理數(shù)據(jù)和評(píng)估結(jié)果,但運(yùn)行 AutoSklearn 分類器只需要一行代碼。即使有傾斜的數(shù)據(jù),模型實(shí)現(xiàn)的準(zhǔn)確性也非常好。
回歸任務(wù)
現(xiàn)在我們將在本節(jié)中使用來(lái)自 AutoSklearn 的回歸模型。
對(duì)于這項(xiàng)任務(wù),讓我們使用 seaborn 數(shù)據(jù)集庫(kù)中的簡(jiǎn)單"航班"數(shù)據(jù)集。我們將使用以下命令加載數(shù)據(jù)集。
#loading?the?dataset df?=?sns.load_dataset('flights') df.head()數(shù)據(jù)集詳情:該數(shù)據(jù)集包含144行3列,分別為年、月、旅客人數(shù)。
這里的任務(wù)是使用其他兩個(gè)特征來(lái)預(yù)測(cè)乘客數(shù)量。
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我們現(xiàn)在使用 autosklearnregressor 來(lái)完成這個(gè)回歸任務(wù)。
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現(xiàn)在,讓我們看一下模型的統(tǒng)計(jì)數(shù)據(jù)
#?summarize print(automl.sprint_statistics())從上面總結(jié)中,我們了解到回歸器一共跑了 59 個(gè)模型,最終回歸模型的計(jì)算性能為 0.985 的 R2,相當(dāng)不錯(cuò)。
由于回歸器默認(rèn)優(yōu)化了 R2 指標(biāo),讓我們打印平均絕對(duì)誤差來(lái)更好地評(píng)估模型的性能。
#?evaluate?the?best?model y_pred?=?automl.predict(X_test) mae?=?mean_absolute_error(y_test,?y_pred) print("MAE:?%.3f"?%?mae)從模型實(shí)現(xiàn)的 R2 值和用于此任務(wù)的示例數(shù)據(jù)集的大小來(lái)看,平均絕對(duì)誤差是可以接受的。
我們還可以使用 matplotlib 繪制預(yù)測(cè)值與實(shí)際值,如下所示
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()總的來(lái)說(shuō),可以說(shuō)MAE值很小,模型取得了很高的驗(yàn)證分?jǐn)?shù),為0.985,說(shuō)明模型性能不錯(cuò)。
保存訓(xùn)練好的模型。
上面訓(xùn)練的分類和回歸模型可以使用 python 包 Pickle 和 JobLib 保存。然后可以使用這些保存的模型直接對(duì)新數(shù)據(jù)進(jìn)行預(yù)測(cè)。我們可以將模型保存為:
1、Pickle
import?pickle #?save?the?model? filename?=?'final_model.sav'? pickle.dump(model,?open(filename,?'wb'))這里的"wb"參數(shù)意味著我們正在以二進(jìn)制模式將文件寫入磁盤。此外,我們可以將此保存的模型加載為:
#load?the?model loaded_model?=?pickle.load(open(filename,?'rb')) result?=?loaded_model.score(X_test,?Y_test) print(result)這里的"rb"命令表示我們正在以二進(jìn)制模式讀取文件
2、JobLib 同樣,我們可以使用以下命令將訓(xùn)練好的模型保存在 JobLib 中。
import?joblib #?save?the?model? filename?=?'final_model.sav' joblib.dump(model,?filename)我們還可以稍后重新加載這些保存的模型,以預(yù)測(cè)新數(shù)據(jù)。
#?load?the?model?from?disk load_model?=?joblib.load(filename) result?=?load_model.score(X_test,?Y_test) print(result)結(jié)論
在本文中,我們看到了Auto-Sklearn在分類和回歸模型中的應(yīng)用。對(duì)于這兩個(gè)任務(wù),我們不需要指定特定的算法。
相反,該工具本身迭代了幾種內(nèi)置算法并取得了良好的結(jié)果(分類模型的準(zhǔn)確性更高,回歸模型的平均絕對(duì)誤差更低)。
因此,AutoSklearn 可以成為使用幾行代碼構(gòu)建更好的機(jī)器學(xué)習(xí)模型的寶貴工具。
往期精彩回顧適合初學(xué)者入門人工智能的路線及資料下載(圖文+視頻)機(jī)器學(xué)習(xí)入門系列下載中國(guó)大學(xué)慕課《機(jī)器學(xué)習(xí)》(黃海廣主講)機(jī)器學(xué)習(xí)及深度學(xué)習(xí)筆記等資料打印《統(tǒng)計(jì)學(xué)習(xí)方法》的代碼復(fù)現(xiàn)專輯 AI基礎(chǔ)下載機(jī)器學(xué)習(xí)交流qq群955171419,加入微信群請(qǐng)掃碼:總結(jié)
以上是生活随笔為你收集整理的【机器学习】Auto-Sklearn:使用 AutoML 加速你的机器学习模型的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: Chorme控制台console的用法;
- 下一篇: 【Python】20个Pandas数据实