成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

一文解決任何機器學習問題!

人工智能 機器學習
據挖掘大神Abhishek Thakur,很多數據挖掘kaggler對他都非常熟悉,他在 Linkedin 發表了一篇名為Approaching (Almost) Any Machine Learning Problem(幾乎解決任何機器學習問題)的文章,幾乎可以解決任何機器學習問題,可以說是他理論+實踐的最佳產物。這篇文章曾火遍 Kaggle。

前言

數據挖掘大神Abhishek Thakur,很多數據挖掘kaggler對他都非常熟悉,他在 Linkedin 發表了一篇名為Approaching (Almost) Any Machine Learning Problem(幾乎解決任何機器學習問題)的文章,幾乎可以解決任何機器學習問題,可以說是他理論+實踐的最佳產物。這篇文章曾火遍 Kaggle。

如上對Approaching (Almost) Any Machine Learning Problem進行了中文翻譯,詳細情況請參照書籍目錄,覆蓋了機器學習各個流程。下面我展示一下交叉檢驗章節的翻譯內容:

交叉檢驗

在上一章中,我們沒有建立任何模型。原因很簡單,在創建任何一種機器學習模型之前,我們必須知道什么是交叉檢驗,以及如何根據數據集選擇最佳交叉檢驗數據集。

那么,什么是交叉檢驗,我們為什么要關注它?

關于什么是交叉檢驗,我們可以找到多種定義。我的定義只有一句話:交叉檢驗是構建機器學習模型過程中的一個步驟,它可以幫助我們確保模型準確擬合數據,同時確保我們不會過擬合。但這又引出了另一個詞:過擬合

要解釋過擬合,我認為最好先看一個數據集。有一個相當有名的紅酒質量數據集(red wine quality dataset)。這個數據集有11個不同的特征,這些特征決定了紅酒的質量。

這些屬性包括:

  • 固定酸度(fixed acidity)
  • 揮發性酸度(volatile acidity)
  • 檸檬酸(citric acid)
  • 殘留糖(residual sugar)
  • 氯化物(chlorides)
  • 游離二氧化硫(free sulfur dioxide)
  • 二氧化硫總量(total sulfur dioxide)
  • 密度(density)
  • PH值(pH)
  • 硫酸鹽(sulphates)
  • 酒精(alcohol)

根據這些不同特征,我們需要預測紅葡萄酒的質量,質量值介于0到10之間。

讓我們看看這些數據是怎樣的。

import pandas as pd
df = pd.read_csv("winequality-red.csv")

圖 1:紅葡萄酒質量數據集簡單展示圖 1:紅葡萄酒質量數據集簡單展示

我們可以將這個問題視為分類問題,也可以視為回歸問題。為了簡單起見,我們選擇分類。然而,這個數據集值包含6種質量值。因此,我們將所有質量值映射到0到5之間。

quality_mapping = {
    3: 0,
    4: 1,
    5: 2,
    6: 3,
    7: 4,
    8: 5
}
df.loc[:, "quality"] = df.quality.map(quality_mapping)

當我們看大這些數據并將其視為一個分類問題時,我們腦海中會浮現出很多可以應用的算法,也許,我們可以使用神經網絡。但是,如果我們從一開始就深入研究神經網絡,那就有點牽強了。所以,讓我們從簡單的、我們也能可視化的東西開始:決策樹。

在開始了解什么是過擬合之前,我們先將數據分為兩部分。這個數據集有1599個樣本。我們保留1000個樣本用于訓練,599個樣本作為一個單獨的集合。

以下代碼可以輕松完成劃分:

df = df.sample(frac=1).reset_index(drop=True)

df_train = df.head(1000)
df_test = df.tail(599)

現在,我們將在訓練集上使用scikit-learn訓練一個決策樹模型。

from sklearn import tree 
from sklearn import metrics

clf = tree.DecisionTreeClassifier(max_depth=3) 

cols = ['fixed acidity',
        'volatile acidity',
        'citric acid',
        'residual sugar',
        'chlorides',
        'free sulfur dioxide',
        'total sulfur dioxide',
        'density',
        'pH',
        'sulphates',
        'alcohol']

clf.fit(df_train[cols], df_train.quality)

請注意,我將決策樹分類器的最大深度(max_depth)設為3。該模型的所有其他參數均保持默認值。現在,我們在訓練集和測試集上測試該模型的準確性:

