首頁>技術>

SkLearn可能是Python最流行的機器學習模組之一。這是有充分理由的,因為SkLearn有非常多好的特性,有很多模型,縮放器和各種工具等!

有些模型非常有名,但是SkLearn是一個非常大的庫,人就很容易忘記它附帶的函式和類。雖然文件是一個很好的開始,但是擴充套件模型功能的另一個很好的方法是使用不同的模型。

有很多偉大的模型,使用頻率很低,但是卻很有用。今天我想給大家帶來一些我最喜歡的SkLearn模型,也許下次你遇到一個問題時,你會想起這個模型及其相應的應用!

資料

今天,我們將對模型進行擬合,以演示上述模型的用法。當然,要做到這一點,我們需要透過一些一維陣列來作為預測特徵。簡單來說,我們需要資料來訓練。

考慮到我們使用的是notebook,我認為它應該是開源的,你可以在此處檢視原始碼:

筆記本:https://github.com/emmettgb/Emmetts-DS-NoteBooks/blob/master/Python3/15%20sklearn%20models.ipynb 。

因為我們將要回顧分類模型以及迴歸模型,讀取weatherHistory.csv:

import pandas as pdimport numpy as npdf = pd.read_csv("weatherHistory.csv")

現在檢視下資料:

df.head(5)

因為我們將同時使用分類模型和迴歸模型,我需要一個離散的和連續的Y。對於連續目標,我決定使用溫度。對於離散目標,我使用了降水型別特徵。對於我的預測特徵,我將使用溼度特徵:

caty = "Precip Type"cony = "Temperature (C)"x = "Humidity"

現在我們將資料拆分為兩個資料幀,訓練和測試集:

from sklearn.model_selection import train_test_splittrain, test = train_test_split(df)

當然我不會對這些資料做太多的處理,只是為了擬合一些模型作為例子。請記住,這些模型不能擬合有缺失值的資料。我們透過以下程式碼得到資料幀中缺少值計數的總和。

df.isnull().sum()

透過這個錯誤,檢視null值應該是使用is_null函式。

看看摘要:

Formatted Date                0Summary                       0Precip Type                 517Temperature (C)               0Apparent Temperature (C)      0Humidity                      0Wind Speed (km/h)             0Wind Bearing (degrees)        0Visibility (km)               0Loud Cover                    0Pressure (millibars)          0Daily Summary                 0dtype: int64

我們放棄一些不好的樣本:

df = df.dropna()from sklearn.model_selection import train_test_splittrain, test = train_test_split(df)

現在把它放到一維陣列中:

trainX = train[x]cattrainy = train[caty]contrainy = train[cony]testX = test[x]cattesty = test[caty]contesty = test[cony]

SkLearn通常要求將這些陣列重新調整為垂直,因為它更喜歡矩陣列中的特徵,而不是矩陣行中的特徵。

我們重塑,然後準備擬合一些模型。為了做到這一點,我們需要把這些一維陣列變成NumPy陣列。這是因為SkLearn與NumPy的整合度要高得多,儘管它確實像Pandas系列,但在很多情況下NumPy陣列更具動態性,更常用:

trainX = np.array(trainX)cattrainy = np.array(cattrainy)contrainy = np.array(contrainy)testX = np.array(testX)cattesty = np.array(cattesty)contesty = np.array(contesty)trainX = trainX.reshape(-1, 1)cattrainy = cattrainy.reshape(-1, 1)contrainy = contrainy.reshape(-1, 1)testX = testX.reshape(-1, 1)cattesty = cattesty.reshape(-1, 1)contesty = contesty.reshape(-1, 1)
對於迴歸問題

通常用於監督模型的兩種不同型別的其中一種模型就是迴歸模型。這些模型預測的值是定量的,而不是定性的。也就是說,這些模型中的許多都將利用迴歸來估計連續值。

1:保序迴歸

