當前位置:編程學習大全網 - 源碼下載 - 線性模型-分類模型

線性模型-分類模型

線性模型也可用於分類問題。我們首先來看二分類。我們可以利用下面的公式預測:

y^=w[0]x[0]+w[1]x[1]+...+w[p]*x[p]+b>0

這個公式與線性回歸的公式非常相似,但我們沒有返回特征的加權求和,而是為預測設置了閾值(0)。如果函數值小於0,我們就預測類別-1,如果函數值大於0,我們就預測類別+1。對於所有用於分類的線性模型,這個預測規則都是通用的。同樣,有很多不同的方法來找出系數(w)和截距(b)。

對於用於回歸的線性模型,輸出y^是特征的線性函數,是直線、平面或超平面(對於更高維的數據集)。對於用於分類的線性模型, 決策邊界 是輸入的線性函數。換句話說,(二元)線性分類器是利用直線、平面或超平面來分開兩個類別的分類器。

學習線性模型有很多種算法。這些算法的區別在於以下兩點:

1.系數和截距的特定組合對訓練數據擬合好壞的度量方法;

2.是否使用正則化,以及使用哪種正則化方法。

不同的算法使用不同的方法來度量“對訓練集擬合好壞”。由於數學上的技術原因,不可能調節w和b使得算法產生的誤分類數量最少。對於我們的目的,以及對於許多有用而言,上面第壹點(稱為 損失函數 )的選擇並不重要。

最常見的兩種線性分類算法是 Logistic回歸(logistic regression) 線性支持向量機(linear support vector machine,線性SVM)

Python version:3.7.1 (default, Dec 10 2018, 22:54:23) [MSC v.1915 64 bit (AMD64)]

pandas version:0.23.4

matplotlib version:3.0.2

Numpy version:1.15.4

Scipy version:1.1.0

IPython version:7.2.0

scikit-learn version:0.20.1

對於LogisticRegression和LinearSVC,決定正則化強度的權衡參數叫作C。C值越大,對應的正則化越弱。換句話說,如果參數C值較大,那麽LogisticRegression和LinearSVC將盡可能將訓練集擬合到最好,而如果C值較小,那麽模型更強調使系數向量(w)接近於0。

參數C的作用還有另壹個有趣之處。較小的C值可以讓算法盡量適應“大多數”數據點,而較大的C值強調每個數據點都分類正確的重要性。

mglearn.plots.plot_linear_svc_regularization()

Training set score:0.953

Test set score:0.958

C=1的默認值給出了相當好的性能,在訓練集和測試集上都達到95%的精度。但由於訓練集和測試集的性能非常接近,所以模型很可能是欠擬合的。我們嘗試增大C來擬合壹個更靈活的模型:

Training set score:0.972

Test set score:0.965

使用C=100可以得到更高的訓練集精度,也得到了稍高的測試集精度,這也證實了我們的直覺,即更復雜的模型應該性能更好。

Training set score:0.934

Test set score:0.930

最後,看壹下正則化參數C取三個不同的值模型學到的系數:

LogisticRegression模型默認應用L2正則化。更強的正則化使的系數更趨向於0,但系數永遠不會正好等於0。進壹步觀察圖像,還可以第3個系數那裏發現有趣之處,這個系數是“平均周長”(mean perimeter)。C=100和C=1時這個系數為正,其絕對值比C=1時還要大。在解釋這樣的模型時,系數可以告訴我們某個特征與哪個類別有關。例如,人們可能會認為高“紋理錯誤”(texture error)特征與“惡性”樣本有關。但“平均周長”系數的正負號發生變化,說明較大的“平均周長”可以被當作“良性”的指標或“惡性”的指標,具體取決於我們考慮的是哪個模型。這也說明,對線性模型系數的解釋應該始終持保留態度。

如果想要壹個可解釋性更強的模型,使用L1正則化可能更好,因為它約束模型只使用少數幾個特征:

Training accuracy of l1 logreg with C=0.001:0.91

Test accuracy of l1 logreg with C=0.001:0.92

