極簡Python帶你探索分類與迴歸的奧祕

 2018-03-13 11:00:23.0

爲何使用人工智能和機器學習?

地球的未來在於人工智能和機器學習。如果對這些技術一無所知,人們很快會發現自己落伍了。世界發展日新月異,每天都發生着不可思議的變化。在人工智能和機器學習中,有許多實現和技術能夠解決實時問題。其中,監督學習是最常用的方法之一。

「人工智能的關鍵在於表示。」——Jeff Hawkins

什麼是監督學習?

在監督學習中,我們首先導入包含訓練屬性和目標屬性的數據集。監督學習算法將學習訓練樣本和其目標變量之間的關係,然後應用習得的關係對無目標屬性的全新輸入進行分類。

爲了闡明監督學習如何工作,讓我們考慮一個案例:根據學生的學習時長預測學生的成績。

數學公式如下:

Y = f(X)+ C

其中,F 代表學生準備考試的時長與考試分數之間的關係。X 是輸入(學習時長),Y 是輸出(學生在考試中的得分)。C 代表隨機誤差。

監督學習算法的最終目標是:以最大的準確率預測給定新輸入 X 的 Y 值。有幾種方法都可以實現監督學習,我們將探索其中一些最常用的方法。

基於給定的數據集,機器學習問題將分爲兩類:分類和迴歸。如果給定數據同時具有輸入(訓練)值和輸出(目標)值,那麼它屬於分類問題。如果數據集有着連續數值屬性而沒有任何目標標籤,那麼它屬於迴歸問題。

Classification: Has the output label. Is it a Cat or Dog?Regression: How much will the house sell for?

分類問題

讓我們來舉例說明。一名醫學研究者希望通過分析乳腺癌數據來預測患者應該接受三種治療方式中的哪一種。這個數據分析任務屬於分類,其中構建的模型或分類器需要預測類別的標籤,比如「療法 1」、「療法 2」、「療法 3」。

分類問題預測離散且無序的類別標籤。這個過程分兩個階段:學習階段、分類階段。

分類方法以及如何選擇最合適的方法

最常用的算法包括:

1. K 近鄰

2. 決策樹

3. 樸素貝葉斯

4. 支持向量機

在學習階段,分類模型通過分析訓練集來構建分類器。在分類階段,模型會預測出給定數據的類別標籤。被分析的數據集元組及其相關類別標籤被分隔成訓練集和測試集。我們從要分析的數據集中隨機抽取部分元組構成訓練集。剩下的數據自然就是測試集了,且二者相互獨立,也就是說測試集不參與訓練過程。

測試集用於評估分類器的預測準確率。分類器的準確率指分類器在測試集中作出正確預測的百分比。爲了達到更高的準確率,最好的方法是測試不同的算法並針對每一種算法進行調參。最後通過交叉驗證可以找出最佳分類器。

爲了給任務選擇一個好的算法,我們必須考慮不同算法的準確率、訓練時間、線性度、參數數量及特殊情況。

運用 Scikit-Learn 在 IRIS 數據集上實現 KNN 算法,根據給定輸入預測花的種類。

首先,我們需要深入理解、探索給定數據集,這樣才能應用機器學習算法。在本例中,我們使用了從 scikit-learn 導入的 IRIS 數據集。接下來我們邊看代碼邊分析數據集。

請確保你的電腦上已經安裝了 Python。然後,請使用 PIP 安裝如下程序包:

pip install pandaspip install matplotlibpip install scikit-learn

在下面的代碼片段中,我們調用幾個 Pandas 中的方法來了解 IRIS 數據集的屬性。

輸出:


    
    
      dict_keys([‘data’, ‘target’, ‘target_names’, ‘DESCR’, ‘feature_names’])] 
      
      
        (150, 4)[‘setosa’ ‘versicolor’ ‘virginica’]sepal length (cm) sepal width (cm) petal length (cm) petal width  (cm)0   5.1   3.5   1.4  0.21   4.9   3.0   1.4  0.22   4.7   3.2   1.3  0.23   4.6   3.1   1.5  0.24   5.0   3.6   1.4  0.2 
       
      
    

scikit-learn 中 的 K 近鄰算法

如果一個算法只保存訓練集的元組,待收到測試元組後再進行處理,那麼它就是懶惰學習算法。該算法只有收到測試數據時才執行泛化,基於測試數據與已保存的訓練數據的相似性進行分類。

K 近鄰分類器就是一種懶惰學習算法。

KNN 基於類比學習。所謂類比學習,就是通過比較給定的測試元組和與其相似的訓練元組來學習。訓練元組由 n 個屬性來描述。每一個元組表示 n 維空間中的一個點。如此一來,所有的訓練元組都保存在 n 維模式空間中。當輸入未知元組時,k 近鄰分類器在模式空間中搜索最接近未知元組的 k 個訓練元組。這 k 個訓練元組就是未知元組的 k 個「最近鄰」。

「親密度」由距離度量定義,例如歐式距離。合適的 K 值根據實驗而定。

在下面的代碼片段中,我們從 sklearn 中導入 KNN 分類器,將其用於我們的輸入數據,之後用於對花進行分類。