保序迴歸,或單調回歸是一種可怕的迴歸形式,許多機器學習工程師甚至從未聽說過。保序迴歸是一種非常精確的預測連續目標的模型,但在這方面也有其侷限性。這方面的一個很好的例子是,這個模型往往容易過擬合,而要使模型正常工作,往往需要平衡偏差並努力提高準確度。

這個模型的另一個重要問題是資料必須是非遞減的。這意味著此模型的典型應用程式通常涉及經濟和業務場景。考慮到這一點,雖然這個模型可能對處理經濟資料的人非常有用,但對於許多科學工作來說,它不一定是最好的模型。

然而,保序迴歸在適當的應用和平衡偏差可以是一個非常強大的預測模型!如果你想了解關於保序迴歸的更多資訊,可以看看這兩篇文章:

https://towardsdatascience.com/building-and-using-an-isotonic-regression-model-in-c-f6789d46ab07

https://towardsdatascience.com/isotonic-regression-is-the-coolest-machine-learning-model-you-might-not-have-heard-of-3ce14afc6d1e

為了擬合這個模型,我們首先需要使用make_regressor函式,它將為我們提供一個基本的迴歸模型,在這個模型上可以建立保序迴歸。這樣做:

from sklearn.isotonic import IsotonicRegressionfrom sklearn.datasets import make_regressionisox, isoy = make_regression(n_samples=10, n_features=1, random_state=41)m.fit(isox, isoy)m = IsotonicRegression(trainX, contrainy)m = IsotonicRegression()m.fit(isox, isoy)m.predict(testX)
2:正交匹配追蹤(Orthagonal Matching Pursuit)

另一個只適用於某些資料特徵的非常有用的工具是正交匹配追蹤。該模型用於提取稀疏編碼訊號,去除資料中的噪聲和異常。這意味著這些機器學習演算法被用來根據資料修正某些輸入訊號,我認為這是機器學習的一個非常好的應用。

雖然正交匹配追蹤的主要用途可能相對簡單,但該模型的用途可能更為廣泛。鑑於這是一個非常獨特的光譜模型,它是如何工作的?

正交匹配追蹤形成了其名稱中描述的精確運算。為了剖析這個定義,讓我們分別看一下這些詞:

正交——涉及直角的;匹配——將觀察值與值聯絡起來;追蹤——尋找。

因此,基本上,我們正在尋找與資料的完美匹配,因為它依賴於多維資料空間D,這可能是程式設計世界中的一個字典型別。維基百科解釋為:其思想是從Hilbert空間(H)中建立一個近似訊號(f),作為統計函式的加權和,即PDFs/CDFs/Gamma。

雖然我們所擁有的資料對於這個特定的模型來說並不是一個很好的應用,但是對於這個例子,我將建立一些稀疏訊號作為資料傳遞:

from sklearn.linear_model import OrthogonalMatchingPursuitfrom sklearn.datasets import make_sparse_coded_signaln_components, n_features = 550, 100n_nonzero_coefs = 10# y = Xw# |x|_0 = n_nonzero_coefsy, X, w = make_sparse_coded_signal(n_samples=1,                                   n_components=n_components,                                   n_features=n_features,                                   n_nonzero_coefs=n_nonzero_coefs,                                   random_state=0)idx, = w.nonzero()

現在我們將給目標資料加噪聲:

y_noisy = y + 0.05 * np.random.randn(len(y))

擬合模型:

omp = OrthogonalMatchingPursuit(n_nonzero_coefs=n_nonzero_coefs)omp.fit(X, y)coef = omp.coef_idx_r, = coef.nonzero()
3:LARS LASSO

如果你已經使用機器學習很長一段時間了,很可能你聽說過LASSO迴歸。LASSO迴歸是一個奇妙的和相當標準化的工具,已經在機器學習中經常使用了很長一段時間了。大多數時候,在預測連續目標時,這無疑是我首選的模型。

然而,LARS LASSO模型不是你的正常LASSO迴歸。“LARS-lasso模型”中的LARS是最小角度迴歸(Least Angle regression)的簡稱。最小角度迴歸是一種用於預測連續特徵的機器學習演算法。它在處理具有難以置信的高維資料時最有用。

