1. 程式人生 > >Scikit-learn在Python中構建機器學習分類器

Scikit-learn在Python中構建機器學習分類器

機器學習是電腦科學、人工智慧和統計學的研究領域。機器學習的重點是訓練演算法以學習模式並根據資料進行預測。機器學習特別有價值,因為它讓我們可以使用計算機來自動化決策過程。

在本教程中,您將使用Scikit-learn(Python的機器學習工具)在Python中實現一個簡單的機器學習演算法。您將使用Naive Bayes(NB)分類器,結合乳腺癌腫瘤資訊資料庫,預測腫瘤是惡性還是良性。

在本教程結束時,您將瞭解如何使用Python構建自己的機器學習模型。

準備

要完成本教程,您需要:

  • Python 3 本地程式設計環境
  • 在virtualenv中安裝Jupyter Notebook。Jupyter Notebooks在執行機器學習實驗時非常有用。您可以執行短程式碼塊並快速檢視結果,從而輕鬆測試和除錯程式碼。

第一步 - 匯入Scikit-learn

讓我們首先安裝Python模組Scikit-learn,這是Python 最好、文件記錄最多的機器學習庫之一。

要開始我們的編碼專案,先要啟用我們的Python 3程式設計環境。確保您位於環境所在的目錄中,然後執行以下命令:

$ . my_env/bin/activate

 

啟用我們的程式設計環境後,檢查是否已安裝Sckikit-learn模組:

(my_env) $ python -c "import sklearn"

 

如果sklearn已安裝,則此命令將完成且沒有錯誤。如果未安裝,您將看到以下錯誤訊息:

Traceback (most recent call last): File "<string>", line 1, in <module> ImportError: No module named 'sklearn'

 

錯誤訊息表明sklearn未安裝,因此請使用pip下載庫:

(my_env) $ pip install scikit-learn[alldeps]

 

安裝完成後,啟動Jupyter Notebook:

(my_env) $ jupyter notebook

 

在Jupyter中,建立一個名為ML Tutorial

的新Python Notebook。在Notebook的第一個單元格,輸入sklearn模組:

ML Tutorial
import sklearn

 

您的 Notebook應如下圖所示:

 

現在我們已經在 Notebook中匯入了sklearn,我們可以開始使用機器學習模型的資料集。

第二步 - 匯入Scikit-learn的資料集

我們將在本教程中使用的資料集是乳腺癌威斯康星診斷資料庫。該資料集包括關於乳腺癌腫瘤的各種資訊,以及惡性良性的分類標籤。該資料集在569個腫瘤上具有569個例項或資料,並且包括關於30個屬性或特徵的資訊,例如腫瘤的半徑,紋理,平滑度和麵積。

使用該資料集,我們將構建機器學習模型以使用腫瘤資訊來預測腫瘤是惡性的還是良性的。

Scikit-learn安裝了各種資料集,我們可以將其載入到Python中,幷包含我們想要的資料集。匯入並載入資料集:

ML Tutorial
...

from sklearn.datasets import load_breast_cancer

# Load dataset
data = load_breast_cancer()

 

該data變數表示一個像字典一樣工作的Python物件。字典的關鍵是分類標籤名稱(target_names),實際標籤(target),屬性/特徵名稱(feature_names)和屬性(data)。

屬性是任何分類器的關鍵部分。屬性捕獲有關資料性質的重要特徵。鑑於我們試圖預測的標籤是惡性腫瘤與良性腫瘤,可能的有用屬性有腫瘤的大小,半徑和質地。

為每個重要資訊集建立新變數並分配資料:

ML Tutorial
...

# Organize our data
label_names = data['target_names']
labels = data['target']
feature_names = data['feature_names']
features = data['data']

 

我們現在有了每組資訊的列表。為了更好地理解我們的資料集,讓我們通過輸出我們的類標籤、第一個資料例項的標籤、我們的功能名稱以及第一個資料例項的功能值來檢視我們的資料:

ML Tutorial
...

# Look at our data
print(label_names)
print(labels[0])
print(feature_names[0])
print(features[0])

 

如果執行程式碼,您將看到以下結果:

 

如圖所示,我們的類名是惡性良性,然後將其對映到二進位制值0和1,其中0代表惡性腫瘤1代表良性腫瘤。因此,我們的第一個資料例項是惡性腫瘤,其平均半徑為1.79900000e+01。

現在我們已經載入了資料,我們可以使用我們的資料來構建我們的機器學習分類器。

第三步 - 將資料組織到集合中

