Vowpal Wabbit 是一款高效能的機器學習工具,適用於處理大規模資料集。本文演示如何使用 Vowpal Wabbit 建立迴歸模型,預測白葡萄酒品質,並利用多種引數最佳化模型效能。過程中,我們將原始資料轉換為 Vowpal Wabbit 支援的格式,並分割資料集以進行模型訓練和測試。我們也使用平均絕對誤差(MAE)評估模型的準確性,並將預測結果與真實值進行視覺化比較,以深入理解模型的效能。此外,本文也示範如何使用 SciKit-Learn Laboratory 進行葡萄酒品種的二元分類別任務,比較了 K 近鄰、邏輯迴歸、決策樹和隨機森林等分類別器的效能,並使用混淆矩陣分析分類別結果,提供更全面的模型評估。

使用Vowpal Wabbit進行迴歸分析預測白葡萄酒品質

在本文中,我們將探討如何利用Vowpal Wabbit(vw)這款高效能的機器學習工具,對白葡萄酒的品質進行迴歸分析預測。我們將根據白葡萄酒的理化特性,建立一個能夠準確預測其品質的模型。

準備資料

首先,我們需要將原始的CSV格式資料轉換為vw所支援的格式。這可以透過csv2vw工具來完成。該工具能夠將CSV檔案轉換為vw格式,並指定哪一列是標籤(label)。

$ csv2vw wine-white-clean.csv --label quality | trim
6 | alcohol:8.8 chlorides:0.045 citric_acid:0.36 density:1.001 fixed_acidity:7 ...
6 | alcohol:9.5 chlorides:0.049 citric_acid:0.34 density:0.994 fixed_acidity:6....
6 | alcohol:10.1 chlorides:0.05 citric_acid:0.4 density:0.9951 fixed_acidity:8....
...

內容解密:

  • csv2vw工具將CSV檔案轉換為vw格式。
  • --label quality選項指定了quality列作為標籤。
  • 輸出結果中,每一行代表一個資料點,以標籤起始,後接特徵名稱和值。

資料分割

為了評估模型的準確性,我們需要將資料分割為訓練集和測試集。這裡,我們使用split命令將資料隨機分割為五等份,然後取其中一份作為測試集,其餘作為訓練集。

$ csv2vw wine-white-clean.csv --label quality |
> shuf |
> split -d -n r/5 - wine-part-
$ wc -l wine-part-*
980 wine-part-00
980 wine-part-01
980 wine-part-02
979 wine-part-03
979 wine-part-04
4898 total

內容解密:

  • shuf命令用於隨機打亂資料順序。
  • split命令將資料分割為五等份。
  • wc -l用於統計每個分割檔案的行數。

訓練模型

接下來,我們使用vw工具訓練迴歸模型。我們指定了多個選項,包括資料檔案、模型儲存路徑、迭代次數等。

$ vw \
> --data wine-train.vw \
> --final_regressor wine.model \
> --passes 10 \
> --cache_file wine.cache \
> --nn 3 \
> --quadratic :: \
> --l2 0.000005 \
> --bit_precision 25

內容解密:

  • --data wine-train.vw指定了訓練資料檔案。
  • --final_regressor wine.model指定了模型儲存路徑。
  • --passes 10表示迭代10次訓練資料。
  • --nn 3使用具有3個隱藏單元的神經網路。
  • --quadratic ::建立根據所有輸入特徵的二次特徵。
  • --l2 0.000005應用L2正則化。
  • --bit_precision 25設定特徵儲存的位元精確度。

測試模型

訓練完成後,我們使用測試資料評估模型的表現。

$ vw \
> --data wine-test.vw \
> --initial_regressor wine.model \
> --testonly \
> --predictions predictions \
> --quiet
$ bat predictions | trim
5.963508
6.166912
5.336860
...

內容解密:

  • --data wine-test.vw指定了測試資料檔案。
  • --initial_regressor wine.model載入之前訓練好的模型。
  • --testonly表示僅進行預測,不更新模型。
  • --predictions predictions將預測結果儲存到predictions檔案中。

透過上述步驟,我們成功地使用Vowpal Wabbit建立了一個能夠預測白葡萄酒品質的迴歸模型。模型的預測結果可以為葡萄酒的生產和評估提供參考。##### 主要發現:

  1. 資料準備:使用csv2vw工具成功將CSV格式的資料轉換為vw支援的格式,並指定了正確的標籤列。

  2. 資料分割:透過shufsplit命令,成功將資料隨機分割為訓練集和測試集,以評估模型的泛化能力。

  3. 模型訓練:利用vw的多種選項(如神經網路、二次特徵、L2正則化等),訓練出一個高效的迴歸模型。

  4. 模型測試:使用測試集對模型進行評估,獲得了預測結果。

  5. 最佳化模型引數:進一步調整vw的引數(如隱藏單元數量、正則化強度等),以獲得更好的預測效能。

  6. 擴充套件到其他型別葡萄酒:將此方法應用於紅葡萄酒或其他型別的葡萄酒,探索其適用性。

  7. 結合其他機器學習方法:比較vw與其他機器學習演算法(如隨機森林、梯度提升樹等)在葡萄酒品質預測上的表現,尋找最佳方案。