這個模型的一個優點是,雖然該模型比較大,但與通常以這種方式使用的模型相比,它並不是特別慢。重要的是要記住,雖然這個模型是從最小角度迴歸得出的,但這並不意味著它是線性的(LASSO部分)。當然,如果你要找的是線性模型,你可以在傳統的線性迴歸模型上使用相同的概念,使用最小角度迴歸。

from sklearn import linear_modelreg = linear_model.LassoLars(alpha=0.01)reg.fit(trainX, contrainy)reg.predict(testX)
4:最小角度迴歸

正如在LASSO模型的最小角度迴歸的類似應用中所討論的,最小角度迴歸是一種用於預測連續特徵的模型,通常透過使用協變數的線性子集來工作。這是最小角度迴歸和LARS-Lasso迴歸最顯著的區別。最小角度迴歸是指該模型的線性版本。

在計算上,最小角度迴歸速度也很快。雖然這是一個巨大的好處,但它最大的優點是在p>>n的情況下。如果兩個變數具有相同的相關性,那麼它們的係數應該以相同的速率增加。

from sklearn import linear_modelreg = linear_model.Lars()reg.fit(trainX, contrainy)reg.predict(testX)
5:SGDRegressor

SkLearn中一個概念的另一個偉大實現是隨機梯度下降。

隨機梯度下降法是一種迭代最佳化數學函式和構造成本函式的方法。很可能你聽說過梯度下降,這是類似的-然而,在這個模型的名稱隨機意味著,我們在一個epoch只使用一個樣本。這是兩個極端中的一個,梯度下降使用整個資料集,中間的mini-batch是兩者的折中。

在隨機梯度下降過程中,每次估計每個樣本的損失梯度,然後按照迭代公式更新模型。

from sklearn.linear_model import SGDRegressorm = SGDRegressor()m.fit(trainX, contrainy)m.predict(testX)
6:Huber迴歸

使用迴歸學習方法時,模型往往存在難以克服的缺點。這當然適用於線性模型,它可能很難完美地擬合稀疏資料或多維資料。幸運的是,SkLearn有一個不錯的Huber迴歸實現。

這種形式的迴歸可以用來處理異常值,並避免使用SkLearn包中提供的典型模型很容易產生的模型錯誤。雖然此模型很有用並且擬合得很好,但它也相對簡單,這意味著在使用這個模型時不會遇到過擬合和過取樣的典型問題。

Huber迴歸優化了平方損失(均方誤差),與簡單線性迴歸等模型相比,它對異常值具有相當強的魯棒性。實際上,斯坦福大學的Art B.Owen發表了一篇非常有趣的論文,對於那些不熟悉或不熟悉這種建模方法的人來說,這篇論文可能值得一看。如果你感興趣,可以檢視:https://statweb.stanford.edu/~owen/reports/hhu.pdf 。

以下是我發現的很有用的一句話,用於從數學上分析這個模型將如何處理這些異常資料:

“最小二乘準則非常適用於具有高斯分佈的yi,但當yi具有更大的尾分佈或幾乎相同的分佈時,當存在異常值時,則會產生較差的效能。Huber(1981)描述了一種穩健估計方法,它採用的損失函式受其影響較小。”

不用說,這個模型非常酷!我認為它在剔除異常值方面確實有用,因為這是導致預測連續問題困難的一個因素——這通常是輕描淡寫的,但在基礎統計學領域似乎很明顯。

現在我們已經在數學上熟悉了這個模型,實際上我們可以考慮將它應用到Sklearn中。

from sklearn.linear_model import HuberRegressorm = HuberRegressor()m.fit(trainX, contrainy)m.predict(testX)
7:多項式迴歸

雖然這個“模型”可能更像概念,可以與其他模型一起使用,但它肯定會非常有用!機器學習的一個非常常見的模型是使用非線性函式來建立線性預測。這將在不浪費任何預測能力的情況下保持模型的速度。一個很好的例子就是簡單線性迴歸上的多項式迴歸。