train_predictions = clf.predict(df_train[cols])

test_predictions = clf.predict(df_test[cols])

train_accuracy = metrics.accuracy_score(
    df_train.quality, train_predictions
)

test_accuracy = metrics.accuracy_score(
    df_test.quality, test_predictions
)

訓練和測試的準確率分別為58.9%和54.25%。現在,我們將最大深度(max_depth)增加到7,并重復上述過程。這樣,訓練準確率為76.6%,測試準確率為57.3%。在這里,我們使用準確率,主要是因為它是最直接的指標。對于這個問題來說,它可能不是最好的指標。我們可以根據最大深度(max_depth)的不同值來計算這些準確率,并繪制曲線圖。

from sklearn import tree
from sklearn import metrics 
import matplotlib
import matplotlib.pyplot as plt
import seaborn as sns
matplotlib.rc('xtick', labelsize=20)
matplotlib.rc('ytick', labelsize=20)
%matplotlib inline
train_accuracies = [0.5]
test_accuracies = [0.5]
for depth in range(1, 25):
    clf = tree.DecisionTreeClassifier(max_depth=depth)
    cols = [
        'fixed acidity',
        'volatile acidity',
        'citric acid',
        'residual sugar',
        'chlorides',
        'free sulfur dioxide',
        'total sulfur dioxide',
        'density',
        'pH',
        'sulphates',
        'alcohol'
    ]
    clf.fit(df_train[cols], df_train.quality)
    train_predictions = clf.predict(df_train[cols]) 
    test_predictions = clf.predict(df_test[cols])

    train_accuracy = metrics.accuracy_score(
        df_train.quality, train_predictions
    )
    test_accuracy = metrics.accuracy_score(
        df_test.quality, test_predictions
    )
    train_accuracies.append(train_accuracy)
    test_accuracies.append(test_accuracy)

plt.figure(figsize=(10, 5)) 
sns.set_style("whitegrid")
plt.plot(train_accuracies, label="train accuracy")
plt.plot(test_accuracies, label="test accuracy")
plt.legend(loc="upper left", prop={'size': 15})
plt.xticks(range(0, 26, 5))
plt.xlabel("max_depth", size=20)
plt.ylabel("accuracy", size=20)
plt.show()

這將生成如圖 2 所示的曲線圖。

圖 2:不同 max_depth 訓練和測試準確率圖 2:不同 max_depth 訓練和測試準確率

我們可以看到,當最大深度(max_depth)的值為14時,測試數據的得分最高。隨著我們不斷增加這個參數的值,測試準確率會保持不變或變差,但訓練準確率會不斷提高。這說明,隨著最大深度(max_depth)的增加,決策樹模型對訓練數據的學習效果越來越好,但測試數據的性能卻絲毫沒有提高。

這就是所謂的過擬合

模型在訓練集上完全擬合,而在測試集上卻表現不佳。這意味著模型可以很好地學習訓練數據,但無法泛化到未見過的樣本上。在上面的數據集中,我們可以建立一個最大深度(max_depth)非常高的模型,它在訓練數據上會有出色的結果,但這種模型并不實用,因為它在真實世界的樣本或實時數據上不會提供類似的結果。

有人可能會說,這種方法并沒有過擬合,因為測試集的準確率基本保持不變。過擬合的另一個定義是,當我們不斷提高訓練損失時,測試損失也在增加。這種情況在神經網絡中非常常見。

每當我們訓練一個神經網絡時,都必須在訓練期間監控訓練集和測試集的損失。如果我們有一個非常大的網絡來處理一個非常小的數據集(即樣本數非常少),我們就會觀察到,隨著我們不斷訓練,訓練集和測試集的損失都會減少。但是,在某個時刻,測試損失會達到最小值,之后,即使訓練損失進一步減少,測試損失也會開始增加。我們必須在驗證損失達到最小值時停止訓練。

這是對過擬合最常見的解釋

奧卡姆剃刀用簡單的話說,就是不要試圖把可以用簡單得多的方法解決的事情復雜化。換句話說,最簡單的解決方案就是最具通用性的解決方案。一般來說,只要你的模型不符合奧卡姆剃刀原則,就很可能是過擬合。

圖 3:過擬合的最一般定義圖 3:過擬合的最一般定義

現在我們可以回到交叉檢驗。

