【火爐煉AI】機(jī)器學(xué)習(xí)009-用邏輯回歸分類器解決多分類問(wèn)題

【火爐煉AI】機(jī)器學(xué)習(xí)009-用邏輯回歸分類器解決多分類問(wèn)題

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

前面的【火爐煉AI】機(jī)器學(xué)習(xí)008已經(jīng)講解了用簡(jiǎn)單線性分類器解決二分類問(wèn)題,但是對(duì)于多分類問(wèn)題,我們?cè)撛趺崔k了?

此處介紹一種用于解決多分類問(wèn)題的分類器:邏輯回歸。雖然名稱中含有回歸二字,但邏輯回歸不僅可以用來(lái)做回歸分析,也可以用來(lái)做分類問(wèn)題。邏輯回歸是機(jī)器學(xué)習(xí)領(lǐng)域比較常用的算法,用于估計(jì)樣本所屬類別的可能性,關(guān)于邏輯回歸的更深層次的公式推導(dǎo),可以參看https://blog.csdn.net/devotion987/article/details/78343834


1. 準(zhǔn)備數(shù)據(jù)集

此處我們自己構(gòu)建了一些簡(jiǎn)單的數(shù)據(jù)樣本作為數(shù)據(jù)集,首先我們要分析該數(shù)據(jù)集,做到對(duì)數(shù)據(jù)集的特性了然如胸。

# 首先準(zhǔn)備數(shù)據(jù)集
# 特征向量
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]]) # 自定義的數(shù)據(jù)集
# 標(biāo)記
y = np.array([0, 0, 0, 1, 1, 1, 2, 2, 2]) # 三個(gè)類別

# 按照類別將數(shù)據(jù)點(diǎn)畫(huà)到散點(diǎn)圖中
class_0=np.array([feature for (feature,label) in zip(X,y) if label==0])
# print(class_0) # 確保沒(méi)有問(wèn)題
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()
簡(jiǎn)單數(shù)據(jù)集的分布情況

########################小**********結(jié)###############################

1,通過(guò)將數(shù)據(jù)集的y label可以看出,整個(gè)數(shù)據(jù)集有三個(gè)類別,每個(gè)類別的數(shù)據(jù)點(diǎn)都聚集到一塊,這個(gè)可以從散點(diǎn)圖中看出,故而此處是典型的多分類問(wèn)題。

2,此處數(shù)據(jù)集的樣本數(shù)比較少(每個(gè)類別三個(gè)樣本),且特征向量只有兩個(gè),并且從散點(diǎn)圖中可以看出,數(shù)據(jù)集各個(gè)類別都區(qū)分的比較開(kāi),故而相對(duì)比較容易分類。

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


2. 構(gòu)建邏輯回歸分類器

邏輯回歸分類器的構(gòu)建非常簡(jiǎn)單,如下代碼所示,首先我們用該分類器的默認(rèn)參數(shù)做一下分類試試。

# 構(gòu)建邏輯回歸分類器
from sklearn.linear_model import LogisticRegression
classifier = LogisticRegression(random_state=37) # 先用默認(rèn)的參數(shù)
classifier.fit(X, y) # 對(duì)國(guó)際回歸分類器進(jìn)行訓(xùn)練

雖然此處我們構(gòu)建了邏輯回歸分類器, 并且用我們的數(shù)據(jù)集進(jìn)行了訓(xùn)練,但訓(xùn)練的效果該怎么查看了?此時(shí)我們也沒(méi)有測(cè)試集,所以暫時(shí)的,我們將該分類器在訓(xùn)練集上的分類效果畫(huà)到圖中,給出一個(gè)直觀的分類效果。為了在圖中看到分類效果,需要定義一個(gè)專門繪制分類器效果展示的函數(shù),如下。

# 將分類器繪制到圖中
def plot_classifier(classifier, X, y):
    x_min, x_max = min(X[:, 0]) - 1.0, max(X[:, 0]) + 1.0 # 計(jì)算圖中坐標(biāo)的范圍
    y_min, y_max = min(X[:, 1]) - 1.0, max(X[:, 1]) + 1.0
    step_size = 0.01 # 設(shè)置step size
    x_values, y_values = np.meshgrid(np.arange(x_min, x_max, step_size), np.arange(y_min, y_max, step_size))
    # 構(gòu)建網(wǎng)格數(shù)據(jù)
    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()

