【機器學習基礎】關(guān)于Scikit-Learn,你不一定知道的10件事
作者:Rebecca Vickery??編譯:ronghuaiyang
Scikit-learn中有很多方便的功能,你不一定知道。

Scikit-learn是使用最廣泛的Python機器學習庫之一。它有一個標準化和簡單的接口用來預處理數(shù)據(jù)和進行模型的訓練,優(yōu)化和評估。
該項目最初是由David Cournapeau開發(fā)的谷歌Summer of Code項目,并在2010年首次公開發(fā)布。自創(chuàng)建以來,這庫已經(jīng)發(fā)展成為一個豐富的生態(tài)系統(tǒng),用于開發(fā)機器學習模型。
隨著時間的推移,該項目開發(fā)了許多方便的功能,增強了其易用性。在本文中,我將介紹10個你可能不知道的最有用的特性。
1. Scikit-learn 有內(nèi)置的數(shù)據(jù)集
Scikit-learn API有多種內(nèi)置的toy和現(xiàn)實世界數(shù)據(jù)集。只需一行代碼就可以訪問這些函數(shù),如果你正在學習或只是想快速嘗試一些新功能,那么它們非常有用。
你還可以使用生成器方便地為回歸make_regression()、聚類make_blobs()以及分類make_classification()生成合成數(shù)據(jù)集。
所有的加載工具都提供了返回已經(jīng)分割成X(特征)和y(目標)的數(shù)據(jù)的選項,這樣就可以直接使用它們來訓練模型。
#?Toy?regression?data?set?loading
from?sklearn.datasets?import?load_boston
X,y?=?load_boston(return_X_y?=?True)
#?Synthetic?regresion?data?set?loading
from?sklearn.datasets?import?make_regression
X,y?=?make_regression(n_samples=10000,?noise=100,?random_state=0)
2. 第三方公開數(shù)據(jù)集獲取也很方便
如果你想通過Scikit-learn直接訪問更多公開可用的數(shù)據(jù)集,有一個方便的函數(shù)可以讓你直接從openml.org網(wǎng)站導入數(shù)據(jù)。這個網(wǎng)站包含超過21,000種不同的數(shù)據(jù)集,用于機器學習項目。
from?sklearn.datasets?import?fetch_openml
X,y?=?fetch_openml("wine",?version=1,?as_frame=True,?return_X_y=True)
3. 有現(xiàn)成的分類器來訓練基線模型
在開發(fā)機器學習模型時,明智的做法是首先創(chuàng)建一個基線模型。這個模型本質(zhì)上應該是一個“偽”模型,比如總是預測最經(jīng)常出現(xiàn)的類。這為你的“智能”模型提供了一個基準,這樣你就可以確保它比隨機結(jié)果表現(xiàn)得更好。
Scikit-learn中包含用于分類任務的 DummyClassifier()和用于回歸問題的DummyRegressor()。
from?sklearn.dummy?import?DummyClassifier
#?Fit?the?model?on?the?wine?dataset?and?return?the?model?score
dummy_clf?=?DummyClassifier(strategy="most_frequent",?random_state=0)
dummy_clf.fit(X,?y)
dummy_clf.score(X,?y)
4. Scikit-learn 有自己的繪圖 API
Scikit-learn有一個內(nèi)置的繪圖API,它允許你在不導入任何其他庫的情況下可視化模型性能。包括下列繪圖功能:部分依賴圖、混淆矩陣、精確度召回率曲線和ROC曲線。
import?matplotlib.pyplot?as?plt?
from?sklearn?import?metrics,?model_selection
from?sklearn.ensemble?import?RandomForestClassifier
from?sklearn.datasets?import?load_breast_cancer
X,y?=?load_breast_cancer(return_X_y?=?True)
X_train,?X_test,?y_train,?y_test?=?model_selection.train_test_split(X,?y,?random_state=0)
clf?=?RandomForestClassifier(random_state=0)
clf.fit(X_train,?y_train)
metrics.plot_roc_curve(clf,?X_test,?y_test)
plt.show()