在解釋過擬合時,我決定將數據分為兩部分。我在其中一部分上訓練模型,然后在另一部分上檢查其性能。這也是交叉檢驗的一種,通常被稱為 "暫留集"(hold-out set)。當我們擁有大量數據,而模型推理是一個耗時的過程時,我們就會使用這種(交叉)驗證。

交叉檢驗有許多不同的方法,它是建立一個良好的機器學習模型的最關鍵步驟。選擇正確的交叉檢驗取決于所處理的數據集,在一個數據集上適用的交叉檢驗也可能不適用于其他數據集。不過,有幾種類型的交叉檢驗技術最為流行和廣泛使用。

其中包括:

  • k折交叉檢驗
  • 分層k折交叉檢驗
  • 暫留交叉檢驗
  • 留一交叉檢驗
  • 分組k折交叉檢驗

交叉檢驗是將訓練數據分層幾個部分,我們在其中一部分上訓練模型,然后在其余部分上進行測試。請看圖4。

圖 4:將數據集拆分為訓練集和驗證集圖 4:將數據集拆分為訓練集和驗證集

圖 4 和圖 5 說明,當你得到一個數據集來構建機器學習模型時,你會把它們分成兩個不同的集:訓練集和驗證集。很多人還會將其分成第三組,稱之為測試集。不過,我們將只使用兩個集。如你所見,我們將樣本和與之相關的目標進行了劃分。我們可以將數據分為 k 個互不關聯的不同集合。這就是所謂的 k 折交叉檢驗

圖 5:K 折交叉檢驗圖 5:K 折交叉檢驗

我們可以使用scikit-learn中的KFold將任何數據分割成k個相等的部分。每個樣本分配一個從0到k-1的值。

import pandas as pd
from sklearn import model_selection

if __name__ == "__main__":
    df = pd.read_csv("train.csv")
    df["kfold"] = -1
    df = df.sample(frac=1).reset_index(drop=True)
    kf = model_selection.KFold(n_splits=5)
    for fold, (trn_, val_) in enumerate(kf.split(X=df)): 
        df.loc[val_, 'kfold'] = fold
        df.to_csv("train_folds.csv", index=False)

幾乎所有類型的數據集都可以使用此流程。例如,當數據圖像時,您可以創建一個包含圖像 ID、圖像位置和圖像標簽的 CSV,然后使用上述流程。

另一種重要的交叉檢驗類型是分層k折交叉檢驗。如果你有一個偏斜的二元分類數據集,其中正樣本占 90%,負樣本只占 10%,那么你就不應該使用隨機 k 折交叉。對這樣的數據集使用簡單的k折交叉檢驗可能會導致折疊樣本全部為負樣本。在這種情況下,我們更傾向于使用分層 k 折交叉檢驗。分層 k 折交叉檢驗可以保持每個折中標簽的比例不變。因此,在每個折疊中,都會有相同的 90% 正樣本和 10% 負樣本。因此,無論您選擇什么指標進行評估,都會在所有折疊中得到相似的結果。

修改創建 k 折交叉檢驗的代碼以創建分層 k 折交叉檢驗也很容易。我們只需將 model_selection.KFold更改為 model_selection.StratifiedKFold ,并在 kf.split(...) 函數中指定要分層的目標列。我們假設 CSV 數據集有一列名為 "target" ,并且是一個分類問題。

import pandas as pd
from sklearn import model_selection 
if __name__ == "__main__":
    df = pd.read_csv("train.csv")
    df["kfold"] = -1
    df = df.sample(frac=1).reset_index(drop=True)
    y = df.target.values
    kf = model_selection.StratifiedKFold(n_splits=5)
    for f, (t_, v_) in enumerate(kf.split(X=df, y=y)): 
        df.loc[v_, 'kfold'] = f
        df.to_csv("train_folds.csv", index=False)

對于葡萄酒數據集,我們來看看標簽的分布情況。

b = sns.countplot(x='quality', data=df)
b.set_xlabel("quality", fontsize=20) 
b.set_ylabel("count", fontsize=20)

請注意,我們繼續上面的代碼。因此,我們已經轉換了目標值。從圖 6 中我們可以看出,質量偏差很大。有些類別有很多樣本,有些則沒有那么多。如果我們進行簡單的k折交叉檢驗,那么每個折疊中的目標值分布都不會相同。因此,在這種情況下,我們選擇分層 k 折交叉檢驗。

