【火爐煉AI】機器學習009-用邏輯迴歸分類器解決多分類問題

【火爐煉AI】機器學習009-用邏輯迴歸分類器解決多分類問題

(本文所使用的Python庫和版本號: Python 3.5, Numpy 1.14, scikit-learn 0.19, matplotlib 2.2 )git

前面的【火爐煉AI】機器學習008已經講解了用簡單線性分類器解決二分類問題,可是對於多分類問題,咱們該怎麼辦了?github

此處介紹一種用於解決多分類問題的分類器:邏輯迴歸。雖然名稱中含有迴歸二字,但邏輯迴歸不只能夠用來作迴歸分析,也能夠用來作分類問題。邏輯迴歸是機器學習領域比較經常使用的算法,用於估計樣本所屬類別的可能性,關於邏輯迴歸的更深層次的公式推導,能夠參看https://blog.csdn.net/devotion987/article/details/78343834。算法


1. 準備數據集

此處咱們本身構建了一些簡單的數據樣本做爲數據集,首先咱們要分析該數據集,作到對數據集的特性瞭然如胸。數組

# 首先準備數據集
# 特徵向量
X =np.array([[4, 7], [3.5, 8], [3.1, 6.2], [0.5, 1], [1, 2],
             [1.2, 1.9], [6, 2], [5.7, 1.5], [5.4, 2.2]]) # 自定義的數據集
# 標記
y = np.array([0, 0, 0, 1, 1, 1, 2, 2, 2]) # 三個類別

# 按照類別將數據點畫到散點圖中
class_0=np.array([feature for (feature,label) in zip(X,y) if label==0])
# print(class_0) # 確保沒有問題
class_1=np.array([feature for (feature,label) in zip(X,y) if label==1])
# print(class_1)
class_2=np.array([feature for (feature,label) in zip(X,y) if label==2])
# print(class_2)

# 繪圖
plt.figure()
plt.scatter(class_0[:,0],class_0[:,1],marker='s',label='class_0')
plt.scatter(class_1[:,0],class_1[:,1],marker='x',label='class_1')
plt.scatter(class_2[:,0],class_2[:,1],marker='o',label='class_2')
plt.legend()
複製代碼

簡單數據集的分佈狀況

########################小**********結###############################dom

1,經過將數據集的y label能夠看出,整個數據集有三個類別,每一個類別的數據點都彙集到一塊,這個能夠從散點圖中看出,故而此處是典型的多分類問題。機器學習

2,此處數據集的樣本數比較少(每一個類別三個樣本),且特徵向量只有兩個,而且從散點圖中能夠看出,數據集各個類別都區分的比較開,故而相對比較容易分類。函數

#################################################################post


2. 構建邏輯迴歸分類器

邏輯迴歸分類器的構建很是簡單,以下代碼所示,首先咱們用該分類器的默認參數作一下分類試試。學習

# 構建邏輯迴歸分類器
from sklearn.linear_model import LogisticRegression
classifier = LogisticRegression(random_state=37) # 先用默認的參數
classifier.fit(X, y) # 對國際迴歸分類器進行訓練
複製代碼

雖然此處咱們構建了邏輯迴歸分類器, 而且用咱們的數據集進行了訓練,但訓練的效果該怎麼查看了?此時咱們也沒有測試集,因此暫時的,咱們將該分類器在訓練集上的分類效果畫到圖中,給出一個直觀的分類效果。爲了在圖中看到分類效果,須要定義一個專門繪製分類器效果展現的函數,以下。測試

# 將分類器繪製到圖中
def plot_classifier(classifier, X, y):
    x_min, x_max = min(X[:, 0]) - 1.0, max(X[:, 0]) + 1.0 # 計算圖中座標的範圍
    y_min, y_max = min(X[:, 1]) - 1.0, max(X[:, 1]) + 1.0
    step_size = 0.01 # 設置step size
    x_values, y_values = np.meshgrid(np.arange(x_min, x_max, step_size), np.arange(y_min, y_max, step_size))
    # 構建網格數據
    mesh_output = classifier.predict(np.c_[x_values.ravel(), y_values.ravel()])
    mesh_output = mesh_output.reshape(x_values.shape) 
    plt.figure()
    plt.pcolormesh(x_values, y_values, mesh_output, cmap=plt.cm.gray)
    plt.scatter(X[:, 0], X[:, 1], c=y, s=80, edgecolors='black', linewidth=1, cmap=plt.cm.Paired)
    # specify the boundaries of the figure
    plt.xlim(x_values.min(), x_values.max())
    plt.ylim(y_values.min(), y_values.max())

    # specify the ticks on the X and Y axes
    plt.xticks((np.arange(int(min(X[:, 0])-1), int(max(X[:, 0])+1), 1.0)))
    plt.yticks((np.arange(int(min(X[:, 1])-1), int(max(X[:, 1])+1), 1.0)))

    plt.show()
複製代碼

而後直接調用該繪圖函數,查看該邏輯迴歸分類器在訓練集上的分類效果。

plot_classifier(classifier, X, y)
複製代碼

邏輯迴歸分類器的分類效果

########################小**********結###############################

1,使用sklearn模塊中的LogisticRegression函數能夠輕鬆的定義和訓練一個邏輯迴歸分類器模型。

2,因爲此處採用分類器的默認參數,而不是最適合參數,故而獲得的分類效果並非最佳,好比從圖中能夠看出,雖然該分類模型可以將三個類別區分開來,可是其模型明顯還能夠繼續優化。

#################################################################


3. 對分類模型的優化

邏輯迴歸分類器有兩個最重要的參數:solver和C,其中參數solver用於設置求解系統方程的算法類型,參數C表示對分類錯誤的懲罰值,故而C越大,代表該模型對分類錯誤的懲罰越大,即越不能接受分類發生錯誤。

此處,做爲拋磚引玉,能夠優化C值對分類效果的影響,以下,咱們隨機選擇幾種C值,而後將分類結果圖畫出來,憑藉直觀感覺來判斷哪個比較好。固然,更科學的作法是,使用測試集結合各類評估指標來綜合評價那個參數組合下的模型最好。

# 優化模型中的參數C
for c in [1,5,20,50,100,200,500]:
    classifier = LogisticRegression(C=c,random_state=37)
    classifier.fit(X, y)
    plot_classifier(classifier, X, y)
# 貌似C越多,分類的效果越好。
複製代碼

C=5時邏輯迴歸分類器的分類效果

C=100時邏輯迴歸分類器的分類效果

C=500時邏輯迴歸分類器的分類效果

########################小**********結###############################

1,對模型進行優化是一項體力活,也是最能考驗機器學習技術功底的工做,此處做爲拋磚引玉,咱們僅僅優化了邏輯迴歸分類器的一個參數。

2,邏輯迴歸分類器的C值越大,獲得的分類器模型就越在兩個數據集中間區分開來,這也符合咱們的預期,那麼,是否有必要在一開始時就設置很是大的C值?

#################################################################


注:本部分代碼已經所有上傳到(個人github)上,歡迎下載。

參考資料:

1, Python機器學習經典實例,Prateek Joshi著,陶俊傑,陳小莉譯

相關文章
相關標籤/搜索