Training accuracy of l1 logreg with C=1.000:0.96

Test accuracy of l1 logreg with C=1.000:0.96

Training accuracy of l1 logreg with C=100.000:0.99

Test accuracy of l1 logreg with C=100.000:0.98

將二分類算法推廣到多分類算法的壹種常見方法是“壹對多余”(one-vs.-rest)方法。在“壹對多余”方法中,對每個類別都學習壹個二分類模型,將這個類別與所有其他類別盡量分開,這樣就生成了與類別格式壹樣多的二分類偶像。在測試點上運行所有二分類器來進行預測。在對應類別上分數最高的分類器“勝出”,將這個類別標簽返回作為預測結果。

每個類別都對應壹個二類分類器,這樣每個類別都有壹個系數(w)向量與壹個截距(b)。

我們將“壹對多余”方法應用在壹個簡單的三分類數據集上。我們用到了壹個二維數據集,每個類別的數據都是從壹個高斯分布中采樣得出的:

在上面的數據集上訓練壹個LinearSVC分類器:

Coefficient shape: (3, 2)

Intercept shape: (3,)

我們看到,coef_的形狀是(3,2),說明coef_每行包含三個類別之壹的系數向量,每列包含某個特征(這個數據集有2個特征)對應的系數值。現在intercetp_是壹維數組,保存每個類別的截距,我們將這3個二分類器給出的直線可視化:

妳可以看到,訓練集中所有屬於類別0的點都在類別0對應的直線上方,這說明它們位於這個二分類器屬於“類別0”的那壹側。屬於類別0的點位於與類別2對應的直線上方,這說明它們被類別2的二分類器劃為“其余”。屬於類別0的點位於與類別1對應的直線左側,這說明類別1的二元分類器將它們劃為“其余”。因此,這壹區域的所有點都會被最終分類器劃為類別0(類別0的分類器的分類置信方程的結果大於0,其他兩個類別對應的結果小於0)。

但圖像中間的三角形區域屬於哪壹個類別呢,3個分類器都將這壹區域內的點劃為“其余”。這裏的點應該應該劃歸到哪壹個類別呢?答案是分類方程結果最大的那個類別,即最接近的那條線對應的類別。

線性模型的主要參數是正則化參數,在回歸模型中叫作alpha,在LinearSVC和LogisticRegression中叫作C。alpha值較大或C值較小,說明模型比較簡單。特別是對於回歸模型而言,調節這些參數非常重要。通常在對數尺度上對C和alpha進行搜索。妳還需要確定的是用L1正則化還是L2正則化。如果妳假定只有幾個特征是真正重要的,那麽妳應該用的是L1正則化,否則默認使用L2正則化。如果模型的可解釋性很重要的話,使用L1也會有幫助。由於L1只用到幾個特征,所以更容易解釋哪些特征對模型時重要的,以及這些特征的作用。

線性模型的訓練速度非常快,預測速度也很快。這種模型可以推廣到非常大的數據集,對稀疏數據也很有效。如果妳的數據包含數十萬甚至上百萬個樣本,妳可能需要研究使用LogisticRegression和Ridge模型的solver='sag'選項,在處理大型數據時,這壹選項比默認值要更快。其他選項還有SGDClassifier類和SGDRegressor類,它們對線性模型實現了可擴展性更強的版本。

線性模型的另壹個優點在於,利用我們之前見過的用於回歸和分類的公式,理解如何進行預測是相對比較容易的。不幸的是,往往並不完全清楚系數為什麽是這樣的。如果妳的數據集中包含高度相關的特征,這壹問題尤為突出。在這種情況下,可能很難對系數做出解釋。

如果特征數量大於樣本數量,線性模型的表現通常都很好。它也常用於非常大的數據集,只是尤為訓練其他模型並不可行。但在更低維的空間中,其他模型的泛化性能可能更好。

  • 上一篇:java怎麽連接hdfs文件系統,需要哪些包?
  • 下一篇:陜西中煙的防偽標簽在哪裏?
  • copyright 2024編程學習大全網