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建立了一個能夠預測白葡萄酒品質的迴歸模型。模型的預測結果可以為葡萄酒的生產和評估提供參考。##### 主要發現:
資料準備:使用
csv2vw工具成功將CSV格式的資料轉換為vw支援的格式,並指定了正確的標籤列。資料分割:透過
shuf和split命令,成功將資料隨機分割為訓練集和測試集,以評估模型的泛化能力。模型訓練:利用vw的多種選項(如神經網路、二次特徵、L2正則化等),訓練出一個高效的迴歸模型。
模型測試:使用測試集對模型進行評估,獲得了預測結果。
最佳化模型引數:進一步調整vw的引數(如隱藏單元數量、正則化強度等),以獲得更好的預測效能。
擴充套件到其他型別葡萄酒:將此方法應用於紅葡萄酒或其他型別的葡萄酒,探索其適用性。
結合其他機器學習方法:比較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
內容解密:
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檔案中的第一列(真實值)。
tee results.csv:將輸入的內容輸出到results.csv檔案中,同時也輸出到標準輸出。tee命令用於將輸入的內容輸出到檔案和標準輸出。
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是總記錄數。
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
內容解密:
< results.csv header -a "predicted,observed":為results.csv檔案新增欄位名稱。header -a "predicted,observed"命令增加了欄位名稱"predicted"和"observed"。
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}'
內容解密:
- 第一行命令使用預設引數訓練模型,並將模型儲存到
wine2.model檔案中。 - 第二行命令使用訓練好的模型進行預測。
- 第三行命令計算預測結果的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
內容解密:
NUM_RED="$(< wine-red-clean.csv wc -l)":計算紅酒樣本的數量。csvstack命令合併紅酒和白酒的資料,並新增一個新的欄位"type"來區分紅酒和白酒。body shuf | head -n $NUM_RED:對白酒資料進行隨機抽樣,使其數量與紅酒樣本數量相同。nl -s, -w1 -v0 | sed '1s/0,/id,/':為資料新增一個"id"欄位。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
內容解密:
mkdir -p {train,test}:建立訓練集和測試集的目錄。< wine-balanced.csv header -d | shuf | split -d -n r/5 - wine-part-:將資料隨機分割成5份。- 將其中一份資料作為測試集,其餘作為訓練集。
設定實驗
接下來,我們需要設定一個實驗組態檔案,用於指定訓練和測試資料的位置、分類別器的選擇等。
[General]
experiment_name = wine
task = evaluate
[Input]
train_directory = train
test_directory = test
featuresets = [["features"]]
內容解密:
[General]部分指定了實驗的名稱和任務型別(評估)。[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
內容解密:
- task = classification:指定任務型別為分類別。
- train_file 和 test_file:分別指定訓練和測試資料集檔案。
- feature_scaling = both:對特徵進行標準化和歸一化處理。
- learners:指定要使用的分類別器列表,包括K近鄰、邏輯迴歸、決策樹和隨機森林。
- grid_search = false:關閉網格搜尋,用於調參。
- 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
混淆矩陣解讀:
混淆矩陣提供了真實標籤與預測標籤之間的對應關係,能夠評估模型的分類別效能。