from sklearn import datasetsfrom sklearn.neighbors import KNeighborsClassifier# Load iris dataset from sklearniris = datasets.load_iris()# Declare an of the KNN classifier class with the value with neighbors.knn = KNeighborsClassifier(n_neighbors=6)# Fit the model with training data and target valuesknn.fit(iris['data'], iris['target'])# Provide data whose class labels are to be predictedX = [    [5.9, 1.0, 5.1, 1.8],    [3.4, 2.0, 1.1, 4.8],]# Prints the data providedprint(X)# Store predicted class labels of Xprediction = knn.predict(X)# Prints the predicted class labels of Xprint(prediction)

輸出:

[1 1]

這裏,

0 對應 Versicolor(雜色鳶尾)

1 對應 Virginica(維吉尼亞鳶尾)

2 對應 Setosa(山鳶尾)

基於給定輸入,使用 KNN 分類器,兩張圖中的花都被預測爲 Versicolor。

用於 IRIS 數據集分類的 KNN 算法直觀圖

迴歸

我們通常將確定兩個或多個變量之間關係的過程叫做迴歸。例如,通過給定的輸入數據 X 來預測某人的收入。

這裏的目標變量是我們要預測的未知變量,連續性指的是 Y 值之間不存在間隙(間斷)。

預測收入是一個經典的迴歸問題。你的輸入數據應包括所有可用於預測收入的信息(也叫特徵),例如工作時長、教育程度、職位、住所等。

迴歸模型

最常用的迴歸模型如下:

  • 線性迴歸

  • Logistic 迴歸

  • 多項式迴歸

線性迴歸使用最佳擬合直線(即迴歸線)在因變量 Y 和一或多個自變量 X 之間建立關聯。

數學公式如下:

h(xi) = βo + β1 * xi + e

其中 βo 代表截距,β1 代表迴歸線的斜率,e 是誤差項。

圖形表示如下:

Logistic 迴歸算法應用在因變量屬於某一類別的情況。Logistic 迴歸的思想是找出特徵與特定輸出概率之間的關係。

數學公式如下:

p(X) = βo + β1 * X

其中,

p(x) = p(y = 1 | x)

圖形表示如下:

多項式迴歸是迴歸分析的一種形式。以 x 的 n 次多項式形式對自變量 x 和因變量 y 之間的關係進行建模。

解決線性迴歸問題

對於數據集 X 及對應的目標值 Y,我們使用普通最小二乘法訓練一個線性模型。通過這個模型,我們可以以儘可能小的誤差來預測給定未知輸入 x 的輸出值 y。

給定數據被分隔成訓練集和測試集。訓練集是有標註的(已加載特徵值),因此該算法可以從這些標註樣本中學習。測試集沒有標註,即你不知道要預測的值。

我們以要訓練的一個特徵爲例,運用線性迴歸擬合訓練集,然後使用測試集進行預測。

在 scikit-learn 中實現線性迴歸

from sklearn import datasets, linear_modelimport matplotlib.pyplot as pltimport numpy as np# Load the diabetes datasetdiabetes = datasets.load_diabetes()# Use only one feature for trainingdiabetes_X = diabetes.data[:, np.newaxis, 2]# Split the data into training/testing setsdiabetes_X_train = diabetes_X[:-20]diabetes_X_test = diabetes_X[-20:]# Split the targets into training/testing setsdiabetes_y_train = diabetes.target[:-20]diabetes_y_test = diabetes.target[-20:]# Create linear regression objectregr = linear_model.LinearRegression()# Train the model using the training setsregr.fit(diabetes_X_train, diabetes_y_train)# Input dataprint('Input Values')print(diabetes_X_test)# Make predictions using the testing setdiabetes_y_pred = regr.predict(diabetes_X_test)# Predicted Dataprint("Predicted Output Values")print(diabetes_y_pred)# Plot outputsplt.scatter(diabetes_X_test, diabetes_y_test, color='black')plt.plot(diabetes_X_test, diabetes_y_pred, color='red', linewidth=1)plt.show()

輸出:

Input Values[[ 0.07786339]  [-0.03961813]  [ 0.01103904]  [-0.04069594]    [-0.03422907]  [ 0.00564998]  [ 0.08864151]  [-0.03315126] [-0.05686312]  [-0.03099563]  [ 0.05522933]  [-0.06009656][ 0.00133873]  [-0.02345095]  [-0.07410811]  [ 0.01966154][-0.01590626]  [-0.01590626]  [ 0.03906215]  [-0.0730303 ]]Predicted Output Values[ 225.9732401   115.74763374  163.27610621  114.73638965   120.80385422  158.21988574  236.08568105  121.81509832   99.56772822   123.83758651  204.73711411   96.53399594  154.17490936  130.91629517   83.3878227   171.36605897 137.99500384  137.99500384  189.56845268   84.3990668 ]undefinedGraph between (diabetes_X_test, diabetes_y_pred) predictions will be continuous on the line equation.(diabetes_X_test, diabetes_y_pred) 預測圖是線性且連續的。

(diabetes_X_test, diabetes_y_pred) 預測圖是線性且連續的。


原文鏈接:https://towardsdatascience.com/supervised-learning-with-python-cf2c1ae543c1

文章來源:機器之心