在使用多項式迴歸的例子中,它適用於用函式建立的高維資料。由於使用了多項式特徵,該模型可以很容易地擬合和求解廣泛的連續問題。

為了在sklearn中實際使用多項式迴歸,我們將實際使用PolynomialFeatures:

from sklearn.preprocessing import PolynomialFeaturespoly = PolynomialFeatures(2)poly.fit_transform(trainX)from sklearn.linear_model import LinearRegressionreg = LinearRegression()reg.fit(trainX, contrainy)reg.predict(testX)
8:普通最小二乘法

普通最小二乘法是另一個非常酷的預測連續特徵的數學機器學習模型。普通最小二乘法也是一種線性模型,適用於為使資料點之間的平方和最小化而建立的係數。

普通最小二乘法的權值在很大程度上依賴於特徵的獨立性來預測目標。也就是說,這個模型對於具有單一特徵的實現非常有用。此外,它也可以與多個特徵一起使用。

不幸的是,OLS的SkLearn實現沒有大多數實現那麼簡單。OLS係數實際上包含在LinearRegression類的下面,如.coef_所示:

linear_model.LinearRegression().fit(trainX, contrainy).coef_
9:NuSVR

回到支援向量機的神奇之處,讓我向你介紹NuSVR。NuSVR當然是與NuSVC相同的模型和機器實現。這兩種模型都使用libsvm並使用一個引數nu來控制機器中支援向量的數量。但是,與NuSVC不同,nu替換C,這裡nu替換epsilon SVR的引數epsilon。

使用該模型的優點是,為向量機的調整提供了引數,該向量機用於協助估計迴歸問題。也就是說,這個模型非常適合預測連續的特徵,這些特徵對我們的目標可能非常重要,也可能不重要。

from sklearn.svm import NuSVRfrom sklearn.svm import NuSVRm = NuSVR()m.fit(trainX, contrainy)m.predict(testX)
10:多工LASSO

和 LARS las一樣,你很可能聽說過LASSO迴歸。作為複習,這是一個非常常用的預測連續特徵的非線性模型。多工LASSO的區別在於,多工LASSO將使用L1/L2範數作為正則化。

為了證明這一點,讓我們看看Lasso迴歸的最佳化目標:

(1 / (2 * n_samples)) * ||Y - XW||^2_Fro + alpha * ||W||_21

在本例中,||W||_21將被修改以適合多工LASSO的公式:

本質上,這意味著我們得到的是每一行的總和。

from sklearn.linear_model import MultiTaskLassom = MultiTaskLasso()m.fit(trainX, contrainy)m.predict(testX)
對於分類問題

在機器學習中,可能會有很多連續的問題,但是同樣的,分類問題也很多。

11:LinearSVC

LinearSVC是一種支援向量機型別的模型。支援向量機模型的SkLearn實現是使用libsvm建立的。雖然核可以是非線性的,但它的SMO通常不能很好地擴充套件到大量樣本。這就是線性支援向量分類器派上用場的地方。

也就是說,雖然在Sklearn中還有其他一些更著名的SVC實現,但LinearSVC絕對是一個值得關注的模型!SVC通常在多類模式下工作,實現時使用OvO。線上性SVC的情況下,使用OvR。這使模型更全面。

至於SkLearn類,它是一個很棒的、近乎完美的實現。它非常好地支援密集和稀疏資料,並且可以成為一個令人難以置信的模型——在我看來,它是Python中最適合線性分類的模型之一!

from sklearn.svm import LinearSVCm = LinearSVC()m.fit(trainX, cattrainy)m.predict(testX)
12:SGDClassifier

正如我們在簡要討論SGDRegressor時所討論的,隨機梯度下降是指在每次迭代的成本中,只使用一個樣本。當然,SGDClassifier與現在應用於分類問題的概念完全相同。

與SGDRegressor一樣,這個模型是一個很好的實現,特別是在處理大量特徵時,它是很有價值的。雖然效能可能會大幅下降,但可能需要權衡使用更復雜模型帶來的成本問題。