然后直接調(diào)用該繪圖函數(shù),查看該邏輯回歸分類器在訓(xùn)練集上的分類效果。

plot_classifier(classifier, X, y)
邏輯回歸分類器的分類效果

########################小**********結(jié)###############################

1,使用sklearn模塊中的LogisticRegression函數(shù)可以輕松的定義和訓(xùn)練一個(gè)邏輯回歸分類器模型。

2,由于此處采用分類器的默認(rèn)參數(shù),而不是最適合參數(shù),故而得到的分類效果并不是最佳,比如從圖中可以看出,雖然該分類模型能夠?qū)⑷齻€(gè)類別區(qū)分開(kāi)來(lái),但是其模型明顯還可以繼續(xù)優(yōu)化。

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


3. 對(duì)分類模型的優(yōu)化

邏輯回歸分類器有兩個(gè)最重要的參數(shù):solver和C,其中參數(shù)solver用于設(shè)置求解系統(tǒng)方程的算法類型,參數(shù)C表示對(duì)分類錯(cuò)誤的懲罰值,故而C越大,表明該模型對(duì)分類錯(cuò)誤的懲罰越大,即越不能接受分類發(fā)生錯(cuò)誤。

此處,作為拋磚引玉,可以優(yōu)化C值對(duì)分類效果的影響,如下,我們隨機(jī)選擇幾種C值,然后將分類結(jié)果圖畫(huà)出來(lái),憑借直觀感受來(lái)判斷哪一個(gè)比較好。當(dāng)然,更科學(xué)的做法是,使用測(cè)試集結(jié)合各種評(píng)估指標(biāo)來(lái)綜合評(píng)價(jià)那個(gè)參數(shù)組合下的模型最好。

# 優(yōu)化模型中的參數(shù)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時(shí)邏輯回歸分類器的分類效果
C=100時(shí)邏輯回歸分類器的分類效果
C=500時(shí)邏輯回歸分類器的分類效果

########################小**********結(jié)###############################

1,對(duì)模型進(jìn)行優(yōu)化是一項(xiàng)體力活,也是最能考驗(yàn)機(jī)器學(xué)習(xí)技術(shù)功底的工作,此處作為拋磚引玉,我們僅僅優(yōu)化了邏輯回歸分類器的一個(gè)參數(shù)。

2,邏輯回歸分類器的C值越大,得到的分類器模型就越在兩個(gè)數(shù)據(jù)集中間區(qū)分開(kāi)來(lái),這也符合我們的預(yù)期,那么,是否有必要在一開(kāi)始時(shí)就設(shè)置非常大的C值?

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


注:本部分代碼已經(jīng)全部上傳到(我的github)上,歡迎下載。

參考資料:

1, Python機(jī)器學(xué)習(xí)經(jīng)典實(shí)例,Prateek Joshi著,陶俊杰,陳小莉譯

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • https://developers.google.com/machine-learning/crash-cour...
    iOSDevLog閱讀 2,915評(píng)論 1 11
  • 機(jī)器學(xué)習(xí)術(shù)語(yǔ)表 本術(shù)語(yǔ)表中列出了一般的機(jī)器學(xué)習(xí)術(shù)語(yǔ)和 TensorFlow 專用術(shù)語(yǔ)的定義。 A A/B 測(cè)試 (...
    yalesaleng閱讀 2,146評(píng)論 0 11
  • 若是腳步沉重, 夢(mèng)想又怎會(huì)輕盈, 在那廣闊的藍(lán)天下, 你如何與白云相聚…… 風(fēng)兒也想幫你, 在風(fēng)口的地帶, 與你一...
    小劇在成長(zhǎng)閱讀 203評(píng)論 0 2
  • 剛注冊(cè)兩天,本來(lái)以為在簡(jiǎn)書(shū)上會(huì)交一些志同道合的朋友,沒(méi)想到廣告手營(yíng)銷手段真是太讓我佩服了。 先是下面這位,一開(kāi)始不...
    幽由我心閱讀 383評(píng)論 0 2
  • 去牛子家過(guò)了五一,住了4晚剛回來(lái),我覺(jué)得自己表現(xiàn)得太差了。去的第一晚,我有些失落,覺(jué)得他爸媽不搭理我,跟一年前一樣...
    珂粒閱讀 540評(píng)論 1 1

友情鏈接更多精彩內(nèi)容