多類分類
二分類器只能區(qū)分兩個(gè)類,而多類分類器(也被叫做多項(xiàng)式分類器)可以區(qū)分多于兩個(gè)類。
一些算法(比如隨機(jī)森林分類器或者樸素貝葉斯分類器)可以直接處理多類分類問(wèn)題。其他一些算法(比如 SVM 分類器或者線性分類器)則是嚴(yán)格的二分類器。然后,有許多策略可以讓你用二分類器去執(zhí)行多類分類。
舉例子,創(chuàng)建一個(gè)可以將圖片分成 10 類(從 0 到 9)的系統(tǒng)的一個(gè)方法是:訓(xùn)練10個(gè)二分類器,每一個(gè)對(duì)應(yīng)一個(gè)數(shù)字(探測(cè)器 0,探測(cè)器 1,探測(cè)器 2,以此類推)。然后當(dāng)你想對(duì)某張圖片進(jìn)行分類的時(shí)候,讓每一個(gè)分類器對(duì)這個(gè)圖片進(jìn)行分類,選出決策分?jǐn)?shù)最高的那個(gè)分類器。這叫做“一對(duì)所有”(OvA)策略(也被叫做“一對(duì)其他”)。
另一個(gè)策略是對(duì)每一對(duì)數(shù)字都訓(xùn)練一個(gè)二分類器:一個(gè)分類器用來(lái)處理數(shù)字 0 和數(shù)字 1,一個(gè)用來(lái)處理數(shù)字 0 和數(shù)字 2,一個(gè)用來(lái)處理數(shù)字 1 和 2,以此類推。這叫做“一對(duì)一”(OvO)策略。如果有 N 個(gè)類。你需要訓(xùn)練N*(N-1)/2個(gè)分類器。對(duì)于 MNIST 問(wèn)題,需要訓(xùn)練 45 個(gè)二分類器!當(dāng)你想對(duì)一張圖片進(jìn)行分類,你必須將這張圖片跑在全部45個(gè)二分類器上。然后看哪個(gè)類勝出。OvO 策略的主要有點(diǎn)是:每個(gè)分類器只需要在訓(xùn)練集的部分?jǐn)?shù)據(jù)上面進(jìn)行訓(xùn)練。這部分?jǐn)?shù)據(jù)是它所需要區(qū)分的那兩個(gè)類對(duì)應(yīng)的數(shù)據(jù)。
一些算法(比如 SVM 分類器)在訓(xùn)練集的大小上很難擴(kuò)展,所以對(duì)于這些算法,OvO 是比較好的,因?yàn)樗梢栽谛〉臄?shù)據(jù)集上面可以更多地訓(xùn)練,較之于巨大的數(shù)據(jù)集而言。但是,對(duì)于大部分的二分類器來(lái)說(shuō),OvA 是更好的選擇。
Scikit-Learn 可以探測(cè)出你想使用一個(gè)二分類器去完成多分類的任務(wù),它會(huì)自動(dòng)地執(zhí)行 OvA(除了 SVM 分類器,它使用 OvO)。讓我們?cè)囈幌耂GDClassifier.
>>> sgd_clf.fit(X_train, y_train) # y_train, not y_train_5 >>> sgd_clf.predict([some_digit]) array([ 5.])
很容易。上面的代碼在訓(xùn)練集上訓(xùn)練了一個(gè)SGDClassifier。這個(gè)分類器處理原始的目標(biāo)class,從 0 到 9(y_train),而不是僅僅探測(cè)是否為 5 (y_train_5)。然后它做出一個(gè)判斷(在這個(gè)案例下只有一個(gè)正確的數(shù)字)。在幕后,Scikit-Learn 實(shí)際上訓(xùn)練了 10 個(gè)二分類器,每個(gè)分類器都產(chǎn)到一張圖片的決策數(shù)值,選擇數(shù)值最高的那個(gè)類。
為了證明這是真實(shí)的,你可以調(diào)用decision_function()方法。不是返回每個(gè)樣例的一個(gè)數(shù)值,而是返回 10 個(gè)數(shù)值,一個(gè)數(shù)值對(duì)應(yīng)于一個(gè)類。
>>> some_digit_scores = sgd_clf.decision_function([some_digit]) >>> some_digit_scores array([[-311402.62954431, -363517.28355739, -446449.5306454 , -183226.61023518, -414337.15339485, 161855.74572176, -452576.39616343, -471957.14962573, -518542.33997148, -536774.63961222]])
最高數(shù)值是對(duì)應(yīng)于類別 5 :
>>> np.argmax(some_digit_scores) 5 >>> sgd_clf.classes_ array([ 0., 1., 2., 3., 4., 5., 6., 7., 8., 9.]) >>> sgd_clf.classes[5] 5.0
一個(gè)分類器被訓(xùn)練好了之后,它會(huì)保存目標(biāo)類別列表到它的屬性classes_ 中去,按照值排序。在本例子當(dāng)中,在classes_ 數(shù)組當(dāng)中的每個(gè)類的索引方便地匹配了類本身,比如,索引為 5 的類恰好是類別 5 本身。但通常不會(huì)這么幸運(yùn)。
如果你想強(qiáng)制 Scikit-Learn 使用 OvO 策略或者 OvA 策略,你可以使用OneVsOneClassifier類或者OneVsRestClassifier類。創(chuàng)建一個(gè)樣例,傳遞一個(gè)二分類器給它的構(gòu)造函數(shù)。舉例子,下面的代碼會(huì)創(chuàng)建一個(gè)多類分類器,使用 OvO 策略,基于SGDClassifier。
>>> from sklearn.multiclass import OneVsOneClassifier >>> ovo_clf = OneVsOneClassifier(SGDClassifier(random_state=42)) >>> ovo_clf.fit(X_train, y_train) >>> ovo_clf.predict([some_digit]) array([ 5.]) >>> len(ovo_clf.estimators_) 45
訓(xùn)練一個(gè)RandomForestClassifier同樣簡(jiǎn)單:
>>> forest_clf.fit(X_train, y_train) >>> forest_clf.predict([some_digit]) array([ 5.])
這次 Scikit-Learn 沒(méi)有必要去運(yùn)行 OvO 或者 OvA,因?yàn)殡S機(jī)森林分類器能夠直接將一個(gè)樣例分到多個(gè)類別。你可以調(diào)用predict_proba(),得到樣例對(duì)應(yīng)的類別的概率值的列表:
>>> forest_clf.predict_proba([some_digit]) array([[ 0.1, 0. , 0. , 0.1, 0. , 0.8, 0. , 0. , 0. , 0. ]])
你可以看到這個(gè)分類器相當(dāng)確信它的預(yù)測(cè):在數(shù)組的索引 5 上的 0.8,意味著這個(gè)模型以 80% 的概率估算這張圖片代表數(shù)字 5。它也認(rèn)為這個(gè)圖片可能是數(shù)字 0 或者數(shù)字 3,分別都是 10% 的幾率。
現(xiàn)在當(dāng)然你想評(píng)估這些分類器。像平常一樣,你想使用交叉驗(yàn)證。讓我們用cross_val_score()來(lái)評(píng)估SGDClassifier的精度。
>>> cross_val_score(sgd_clf, X_train, y_train, cv=3, scoring="accuracy") array([ 0.84063187, 0.84899245, 0.86652998])
在所有測(cè)試折(test fold)上,它有 84% 的精度。如果你是用一個(gè)隨機(jī)的分類器,你將會(huì)得到 10% 的正確率。所以這不是一個(gè)壞的分?jǐn)?shù),但是你可以做的更好。舉例子,簡(jiǎn)單將輸入正則化,將會(huì)提高精度到 90% 以上。
>>> from sklearn.preprocessing import StandardScaler >>> scaler = StandardScaler() >>> X_train_scaled = scaler.fit_transform(X_train.astype(np.float64)) >>> cross_val_score(sgd_clf, X_train_scaled, y_train, cv=3, scoring="accuracy") array([ 0.91011798, 0.90874544, 0.906636 ])
誤差分析
當(dāng)然,如果這是一個(gè)實(shí)際的項(xiàng)目,你會(huì)在你的機(jī)器學(xué)習(xí)項(xiàng)目當(dāng)中,跟隨以下步驟(見(jiàn)附錄 B):探索準(zhǔn)備數(shù)據(jù)的候選方案,嘗試多種模型,把最好的幾個(gè)模型列為入圍名單,用GridSearchCV調(diào)試超參數(shù),盡可能地自動(dòng)化,像你前面的章節(jié)做的那樣。在這里,我們假設(shè)你已經(jīng)找到一個(gè)不錯(cuò)的模型,你試圖找到方法去改善它。一個(gè)方式是分析模型產(chǎn)生的誤差的類型。
首先,你可以檢查混淆矩陣。你需要使用cross_val_predict()做出預(yù)測(cè),然后調(diào)用confusion_matrix()函數(shù),像你早前做的那樣。
>>> y_train_pred = cross_val_predict(sgd_clf, X_train_scaled, y_train, cv=3)>>> conf_mx = confusion_matrix(y_train, y_train_pred)>>> conf_mx array([[5725, 3, 24, 9, 10, 49, 50, 10, 39, 4], [ 2, 6493, 43, 25, 7, 40, 5, 10, 109, 8], [ 51, 41, 5321, 104, 89, 26, 87, 60, 166, 13], [ 47, 46, 141, 5342, 1, 231, 40, 50, 141, 92], [ 19, 29, 41, 10, 5366, 9, 56, 37, 86, 189], [ 73, 45, 36, 193, 64, 4582, 111, 30, 193, 94], [ 29, 34, 44, 2, 42, 85, 5627, 10, 45, 0], [ 25, 24, 74, 32, 54, 12, 6, 5787, 15, 236], [ 52, 161, 73, 156, 10, 163, 61, 25, 5027, 123], [ 43, 35, 26, 92, 178, 28, 2, 223, 82, 5240]])
這里是一對(duì)數(shù)字。使用 Matplotlib 的matshow()函數(shù),將混淆矩陣以圖像的方式呈現(xiàn),將會(huì)更加方便。
plt.matshow(conf_mx, cmap=plt.cm.gray) plt.show()
這個(gè)混淆矩陣看起來(lái)相當(dāng)好,因?yàn)榇蠖鄶?shù)的圖片在主對(duì)角線上。在主對(duì)角線上意味著被分類正確。數(shù)字 5 對(duì)應(yīng)的格子看起來(lái)比其他數(shù)字要暗淡許多。這可能是數(shù)據(jù)集當(dāng)中數(shù)字 5 的圖片比較少,又或者是分類器對(duì)于數(shù)字 5 的表現(xiàn)不如其他數(shù)字那么好。你可以驗(yàn)證兩種情況。
讓我們關(guān)注僅包含誤差數(shù)據(jù)的圖像呈現(xiàn)。首先你需要將混淆矩陣的每一個(gè)值除以相應(yīng)類別的圖片的總數(shù)目。這樣子,你可以比較錯(cuò)誤率,而不是絕對(duì)的錯(cuò)誤數(shù)(這對(duì)大的類別不公平)。
row_sums = conf_mx.sum(axis=1, keepdims=True) norm_conf_mx = conf_mx / row_sums
現(xiàn)在讓我們用 0 來(lái)填充對(duì)角線。這樣子就只保留了被錯(cuò)誤分類的數(shù)據(jù)。讓我們畫出這個(gè)結(jié)果。
np.fill_diagonal(norm_conf_mx, 0) plt.matshow(norm_conf_mx, cmap=plt.cm.gray) plt.show()
現(xiàn)在你可以清楚看出分類器制造出來(lái)的各類誤差。記?。盒写韺?shí)際類別,列代表預(yù)測(cè)的類別。第 8、9 列相當(dāng)亮,這告訴你許多圖片被誤分成數(shù)字 8 或者數(shù)字 9。相似的,第 8、9 行也相當(dāng)亮,告訴你數(shù)字 8、數(shù)字 9 經(jīng)常被誤以為是其他數(shù)字。相反,一些行相當(dāng)黑,比如第一行:這意味著大部分的數(shù)字 1 被正確分類(一些被誤分類為數(shù)字 8 )。留意到誤差圖不是嚴(yán)格對(duì)稱的。舉例子,比起將數(shù)字 8 誤分類為數(shù)字 5 的數(shù)量,有更多的數(shù)字 5 被誤分類為數(shù)字 8。
分析混淆矩陣通??梢越o你提供深刻的見(jiàn)解去改善你的分類器?;仡欉@幅圖,看樣子你應(yīng)該努力改善分類器在數(shù)字 8 和數(shù)字 9 上的表現(xiàn),和糾正 3/5 的混淆。舉例子,你可以嘗試去收集更多的數(shù)據(jù),或者你可以構(gòu)造新的、有助于分類器的特征。舉例子,寫一個(gè)算法去數(shù)閉合的環(huán)(比如,數(shù)字 8 有兩個(gè)環(huán),數(shù)字 6 有一個(gè), 5 沒(méi)有)。又或者你可以預(yù)處理圖片(比如,使用 Scikit-Learn,Pillow, OpenCV)去構(gòu)造一個(gè)模式,比如閉合的環(huán)。
分析獨(dú)特的誤差,是獲得關(guān)于你的分類器是如何工作及其為什么失敗的洞見(jiàn)的一個(gè)好途徑。但是這相對(duì)難和耗時(shí)。舉例子,我們可以畫出數(shù)字 3 和 5 的例子
cl_a, cl_b = 3, 5 X_aa = X_train[(y_train == cl_a) & (y_train_pred == cl_a)] X_ab = X_train[(y_train == cl_a) & (y_train_pred == cl_b)] X_ba = X_train[(y_train == cl_b) & (y_train_pred == cl_a)] X_bb = X_train[(y_train == cl_b) & (y_train_pred == cl_b)] plt.figure(figsize=(8,8)) plt.subplot(221); plot_digits(X_aa[:25], ../images_per_row=5) plt.subplot(222); plot_digits(X_ab[:25], ../images_per_row=5) plt.subplot(223); plot_digits(X_ba[:25], ../images_per_row=5) plt.subplot(224); plot_digits(X_bb[:25], ../images_per_row=5) plt.show()
左邊兩個(gè)5*5的塊將數(shù)字識(shí)別為 3,右邊的將數(shù)字識(shí)別為 5。一些被分類器錯(cuò)誤分類的數(shù)字(比如左下角和右上角的塊)是書寫地相當(dāng)差,甚至讓人類分類都會(huì)覺(jué)得很困難(比如第 8 行第 1 列的數(shù)字 5,看起來(lái)非常像數(shù)字 3 )。但是,大部分被誤分類的數(shù)字,在我們看來(lái)都是顯而易見(jiàn)的錯(cuò)誤。很難明白為什么分類器會(huì)分錯(cuò)。原因是我們使用的簡(jiǎn)單的SGDClassifier,這是一個(gè)線性模型。它所做的全部工作就是分配一個(gè)類權(quán)重給每一個(gè)像素,然后當(dāng)它看到一張新的圖片,它就將加權(quán)的像素強(qiáng)度相加,每個(gè)類得到一個(gè)新的值。所以,因?yàn)?3 和 5 只有一小部分的像素有差異,這個(gè)模型很容易混淆它們。
3 和 5 之間的主要差異是連接頂部的線和底部的線的細(xì)線的位置。如果你畫一個(gè) 3,連接處稍微向左偏移,分類器很可能將它分類成 5。反之亦然。換一個(gè)說(shuō)法,這個(gè)分類器對(duì)于圖片的位移和旋轉(zhuǎn)相當(dāng)敏感。所以,減輕 3/5 混淆的一個(gè)方法是對(duì)圖片進(jìn)行預(yù)處理,確保它們都很好地中心化和不過(guò)度旋轉(zhuǎn)。這同樣很可能幫助減輕其他類型的錯(cuò)誤。
多標(biāo)簽分類
到目前為止,所有的樣例都總是被分配到僅一個(gè)類。有些情況下,你也許想讓你的分類器給一個(gè)樣例輸出多個(gè)類別。比如說(shuō),思考一個(gè)人臉識(shí)別器。如果對(duì)于同一張圖片,它識(shí)別出幾個(gè)人,它應(yīng)該做什么?當(dāng)然它應(yīng)該給每一個(gè)它識(shí)別出的人貼上一個(gè)標(biāo)簽。比方說(shuō),這個(gè)分類器被訓(xùn)練成識(shí)別三個(gè)人臉,Alice,Bob,Charlie;然后當(dāng)它被輸入一張含有 Alice 和 Bob 的圖片,它應(yīng)該輸出[1, 0, 1](意思是:Alice 是,Bob 不是,Charlie 是)。這種輸出多個(gè)二值標(biāo)簽的分類系統(tǒng)被叫做多標(biāo)簽分類系統(tǒng)。
目前我們不打算深入臉部識(shí)別。我們可以先看一個(gè)簡(jiǎn)單點(diǎn)的例子,僅僅是為了闡明的目的。
from sklearn.neighbors import KNeighborsClassifier y_train_large = (y_train >= 7) y_train_odd = (y_train % 2 == 1) y_multilabel = np.c_[y_train_large, y_train_odd] knn_clf = KNeighborsClassifier() knn_clf.fit(X_train, y_multilabel)
這段代碼創(chuàng)造了一個(gè)y_multilabel數(shù)組,里面包含兩個(gè)目標(biāo)標(biāo)簽。第一個(gè)標(biāo)簽指出這個(gè)數(shù)字是否為大數(shù)字(7,8 或者 9),第二個(gè)標(biāo)簽指出這個(gè)數(shù)字是否是奇數(shù)。接下來(lái)幾行代碼會(huì)創(chuàng)建一個(gè)KNeighborsClassifier樣例(它支持多標(biāo)簽分類,但不是所有分類器都可以),然后我們使用多目標(biāo)數(shù)組來(lái)訓(xùn)練它。現(xiàn)在你可以生成一個(gè)預(yù)測(cè),然后它輸出兩個(gè)標(biāo)簽:
>>> knn_clf.predict([some_digit]) array([[False, True]], dtype=bool)
它工作正確。數(shù)字 5 不是大數(shù)(False),同時(shí)是一個(gè)奇數(shù)(True)。
有許多方法去評(píng)估一個(gè)多標(biāo)簽分類器,和選擇正確的量度標(biāo)準(zhǔn),這取決于你的項(xiàng)目。舉個(gè)例子,一個(gè)方法是對(duì)每個(gè)個(gè)體標(biāo)簽去量度 F1 值(或者前面討論過(guò)的其他任意的二分類器的量度標(biāo)準(zhǔn)),然后計(jì)算平均值。下面的代碼計(jì)算全部標(biāo)簽的平均 F1 值:
>>> y_train_knn_pred = cross_val_predict(knn_clf, X_train, y_train, cv=3) >>> f1_score(y_train, y_train_knn_pred, average="macro") 0.96845540180280221
這里假設(shè)所有標(biāo)簽有著同等的重要性,但可能不是這樣。特別是,如果你的 Alice 的照片比 Bob 或者 Charlie 更多的時(shí)候,也許你想讓分類器在 Alice 的照片上具有更大的權(quán)重。一個(gè)簡(jiǎn)單的選項(xiàng)是:給每一個(gè)標(biāo)簽的權(quán)重等于它的支持度(比如,那個(gè)標(biāo)簽的樣例的數(shù)目)。為了做到這點(diǎn),簡(jiǎn)單地在上面代碼中設(shè)置average="weighted"。
多輸出分類
我們即將討論的最后一種分類任務(wù)被叫做“多輸出-多類分類”(或者簡(jiǎn)稱為多輸出分類)。它是多標(biāo)簽分類的簡(jiǎn)單泛化,在這里每一個(gè)標(biāo)簽可以是多類別的(比如說(shuō),它可以有多于兩個(gè)可能值)。
為了說(shuō)明這點(diǎn),我們建立一個(gè)系統(tǒng),它可以去除圖片當(dāng)中的噪音。它將一張混有噪音的圖片作為輸入,期待它輸出一張干凈的數(shù)字圖片,用一個(gè)像素強(qiáng)度的數(shù)組表示,就像 MNIST 圖片那樣。注意到這個(gè)分類器的輸出是多標(biāo)簽的(一個(gè)像素一個(gè)標(biāo)簽)和每個(gè)標(biāo)簽可以有多個(gè)值(像素強(qiáng)度取值范圍從 0 到 255)。所以它是一個(gè)多輸出分類系統(tǒng)的例子。
分類與回歸之間的界限是模糊的,比如這個(gè)例子。按理說(shuō),預(yù)測(cè)一個(gè)像素的強(qiáng)度更類似于一個(gè)回歸任務(wù),而不是一個(gè)分類任務(wù)。而且,多輸出系統(tǒng)不限于分類任務(wù)。你甚至可以讓你一個(gè)系統(tǒng)給每一個(gè)樣例都輸出多個(gè)標(biāo)簽,包括類標(biāo)簽和值標(biāo)簽。
讓我們從 MNIST 的圖片創(chuàng)建訓(xùn)練集和測(cè)試集開(kāi)始,然后給圖片的像素強(qiáng)度添加噪聲,這里是用 NumPy 的randint()函數(shù)。目標(biāo)圖像是原始圖像。
noise = rnd.randint(0, 100, (len(X_train), 784)) noise = rnd.randint(0, 100, (len(X_test), 784)) X_train_mod = X_train + noise X_test_mod = X_test + noise y_train_mod = X_train y_test_mod = X_test
讓我們看一下測(cè)試集當(dāng)中的一張圖片(是的,我們?cè)诟Q探測(cè)試集,所以你應(yīng)該馬上鄒眉):
左邊的加噪聲的輸入圖片。右邊是干凈的目標(biāo)圖片。現(xiàn)在我們訓(xùn)練分類器,讓它清潔這張圖片:
knn_clf.fit(X_train_mod, y_train_mod) clean_digit = knn_clf.predict([X_test_mod[some_index]]) plot_digit(clean_digit)
看起來(lái)足夠接近目標(biāo)圖片。現(xiàn)在總結(jié)我們的分類之旅。希望你現(xiàn)在應(yīng)該知道如何選擇好的量度標(biāo)準(zhǔn),挑選出合適的準(zhǔn)確率/召回率的折衷方案,比較分類器,更概括地說(shuō),就是為不同的任務(wù)建立起好的分類系統(tǒng)。
練習(xí)
嘗試在 MNIST 數(shù)據(jù)集上建立一個(gè)分類器,使它在測(cè)試集上的精度超過(guò) 97%。提示:KNeighborsClassifier非常適合這個(gè)任務(wù)。你只需要找出一個(gè)好的超參數(shù)值(試一下對(duì)權(quán)重和超參數(shù)n_neighbors進(jìn)行網(wǎng)格搜索)。
寫一個(gè)函數(shù)可以是 MNIST 中的圖像任意方向移動(dòng)(上下左右)一個(gè)像素。然后,對(duì)訓(xùn)練集上的每張圖片,復(fù)制四個(gè)移動(dòng)后的副本(每個(gè)方向一個(gè)副本),把它們加到訓(xùn)練集當(dāng)中去。最后在擴(kuò)展后的訓(xùn)練集上訓(xùn)練你最好的模型,并且在測(cè)試集上測(cè)量它的精度。你應(yīng)該會(huì)觀察到你的模型會(huì)有更好的表現(xiàn)。這種人工擴(kuò)大訓(xùn)練集的方法叫做數(shù)據(jù)增強(qiáng),或者訓(xùn)練集擴(kuò)張。
拿 Titanic 數(shù)據(jù)集去搗鼓一番。開(kāi)始這個(gè)項(xiàng)目有一個(gè)很棒的平臺(tái):Kaggle!
建立一個(gè)垃圾郵件分類器(這是一個(gè)更有挑戰(zhàn)性的練習(xí)):
下載垃圾郵件和非垃圾郵件的樣例數(shù)據(jù)。地址是Apache SpamAssassin 的公共數(shù)據(jù)集
解壓這些數(shù)據(jù)集,并且熟悉它的數(shù)據(jù)格式。
將數(shù)據(jù)集分成訓(xùn)練集和測(cè)試集
寫一個(gè)數(shù)據(jù)準(zhǔn)備的流水線,將每一封郵件轉(zhuǎn)換為特征向量。你的流水線應(yīng)該將一封郵件轉(zhuǎn)換為一個(gè)稀疏向量,對(duì)于所有可能的詞,這個(gè)向量標(biāo)志哪個(gè)詞出現(xiàn)了,哪個(gè)詞沒(méi)有出現(xiàn)。舉例子,如果所有郵件只包含了"Hello","How","are", "you"這四個(gè)詞,那么一封郵件(內(nèi)容是:"Hello you Hello Hello you")將會(huì)被轉(zhuǎn)換為向量[1, 0, 0, 1](意思是:"Hello"出現(xiàn),"How"不出現(xiàn),"are"不出現(xiàn),"you"出現(xiàn)),或者[3, 0, 0, 2],如果你想數(shù)出每個(gè)單詞出現(xiàn)的次數(shù)。
你也許想給你的流水線增加超參數(shù),控制是否剝過(guò)郵件頭、將郵件轉(zhuǎn)換為小寫、去除標(biāo)點(diǎn)符號(hào)、將所有 URL 替換成"URL",將所有數(shù)字替換成"NUMBER",或者甚至提取詞干(比如,截?cái)嘣~尾。有現(xiàn)成的 Python 庫(kù)可以做到這點(diǎn))。
然后 嘗試幾個(gè)不同的分類器,看看你可否建立一個(gè)很棒的垃圾郵件分類器,同時(shí)有著高召回率和高準(zhǔn)確率。
-
機(jī)器學(xué)習(xí)
+關(guān)注
關(guān)注
66文章
8503瀏覽量
134660 -
數(shù)據(jù)集
+關(guān)注
關(guān)注
4文章
1224瀏覽量
25460 -
tensorflow
+關(guān)注
關(guān)注
13文章
330瀏覽量
61187
原文標(biāo)題:【翻譯】Sklearn 與 TensorFlow 機(jī)器學(xué)習(xí)實(shí)用指南 —— 第3章 分類(下)
文章出處:【微信號(hào):AI_shequ,微信公眾號(hào):人工智能愛(ài)好者社區(qū)】歡迎添加關(guān)注!文章轉(zhuǎn)載請(qǐng)注明出處。
發(fā)布評(píng)論請(qǐng)先 登錄
【下載】《機(jī)器學(xué)習(xí)》+《機(jī)器學(xué)習(xí)實(shí)戰(zhàn)》
機(jī)器學(xué)習(xí)實(shí)踐指南——案例應(yīng)用解析
常用python機(jī)器學(xué)習(xí)庫(kù)盤點(diǎn)
如何使用Arm CMSIS-DSP實(shí)現(xiàn)經(jīng)典機(jī)器學(xué)習(xí)庫(kù)
誤差的分類及特點(diǎn)
多標(biāo)記學(xué)習(xí)的分類器圈方法
閾值分類器組合的多標(biāo)簽分類算法
關(guān)于機(jī)器學(xué)習(xí)PCA算法的主成分分析
關(guān)于機(jī)器學(xué)習(xí)的相關(guān)分析介紹

評(píng)論