要評估分類器的效能,您應該始終在看不見的資料上測試模型。因此,在構建模型之前,將資料拆分為兩部分:訓練集測試集

您可以使用訓練集在開發階段訓練和評估模型。然後,您使用訓練的模型對看不見的測試集進行預測。這種方法讓您瞭解模型的效能和穩健性。

幸運的是,sklearn有一個名為train_test_split()的函式,它將您的資料劃分為這些集合。匯入該函式,然後使用它來拆分資料:

ML Tutorial
...

from sklearn.model_selection import train_test_split

# Split our data
train, test, train_labels, test_labels = train_test_split(features,
                                                          labels,
                                                          test_size=0.33,
                                                          random_state=42)

該函式使用test_size引數隨機分割資料。在這個例子中,我們現在有一個測試集(test)代表原始資料集的33%。然後剩下的資料(train)組成訓練資料。我們還有列車/測試變數的相應標籤,即train_labelstest_labels

我們現在可以繼續培訓我們的第一個模型。

第四步 - 構建和評估模型

機器學習有很多模型,每種模型都有自己的優點和缺點。在本教程中,我們將重點介紹一種通常在二進位制分類任務中表現良好的簡單演算法,即Naive Bayes (NB)

首先,匯入GaussianNB模組。然後使用GaussianNB()函式初始化模型,然後通過使用gnb.fit()將模型擬合到資料來訓練模型:

ML Tutorial
...

from sklearn.naive_bayes import GaussianNB

# Initialize our classifier
gnb = GaussianNB()

# Train our classifier
model = gnb.fit(train, train_labels)

 

在我們訓練模型之後,我們可以使用訓練的模型對我們的測試集進行預測,這裡,我們使用predict()函式。該predict()函式返回測試集中每個資料例項的預測陣列。然後我們可以輸出我們的預測,以瞭解模型確定的內容。

使用帶有test的predict()函式輸出結果:

ML Tutorial
...

# Make predictions
preds = gnb.predict(test)
print(preds)

 

執行程式碼,您將看到以下結果:

 

正如您在Jupyter Notebook輸出中看到的,該predict()函式返回了一個0s和1s 陣列,它們代表了我們對腫瘤類的預測值(惡性與良性)。

現在我們有了預測,讓我們評估分類器的表現。

第五步 - 評估模型的準確性

使用真實類標籤陣列,我們可以通過比較兩個陣列(test_labelsvs.preds)來評估模型預測值的準確性。我們將使用sklearn函式accuracy_score()來確定機器學習分類器的準確性。

ML Tutorial
...

from sklearn.metrics import accuracy_score

# Evaluate accuracy
print(accuracy_score(test_labels, preds))

 

您將看到以下結果:

 

正如您在輸出中看到的那樣,NB分類器準確率為94.15%。這意味著分類器有94.15%的時間能夠正確預測腫瘤是惡性還是良性。這些結果表明我們的30個屬性的特徵集是腫瘤類別的良好指標。

您已成功構建了第一臺機器學習分類器。讓我們通過將所有import語句放在Notebook或指令碼的頂部來重新組織程式碼。程式碼的最終版本應如下所示:

ML教程

from sklearn.datasets import load_breast_cancer
from sklearn.model_selection import train_test_split
from sklearn.naive_bayes import GaussianNB
from sklearn.metrics import accuracy_score

# Load dataset
data = load_breast_cancer()

# Organize our data
label_names = data['target_names']
labels = data['target']
feature_names = data['feature_names']
features = data['data']

# Look at our data
print(label_names)
print('Class label = ', labels[0])
print(feature_names)
print(features[0])

# Split our data
train, test, train_labels, test_labels = train_test_split(features,
                                                          labels,
                                                          test_size=0.33,
                                                          random_state=42)

# Initialize our classifier
gnb = GaussianNB()

# Train our classifier
model = gnb.fit(train, train_labels)

# Make predictions
preds = gnb.predict(test)
print(preds)

# Evaluate accuracy
print(accuracy_score(test_labels, preds))

 

現在,您可以繼續使用程式碼來檢視是否可以使分類器的效能更佳。您可以嘗試不同的功能子集,甚至嘗試完全不同的演算法。

結論

在本教程中,您學習瞭如何在Python中構建機器學習分類器。現在,您可以使用Scikit-learn在Python中載入資料、組織資料、訓練、預測和評估機器學習分類器。本教程中的步驟可以幫助您簡化在Python中使用自己的資料的過程。

更多的學習資料或者視訊,點選此連結獲取