圖 6:葡萄酒數據集中 "質量" 分布情況圖 6:葡萄酒數據集中 "質量" 分布情況

規則很簡單,如果是標準分類問題,就盲目選擇分層k折交叉檢驗。

但如果數據量很大,該怎么辦呢?假設我們有 100 萬個樣本。5 倍交叉檢驗意味著在 800k 個樣本上進行訓練,在 200k 個樣本上進行驗證。根據我們選擇的算法,對于這樣規模的數據集來說,訓練甚至驗證都可能非常昂貴。在這種情況下,我們可以選擇暫留交叉檢驗

創建保持結果的過程與分層 k 折交叉檢驗相同。對于擁有 100 萬個樣本的數據集,我們可以創建 10 個折疊而不是 5 個,并保留其中一個折疊作為保留樣本。這意味著,我們將有 10 萬個樣本被保留下來,我們將始終在這個樣本集上計算損失、準確率和其他指標,并在 90 萬個樣本上進行訓練。

在處理時間序列數據時,暫留交叉檢驗也非常常用。假設我們要解決的問題是預測一家商店 2020 年的銷售額,而我們得到的是 2015-2019 年的所有數據。在這種情況下,你可以選擇 2019 年的所有數據作為保留數據,然后在 2015 年至 2018 年的所有數據上訓練你的模型。

圖 7:時間序列數據示例圖 7:時間序列數據示例

在圖 7 所示的示例中,假設我們的任務是預測從時間步驟 31 到 40 的銷售額。我們可以保留 21 至 30 步的數據,然后從 0 步到 20 步訓練模型。需要注意的是,在預測 31 步至 40 步時,應將 21 步至 30 步的數據納入模型,否則,模型的性能將大打折扣。

在很多情況下,我們必須處理小型數據集,而創建大型驗證集意味著模型學習會丟失大量數據。在這種情況下,我們可以選擇留一交叉檢驗,相當于特殊的 k 則交叉檢驗其中 k=N ,N 是數據集中的樣本數。這意味著在所有的訓練折疊中,我們將對除 1 之外的所有數據樣本進行訓練。這種類型的交叉檢驗的折疊數與數據集中的樣本數相同。

需要注意的是,如果模型的速度不夠快,這種類型的交叉檢驗可能會耗費大量時間,但由于這種交叉檢驗只適用于小型數據集,因此并不重要。

現在我們可以轉向回歸問題了。回歸問題的好處在于,除了分層 k 折交叉檢驗之外,我們可以在回歸問題上使用上述所有交叉檢驗技術。也就是說,我們不能直接使用分層 k 折交叉檢驗,但有一些方法可以稍稍改變問題,從而在回歸問題中使用分層 k 折交叉檢驗。大多數情況下,簡單的 k 折交叉檢驗適用于任何回歸問題。但是,如果發現目標分布不一致,就可以使用分層 k 折交叉檢驗。

要在回歸問題中使用分層 k 折交叉檢驗,我們必須先將目標劃分為若干個分層,然后再以處理分類問題的相同方式使用分層 k 折交叉檢驗。選擇合適的分層數有幾種選擇。如果樣本量很大(> 10k,> 100k),那么就不需要考慮分層的數量。只需將數據分為 10 或 20層即可。如果樣本數不多,則可以使用 Sturge's Rule 這樣的簡單規則來計算適當的分層數。

Sturge's Rule: ????????????=1+???2(?) 其中 $N$ 是數據集中的樣本數。該函數如圖8所示。

圖 8:利用斯特格法則繪制樣本與箱數對比圖圖 8:利用斯特格法則繪制樣本與箱數對比圖

讓我們制作一個回歸數據集樣本,并嘗試應用分層 k 折交叉檢驗,如下面的 python 代碼段所示。

import numpy as np
import pandas as pd
from sklearn import datasets
from sklearn import model_selection

def create_folds(data):
    data["kfold"] = -1
    data = data.sample(frac=1).reset_index(drop=True)

    num_bins = int(np.floor(1 + np.log2(len(data)))) 
    data.loc[:, "bins"] = pd.cut(
        data["target"], bins=num_bins, labels=False 
    )
    kf = model_selection.StratifiedKFold(n_splits=5)
    for f, (t_, v_) in enumerate(kf.split(X=data, y=data.bins.values)): 
        data.loc[v_, 'kfold'] = f
        data = data.drop("bins", axis=1) 
    return data