使用SGDRegressor是非常簡單的,與此列表中的許多模型一樣,將遵循典型的SkLearn約定

importfitpredict
from sklearn.linear_model import SGDClassifierm = SGDClassifier()m.fit(trainX, cattrainy)m.predict(testX)
13:伯努利樸素貝葉斯

伯努利樸素貝葉斯分類模型可以像使用任何貝葉斯分類模型一樣使用,但是它確實有一個技巧:

伯努利分佈

你可能熟悉這種分佈,因為它的CDF經常出現在logistic分類模型。我想說這個模型的用法和多項式的用法非常相似。然而,雖然多項式NB在計數方面的效果明顯更好,但BernoulliNB使用了Bernoulli分佈,並且是為布林型特徵設計的。伯努利分佈用於logistic迴歸,也就是說,這個模型有著本質上相同的用途,所以它使用相同的分佈是有意義的。

儘管此模型通常用於預測二元特徵,但今天我們將傳遞一些可能更適用於多項式nb的離散資料。也就是說,記住這兩個模型的用例是很重要的,因為它們非常強大,但是應該用於它們相應的特徵型別。

如果你不瞭解你試圖預測的目標,那麼使用一個模型是沒有意義的,我認為這些模型之間的差異凸顯了資料科學家的作用,不同的模型需要不同型別的特徵才能很好地工作。但不管怎樣,它遵循了我們期望從SkLearn學到的典型用法:

from sklearn.naive_bayes import BernoulliNBm = BernoulliNB()m.fit(trainX, cattrainy)m.predict(testX)
14:RidgeClassification

如果你一直在使用機器學習模型,特別是迴歸模型,你很可能聽說過嶺迴歸。嶺迴歸是一種常用的連續特徵預測模型。對於分類問題,RidgeClassification當然是這個精確模型的分類等價物。

模型的分類版本將目標轉換為{-1,1},然後將其建模為具有典型嶺迴歸的迴歸問題。我認為這是一個非常酷的概念,因為在我看來,將回歸和其他解決問題的連續方法應用於一個完全不同的問題(如分類)是非常酷的。

幸運的是,儘管這個模型非常棒,看起來像是一個先進的概念,但SkLearn讓它非常容易地使用:

from sklearn.linear_model import RidgeClassifierm = RidgeClassifier()m.fit(trainX, cattrainy)m.predict(testX)
15:CalibratedClassifierCV

可能這個列表中最酷的模型之一是CalibredClassifierCV。該模型使用交叉驗證來估計分類器的引數。該模型以logistic迴歸為基礎,是一個很好的布林型分類模型。

然而,由於這個模型實際上可以採用不同的基估計,一個常用的模型實際上是保序迴歸。保序迴歸是一個非常酷的模型,但在我看來,當與分類問題結合起來時,它會變得酷得多。這意味著閾值現在附加到類,而不是連續資料中的任意數。

與此列表中許多用於預測目標的其他解決方案不同,這是另一個用於其他模型的附加解決方案。在這個例子中,我將用高斯樸素貝葉斯建立一個分類模型。

from sklearn.naive_bayes import GaussianNBfrom sklearn.calibration import CalibratedClassifierCVbase_clf = GaussianNB()calibrated_clf = CalibratedClassifierCV(base_estimator=base_clf, cv=3)calibrated_clf.fit(trainX, cattrainy)calibrated_clf.predict(testX)
結論

SkLearn是一個非常棒的庫,現在的機器學習工程師可能認為它是理所當然的。庫裡有很多模型是絕對難以置信的,可能會因為已經有了冠軍模型而被忽略。你用過多少這種模型?希望這些描述和介紹這些模型令你感到有趣,甚至可能有助於為你的下一個專案選擇這些模型。

非常感謝你的閱讀!

13
最新評論
  • BSA-TRITC(10mg/ml) TRITC-BSA 牛血清白蛋白改性標記羅丹明
  • 第4節,Codeigniter取表內容