透過不斷最佳化和擴充套件,這種根據Vowpal Wabbit的迴歸分析方法有望在葡萄酒產業中發揮更大的作用,為生產者和消費者提供更準確的品質評估工具。

使用Vowpal Wabbit進行迴歸分析

在前面的章節中,我們已經瞭解瞭如何使用Vowpal Wabbit(vw)進行迴歸分析。現在,讓我們進一步探討如何評估模型的效能。

測試模型

首先,我們使用wine-test.vw檔案來測試模型。該模型儲存在wine.model檔案中。我們忽略標籤資訊,只是進行測試。預測結果儲存在名為predictions的檔案中。

vw -d wine-test.vw -i wine.model -t -p predictions --quiet

在這裡,我們使用vw命令進行測試。其中,-d引數指定了測試資料集,-i引數指定了模型檔案,-t引數表示只進行測試而不訓練模型,-p引數指定了預測結果的輸出檔案,--quiet引數禁止輸出診斷或進度更新。

計算平均絕對誤差(MAE)

接下來,我們使用paste命令將預測結果與真實值結合起來,並使用awk命令計算平均絕對誤差(MAE)。

paste -d, predictions <(cut -d '|' -f 1 wine-test.vw) | 
tee results.csv | 
awk -F, '{E+=sqrt(($1-$2)^2)} END {print "MAE: " E/NR}' | 
cowsay

內容解密:

  1. paste -d, predictions <(cut -d '|' -f 1 wine-test.vw):將預測結果與真實值結合起來,輸出到results.csv檔案中。

    • paste命令用於合併兩個檔案的內容。
    • -d,引數指定了分隔符為逗號。
    • <(cut -d '|' -f 1 wine-test.vw)是一個Process Substitution,它提取wine-test.vw檔案中的第一列(真實值)。
  2. tee results.csv:將輸入的內容輸出到results.csv檔案中,同時也輸出到標準輸出。

    • tee命令用於將輸入的內容輸出到檔案和標準輸出。
  3. awk -F, '{E+=sqrt(($1-$2)^2)} END {print "MAE: " E/NR}':計算平均絕對誤差(MAE)。

    • -F,引數指定了欄位分隔符為逗號。
    • {E+=sqrt(($1-$2)^2)}計算每個預測值與真實值之間的差的平方根,並累加到變數E中。
    • END {print "MAE: " E/NR}在處理完所有資料後,輸出平均絕對誤差(MAE),其中NR是總記錄數。
  4. cowsay:將輸出的結果以可愛的方式呈現。

結果分析

經過計算,我們得到的MAE約為0.569。這意味著我們的模型的預測值平均偏離真實值約0.6個單位。

視覺化結果

為了更直觀地瞭解預測值與真實值之間的關係,我們可以使用rush plot工具進行視覺化。

< results.csv header -a "predicted,observed" | 
rush plot --x observed --y predicted --geom jitter > wine-regression.png
display wine-regression.png

內容解密:

  1. < results.csv header -a "predicted,observed":為results.csv檔案新增欄位名稱。

    • header -a "predicted,observed"命令增加了欄位名稱"predicted"和"observed"。
  2. rush plot --x observed --y predicted --geom jitter > wine-regression.png:使用rush plot工具繪製散點圖。

    • --x observed --y predicted指定了x軸和y軸的欄位名稱。
    • --geom jitter表示使用抖動散點圖來避免點重疊。
    • > wine-regression.png將圖形輸出到wine-regression.png檔案中。

使用預設引數的模型效能

接下來,我們嘗試使用預設引數來訓練模型,並評估其效能。

vw -d wine-train.vw -f wine2.model --quiet
vw -data wine-test.vw -i wine2.model -t -p predictions --quiet
paste -d, predictions <(cut -d '|' -f 1 wine-test.vw) | 
awk -F, '{E+=sqrt(($1-$2)^2)} END {print "MAE: " E/NR}'

內容解密:

  1. 第一行命令使用預設引數訓練模型,並將模型儲存到wine2.model檔案中。
  2. 第二行命令使用訓練好的模型進行預測。
  3. 第三行命令計算預測結果的MAE。

結果顯示,使用預設引數的模型的MAE約為0.626,高於之前調優後的模型的MAE(0.569)。這表明調優後的模型效能更好。

使用SciKit-Learn Laboratory進行分類別

準備資料

首先,我們需要準備一個平衡的資料集,用於訓練和測試分類別模型。

NUM_RED="$(< wine-red-clean.csv wc -l)"
csvstack -n type -g red,white \
wine-red-clean.csv \
<( < wine-white-clean.csv body shuf | head -n $NUM_RED) | 
body shuf | 
nl -s, -w1 -v0 | 
sed '1s/0,/id,/' | 
tee wine-balanced.csv | csvlook