if __name__ == "__main__":
    X, y = datasets.make_regression(
        n_samples=15000, n_features=100, n_targets=1 
    )
df = pd.DataFrame(
    X,
    columns=[f"f_{i}" for i in range(X.shape[1])] 
)
df.loc[:, "target"] = y 
df = create_folds(df)

交叉檢驗是構建機器學習模型的第一步,也是最基本的一步。如果要做特征工程,首先要拆分數據。如果要建立模型,首先要拆分數據。如果你有一個好的交叉檢驗方案,其中驗證數據能夠代表訓練數據和真實世界的數據,那么你就能建立一個具有高度通用性的好的機器學習模型。

本章介紹的交叉檢驗類型幾乎適用于所有機器學習問題。不過,你必須記住,交叉檢驗也在很大程度上取決于數據,你可能需要根據你的問題和數據采用新的交叉檢驗形式。

例如,假設我們有一個問題,希望建立一個模型,從患者的皮膚圖像中檢測出皮膚癌。我們的任務是建立一個二元分類器,該分類器接收輸入圖像并預測其良性或惡性的概率。

在這類數據集中,訓練數據集中可能有同一患者的多張圖像。因此,要在這里建立一個良好的交叉檢驗系統,必須有分層的 k 折交叉檢驗,但也必須確保訓練數據中的患者不會出現在驗證數據中。幸運的是,scikit-learn 提供了一種稱為 GroupKFold 的交叉檢驗類型。在這里,患者可以被視為組。但遺憾的是,scikit-learn 無法將 GroupKFold 與 StratifiedKFold 結合起來。所以你需要自己動手。我把它作為一個練習留給讀者的練習。

責任編輯:華軒 來源: 數據分析及應用
相關推薦

2023-05-11 15:24:12

2023-07-26 07:22:32

2020-11-08 13:33:05

機器學習數據中毒人工智能

2020-05-12 15:40:06

MySQ數據庫索引

2017-10-24 11:19:16

深度學習機器學習數據

2022-01-06 07:45:44

機器學習算法思路

2018-10-18 11:00:50

人工智能機器學習模型偏差

2012-02-09 13:47:11

360

2017-10-22 06:05:28

語音識別深度學習ASR

2024-05-21 09:45:40

機器學習人工智能XAI

2024-03-01 19:26:22

2024-04-09 14:04:38

人工智能機器學習

2018-08-08 16:08:45

深度學習機器學習NLP

2017-07-21 10:42:27

自動駕駛應用機器學習

2022-08-11 13:49:37

機器學習技術

2018-08-23 04:26:54

合成數據機器學習數據集

2018-11-16 09:08:35

2022-03-01 20:41:00

機器學習特征人工智能

2017-12-01 12:36:54

LDA模型機器

2022-04-11 10:56:43

線程安全
點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: 蜜臀久久99精品久久久久野外 | 一二三四在线视频观看社区 | 黄色片免费在线观看 | 午夜视频一区 | 成人精品一区二区三区中文字幕 | 亚洲精品乱码久久久久久久久久 | 99在线精品视频 | 99re99| 中文字幕97 | 欧美日韩综合精品 | 国产小视频在线看 | 日韩一区二区在线视频 | 国产精品九九九 | 国产免费一区 | www.成人免费视频 | 欧美亚洲国语精品一区二区 | 久久久精品天堂 | 欧美精品一区二区在线观看 | 在线免费观看a级片 | 九色在线观看 | 欧美福利精品 | 精品视频一区二区三区 | 国产 日韩 欧美 在线 | 欧美一区二区三区在线观看视频 | 国产亚洲精品美女久久久久久久久久 | 特级黄一级播放 | 欧美一区二区三区在线观看视频 | 国产一级视屏 | 国产精品视频综合 | av片在线观看网站 | 亚洲精品乱码久久久久久久久 | 欧美亚洲一区二区三区 | 国产成人高清视频 | 亚洲日韩第一页 | 人操人人 | 国产精品视频一区二区三区不卡 | 九色 在线 | 欧美激情一区二区 | 国产精品国产成人国产三级 | 精品一区二区三区在线观看国产 | 999re5这里只有精品 |