做好準備:在Seaborn中可視化數據
鳶尾花數據集 (The Iris Flower dataset) 是目前仍在使用的最古老的機器學習數據集之一。它由Ronald Fisher在1936年發表,用於說明線性判別分析。問題是根據萼片和花瓣寬度和長度的測量結果對三種鳶尾花中的一種進行分類。
雖然這是一個非常簡單的問題,但基本工作流程如下:
加載數據集
可視化數據
對數據進行預處理和轉換
選擇要使用的模型
檢查模型的性能
解釋和理解模型(這個階段通常是可選的)
這是一個標準的流程模板,通常情況下,對於工業規模的問題,步驟1和2可能會比對於Kaggle競賽或UCI機器學習資源庫中的一個已經預處理過的數據集花費更長的時間(有時估計需要95%左右的時間)。我們將在後面的食譜和章節中深入探討這些步驟中每一個步驟的複雜性。
我們將假設你已經在前面安裝了這三個庫,並且你的Jupyter Notebook或Colab實例已經運行。此外,我們將使用seaborn和scikit-plot庫進行可視化,所以我們也將安裝它們。
!pip install seaborn scikit-plot使用如此知名的數據集的方便之處在於,我們可以很容易地從很多包中加載數據集,例如,像這樣。
import seaborn as snsiris = sns.load_dataset('iris')接下來我們直接從數據可視化開始。
在這個配方中,我們將通過數據探索的基本步驟。這對於了解問題的複雜性和數據的任何潛在問題通常很重要。
1. 繪製一個對偶圖。
%matplotlib inline# this^ is not necessary on Colabimport seaborn as snssns.set(style="ticks", color_codes=True)
g = sns.pairplot(iris, hue='species')seaborn中的對偶圖可視化了數據集中的對偶關係。每個子圖顯示了一個變量與另一個變量的散點圖。對角線上的子圖顯示了變量的分布。顏色對應三個類。
從這個圖中,特別是如果你沿著對角線看,我們可以看到virginica和versicolor物種是不可(線性)分離的。這是我們要面對的問題,也是我們必須要克服的問題。
2. 讓我們快速看一下數據集。
因為花種是有順序的,一個一個列出來。
3. 把特徵和目標分開,準備進行訓練,如下:
classes = {'setosa': 0, 'versicolor': 1, 'virginica': 2}X = iris[['sepal_length', 'sepal_width', 'petal_length', 'petal_width']].valuesy = iris['species'].apply(lambda x: classes[x]).values最後一行將三個類對應的三個字符串轉換為數字--這叫做序數編碼。多類機器學習算法可以處理這個問題。對於神經網絡,我們將使用另一種編碼,你將在後面看到。
在這些基本步驟之後,我們就可以開始開發預測模型了。這些模型是根據特徵預測花類的模型。我們將依次查看Python中三個最重要的機器學習庫。讓我們從scikit-learn開始。
Scikit-learn的建模
在這個方案中,我們將在scikit-learn中創建一個分類器,並檢查其性能。
Scikit-learn(又稱sklearn)是一個Python機器學習框架,自2007年開始開發。它也是目前最全面的框架之一,它可以與pandas、NumPy、SciPy和Matplotlib庫互操作。scikit-learn的大部分內容已經在Cython、C和C++中進行了速度和效率的優化。
請注意,不是所有的scikit-learn分類器都能做多類問題。所有的分類器都可以做二元分類,但不是所有的分類器都可以做兩個以上的類。幸運的是,隨機森林模型可以。隨機森林模型(有時也被稱為隨機決策森林)是一種可以應用於分類和回歸任務的算法,是決策樹的集合。其主要思想是我們可以通過在數據集的引導樣本上創建決策樹,並對這些樹進行平均,從而提高精度。
下面的一些代碼行對你來說應該是樣板文件,我們會反覆使用它們。
1. 將訓練和驗證分開
作為一個良好的實踐,我們應該總是在訓練中沒有使用的數據樣本上測試我們的模型的性能(被稱為保留集或驗證集),我們可以這樣做。
from sklearn.ensemble import RandomForestClassifierfrom sklearn.model_selection import train_test_split
X_train, X_test, y_train, y_test = train_test_split( X, y, test_size=0.33, random_state=0)2. 定義一個模型
這裡我們定義我們的模型超參數,並使用這些超參數創建模型實例。在我們的案例中,具體操作如下。
超參數是指不屬於學習過程的參數,但卻控制著學習過程。在神經網絡的情況下,這包括學習率、模型架構和激活函數。
params = dict( max_depth=20, random_state=0, n_estimators=100,)clf = RandomForestClassifier(**params)3. 訓練模型
在這裡,我們將訓練數據集傳遞給我們的模型。在訓練過程中,模型的參數正在被擬合,以使我們獲得更好的結果(其中更好由一個函數定義,稱為成本函數或損失函數)。
在訓練中,我們使用擬合方法,它適用於所有sklearn兼容的模型。
clf.fit(X_train, y_train)4. 檢查模型的性能
雖然有一個模型內部的衡量標準(成本函數),但我們可能想看看其他的衡量標準。在建模的上下文中,這些被稱為度量。在scikit-learn中,我們有很多指標可以使用。對於分類,我們通常會看混淆矩陣,而且通常我們會想要繪製它。
from sklearn.metrics import plot_confusion_matrix
plot_confusion_matrix( clf, X_test, y_test, display_labels=['setosa', 'versicolor', 'virginica'], normalize='true')混淆矩陣是比較直觀的,特別是當表現形式像sklearn的plot_confusion_matrix()一樣清晰時。基本上,我們可以看到我們的類預測與實際類的吻合程度。我們可以看到預測與實際標籤的對比,按類分組,因此每個條目對應於給定實際類B的情況下,類A被預測了多少次。
這是混淆矩陣:
由於這是一個歸一化的martix,所以對角線上的數字也被稱為命中率或真陽率。我們可以看到,setosa在100%的時間內被預測為setosa(1)。相反,versicolor有95%的時間(0.95)被預測為versicolor,而5%的時間(0.053)被預測為virginica。
然而,從命中率來看,表現非常好;正如預期的那樣,我們在區分versicolor和virginica時遇到了一個小問題。
接下來我們會介紹Keras的建模,敬請期待。