雖然scikit-learn在機器學習領域很重要,但是很多人并不知道利用這個庫中的一些強大的功能。本文将介紹scikit-learn中5個最有用的5個隐藏的瑰寶,充分利用這些秘密武器将有效提高你的機器學習處理的效率!
1、資料集生成器
Scikit-learn有很多資料集生成器,可以用來生成各種複雜度和次元的人工資料集。
例如,
make_blobs
函數可以建立包含很多資料樣本、聚類中心、次元的“blobs”或資料聚類。可視化以後可以清晰看出樣本的分布:

Scikit-learn其實提供了很多資料集建立函數:
- make_moons(n_samples=100, noise=0.1)
- make_circles(n_samples=100, noise=0.05)
- make_regression(n_samples=100, n_features=1, noise=15)
- make_classification(n_samples=100)
2、流水線/Pipeline
流水線可以将不同的方法組合為單一模型,在自然語言處理(NLP)應用中這一點非常重要。可以通過組合多個模型的方式來建立流水線,資料将依次流過聚合模型中的各環節。流水線有标準的拟合與預測能力,這使得訓練過程得到很好的組織。
很多對象都可以整合進流水線:
- 缺失值處理器/Imputers:如果你的資料中包含缺失的資料,可以試試Simple Imputer或KNN Imputer
- 編碼器/Encoders:如果你的資料不是二進制分類,你可能需要使用一個Label Encoder或者One-Hot Encoder
- NLP矢量化處理器/NLP Vectorizers:如果你在處理NLP資料,那麼可以使用Count Vectorizer、TD-IDF Vectorize或者Hash Vectorizer
- 數值變換:可以嘗試标準化處理器、min-max縮放等等
3、網格搜尋/GridSearchCV
在機器學習中的一個常見任務就是找出模型的正确參數集。通常你可以基于對任務的了解猜測參數的取值,或者程式設計找出最優集合。sklearn内置了函數GridSearchCV可以自動找出最優參數集。
GridSearchCV對象需要兩個參數:首先是要訓練的模型對象,例如下面示例中的SVM分類器,第二個則是一個描述參數模型的字典,字典的每一個鍵對應模型的一個參數,鍵值則是可能取值的清單。
from sklearn import svm, datasets
from sklearn.model_selection import GridSearchCV
iris = datasets.load_iris()
parameters = {'kernel':('linear', 'rbf'), 'C':[1, 10]}
svc = svm.SVC()
clf = GridSearchCV(svc, parameters)
clf.fit(iris.data, iris.target)
clf.best_params_ #[Output]: {'C': 1, 'kernel': 'linear'}
網格搜尋完成後,best_params屬性中就記錄了表現最好的模型參數。
4、驗證曲線/validation_curve
要可視化一個參數對模型性能的影響,可以使用sklearn的validation_curve。這個函數需要一些參數 —— 模型、要調整的參數、參數的取值範圍、運作的次數等。validation_curve類似于單變量的網格搜尋,可以幫助你更好的可視化單個參數變化的效果。
from sklearn.model_selection import validation_curve
train_scores, valid_scores = validation_curve(model,
X, y,
"max_depth", #model parameter to be adjusted
range(2,7), #values of the parameter
cv=10) #number of folds for k-fold evaluation
train_scores value: #Rows: number of parameter values (4), Columns: each of the values for the folds (10)
array([[0.96296296, 0.95555556, 0.96296296, 0.97037037, 0.95555556,
0.95555556, 0.95555556, 0.96296296, 0.97037037, 0.96296296],
[0.97037037, 0.97037037, 0.97777778, 0.98518519, 0.97037037,
0.97037037, 0.97037037, 0.97037037, 0.97777778, 0.97777778],
[0.99259259, 0.99259259, 0.99259259, 1. , 0.99259259,
0.99259259, 0.99259259, 1. , 0.99259259, 0.99259259],
[1. , 1. , 1. , 1. , 1. ,
1. , 1. , 1. , 0.99259259, 1. ],
[1. , 1. , 1. , 1. , 1. ,
1. , 1. , 1. , 1. , 1. ]])
validation_curve輸出的結構是一個元組 —— 一個表示訓練得分,另一個表示測試得分。數組中的每個元素表示k次運作中的一個參數值。
當繪制結果後,參數和精确度之間的關系就很清晰了:
import matplotlib.pyplot as plt
import seaborn as sns
sns.set_palette('RdYlGn')
sns.set_style('whitegrid')
params = range(2,10)
for index,param in enumerate(train_scores):
sns.lineplot(range(10),param,label=params[index])
plt.title("Tree Depth Impact on Training Accuracy")
plt.xlabel("CV-Fold")
plt.ylabel("Training Accuracy")
plt.show()
這讓我們可以可視化樹的深度對準确度的影響。從上圖中可以看到樹深度為5或6時,模型的性能相當好,但是再繼續增加深度就會導緻過拟合。
K折交叉驗證
交叉驗證是一種準确度高于train_test_split的方法,并且通常需要更少的代碼。在傳統的訓練/測試集拆分中,資料樣本被随機的配置設定到訓練集和測試集,通常比例為7:3~8:2,在訓練集上訓練模型,然後在測試集上評估模型,以確定模型真正泛化而非單純的記憶。
然而由于每次分割是随機的,分割10次将産生10個不同的測試結果。
為了解決這個問題,K折交叉驗證将資料拆分為K類,在其中K-1個子集上訓練模型,在剩下的1個子集上測試模型。重複這一過程直至測試子集最終覆寫完整的資料集,那麼就得到了完整并且可信的準确度名額。這種方法更好的一點是,不需要跟蹤x-train、x-test、y-train和y-test變量。交叉驗證唯一的缺點是需要更多時間 —— 不過要得到更好的結果總是要多付出一點成本。
原文連結:
scikit-learn中的5個隐藏的瑰寶 — 彙智網