內容解密:

  1. NUM_RED="$(< wine-red-clean.csv wc -l)":計算紅酒樣本的數量。
  2. csvstack命令合併紅酒和白酒的資料,並新增一個新的欄位"type"來區分紅酒和白酒。
  3. body shuf | head -n $NUM_RED:對白酒資料進行隨機抽樣,使其數量與紅酒樣本數量相同。
  4. nl -s, -w1 -v0 | sed '1s/0,/id,/':為資料新增一個"id"欄位。
  5. tee wine-balanced.csv | csvlook:將結果儲存到wine-balanced.csv檔案中,並顯示其內容。

分割資料集

接下來,我們將平衡的資料集分割成訓練集和測試集。

mkdir -p {train,test}
HEADER="$(< wine-balanced.csv header)"
< wine-balanced.csv header -d | shuf | split -d -n r/5 - wine-part-
wc -l wine-part-*
cat wine-part-00 | header -a $HEADER > test/features.csv && rm wine-part-00
cat wine-part-* | header -a $HEADER > train/features.csv && rm wine-part-*
wc -l t*/features.csv

內容解密:

  1. mkdir -p {train,test}:建立訓練集和測試集的目錄。
  2. < wine-balanced.csv header -d | shuf | split -d -n r/5 - wine-part-:將資料隨機分割成5份。
  3. 將其中一份資料作為測試集,其餘作為訓練集。

設定實驗

接下來,我們需要設定一個實驗組態檔案,用於指定訓練和測試資料的位置、分類別器的選擇等。

[General]
experiment_name = wine
task = evaluate

[Input]
train_directory = train
test_directory = test
featuresets = [["features"]]

內容解密:

  1. [General]部分指定了實驗的名稱和任務型別(評估)。
  2. [Input]部分指定了訓練和測試資料的位置,以及使用的特徵集。

執行實驗

最後,我們可以使用SKLL執行實驗,訓練分類別模型並評估其效能。

skll classify.cfg

這樣,我們就完成了使用SciKit-Learn Laboratory進行分類別的實驗。接下來,我們可以根據實驗結果評估模型的效能,並進一步調優模型。

使用SciKit-Learn Laboratory進行分類別任務

SciKit-Learn Laboratory(skll)是一個用於簡化機器學習實驗的工具,尤其是在使用scikit-learn函式庫時。它允許使用者透過組態檔案定義實驗引數,從而簡化了模型訓練和評估的過程。

組態實驗引數

在skll中,實驗引數透過一個組態檔案進行定義。以下是一個範例組態檔案,用於進行葡萄酒分類別任務:

[Tuning]
grid_search = false
objectives = ["neg_mean_squared_error"]
param_grids = [{}, {}, {}, {}]

[Output]
logs = output
results = output
predictions = output
models = output

[General]
task = classification
train_file = wine_features.csv
test_file = wine_features.csv
feature_scaling = both
label_col = type
id_col = id
shuffle = true
learners = ["KNeighborsClassifier", "LogisticRegression", "DecisionTreeClassifier", "RandomForestClassifier"]
suffix = .csv

內容解密:

  1. task = classification:指定任務型別為分類別。
  2. train_file 和 test_file:分別指定訓練和測試資料集檔案。
  3. feature_scaling = both:對特徵進行標準化和歸一化處理。
  4. learners:指定要使用的分類別器列表,包括K近鄰、邏輯迴歸、決策樹和隨機森林。
  5. grid_search = false:關閉網格搜尋,用於調參。
  6. Output相關設定:指定輸出日誌、結果、預測和模型的目錄。

執行實驗

使用以下命令在本地模式下執行實驗:

$ skll -l classify.cfg 2>/dev/null

該命令指定了組態檔案classify.cfg並將錯誤輸出重定向到/dev/null

解析結果

實驗完成後,結果儲存在指定的輸出目錄中。目錄內容包括每個分類別器的日誌、模型、預測結果和評估結果等檔案。

結果檔案說明:

  • .log檔案:包含實驗過程中的日誌資訊。
  • .model檔案:儲存訓練好的模型。
  • _predictions.tsv:包含模型的預測結果。
  • .results和.results.json:包含模型的評估結果,包括準確率等指標。

評估模型效能

透過以下SQL查詢,可以提取分類別器的名稱和準確率,並按準確率排序:

$ < output/wine_summary.tsv csvsql --query "SELECT learner_name, accuracy FROM stdin ORDER BY accuracy DESC" | csvlook -I

結果:

| learner_name | accuracy | |





–|



| | RandomForestClassifier | 0.9890625 | | KNeighborsClassifier | 0.9875 | | LogisticRegression | 0.9859375 | | DecisionTreeClassifier | 0.9640625 |

從結果中可以看到,隨機森林分類別器(RandomForestClassifier)表現最佳。

混淆矩陣分析

每個分類別器的JSON結果檔案中包含了混淆矩陣,可以透過jq命令提取:

$ jq -r '.[] | "\(.learner_name):\n\(.result_table)\n"' output/*.json

混淆矩陣解讀:

混淆矩陣提供了真實標籤與預測標籤之間的對應關係,能夠評估模型的分類別效能。