5. Scikit-learn 具有內(nèi)置的特征選擇方法
提高模型性能的一種方法是只使用最好的特征集來訓練模型,或者去除冗余的特征。這個過程稱為特征選擇。
Scikit-learn有許多函數(shù)來進行feature selection。其中一個是SelectPercentile()。該方法根據(jù)所選擇的統(tǒng)計方法選擇表現(xiàn)最好的X百分位特征進行評分。
from?sklearn?import?model_selection
from?sklearn.ensemble?import?RandomForestClassifier
from?sklearn.datasets?import?load_wine
from?sklearn.pipeline?import?Pipeline
from?sklearn.preprocessing?import?StandardScaler
from?sklearn.feature_selection?import?SelectPercentile,?chi2
X,y?=?load_wine(return_X_y?=?True)
X_trasformed?=?SelectPercentile(chi2,?percentile=60).fit_transform(X,?y)
6. Pipelines 可以讓你把所有的機器學習工作流串到一起
除了為機器學習提供廣泛的算法,Scikit-learn也有一系列的預處理和數(shù)據(jù)變換的功能。為了便于機器學習工作流的重現(xiàn)性和簡單性,Scikit-learn創(chuàng)建了**pipeline **,它允許你將大量的預處理步驟與模型訓練階段鏈接在一起。
pipeline將工作流中的所有步驟存儲為單個實體,可以通過fit和predict方法調(diào)用。在pipeline對象上調(diào)用fit方法時,將自動執(zhí)行預處理步驟和模型訓練。
from?sklearn?import?model_selection
from?sklearn.ensemble?import?RandomForestClassifier
from?sklearn.datasets?import?load_breast_cancer
from?sklearn.pipeline?import?Pipeline
from?sklearn.preprocessing?import?StandardScaler
X,y?=?load_breast_cancer(return_X_y?=?True)
X_train,?X_test,?y_train,?y_test?=?model_selection.train_test_split(X,?y,?random_state=0)
#?Chain?together?scaling?the?variables?with?the?model
pipe?=?Pipeline([('scaler',?StandardScaler()),?('rf',?RandomForestClassifier())])
pipe.fit(X_train,?y_train)
pipe.score(X_test,?y_test)
7. 使用ColumnTransformer,你可以對不同的特征應用不同的預處理
在許多數(shù)據(jù)集中,你將擁有不同類型的特征,需要應用不同的預處理步驟。例如,數(shù)據(jù)集中可能混合有分類數(shù)據(jù)和數(shù)值數(shù)據(jù),你可能希望通過獨熱編碼將分類數(shù)據(jù)轉(zhuǎn)換為數(shù)值數(shù)據(jù)并縮放數(shù)值變量。
Scikit-learn pipeline中有一個函數(shù)ColumnTransformer,可以讓你非常容易地通過索引或通過指定的列名來指定哪些列應用最合適的預處理。
from?sklearn?import?model_selection
from?sklearn.linear_model?import?LinearRegression
from?sklearn.datasets?import?fetch_openml
from?sklearn.compose?import?ColumnTransformer
from?sklearn.pipeline?import?Pipeline
from?sklearn.impute?import?SimpleImputer
from?sklearn.preprocessing?import?StandardScaler,?OneHotEncoder
#?Load?auto93?data?set?which?contains?both?categorical?and?numeric?features
X,y?=?fetch_openml("auto93",?version=1,?as_frame=True,?return_X_y=True)
#?Create?lists?of?numeric?and?categorical?features??
numeric_features?=?X.select_dtypes(include=['int64',?'float64']).columns
categorical_features?=?X.select_dtypes(include=['object']).columns
X_train,?X_test,?y_train,?y_test?=?model_selection.train_test_split(X,?y,?random_state=0)
#?Create?a?numeric?and?categorical?transformer?to?perform?preprocessing?steps
numeric_transformer?=?Pipeline(steps=[
????('imputer',?SimpleImputer(strategy='median')),
????('scaler',?StandardScaler())])
categorical_transformer?=?Pipeline(steps=[
????('imputer',?SimpleImputer(strategy='constant',?fill_value='missing')),
????('onehot',?OneHotEncoder(handle_unknown='ignore'))])
#?Use?the?ColumnTransformer?to?apply?to?the?correct?features
preprocessor?=?ColumnTransformer(
????transformers=[
????????('num',?numeric_transformer,?numeric_features),
????????('cat',?categorical_transformer,?categorical_features)])
#?Append?regressor?to?the?preprocessor
lr?=?Pipeline(steps=[('preprocessor',?preprocessor),
??????????????????????('classifier',?LinearRegression())])
#?Fit?the?complete?pipeline
lr.fit(X_train,?y_train)
print("model?score:?%.3f"?%?lr.score(X_test,?y_test))
8. 你可以簡單的輸出一個HTML來表示你的pipeline
pipeline通常非常復雜,特別是在處理真實數(shù)據(jù)時。因此,Scikit-learn提供了一個方法來輸出pipeline中步驟的HTML圖,這非常方便。
from?sklearn?import?set_config
set_config(display='diagram')???
lr

9. 有一個繪圖函數(shù)來可視化決策樹
plot_tree()函數(shù)允許你創(chuàng)建一個決策樹模型中的步驟圖。
import?matplotlib.pyplot?as?plt?
from?sklearn?import?metrics,?model_selection
from?sklearn.tree?import?DecisionTreeClassifier,?plot_tree
from?sklearn.datasets?import?load_breast_cancer
X,y?=?load_breast_cancer(return_X_y?=?True)
X_train,?X_test,?y_train,?y_test?=?model_selection.train_test_split(X,?y,?random_state=0)
clf?=?DecisionTreeClassifier()
clf.fit(X_train,?y_train)
plot_tree(clf,?filled=True)
plt.show()

10. 有許多第三方的庫可以擴展Scikit-learn的功能
許多第三方庫都可以使用Scikit-learn并擴展其功能。其中兩個例子包括category-encoders庫,它為分類特征提供了更廣泛的預處理方法,以及ELI5庫,用于更好的模型可解釋性。
這兩個包也可以直接在Scikit-learn pipeline中使用。

英文原文:https://towardsdatascience.com/10-things-you-didnt-know-about-scikit-learn-cccc94c50e4f
往期精彩回顧
獲取一折本站知識星球優(yōu)惠券,復制鏈接直接打開:
https://t.zsxq.com/yFQV7am
本站qq群1003271085。
加入微信群請掃碼進群:
