設定機器學習演算法並使用 Java 開發您的第一個預測函數。 自動駕駛汽車、臉部辨識系統和語音助理都是使用機器學習技術和框架開發的。而這只是第一波。未來 10 年,新一代產品將改變我們的世界,帶來程序、產品和應用開發的新方法。
身為 Java 程式設計師,您希望抓住這波浪潮,因為科技公司開始大力投資機器學習。你今天學到的東西可以在未來五年中使用。但要從哪裡開始呢?本文旨在回答這個問題。透過遵循我們實施和準備機器學習演算法的簡短指南,您將對機器學習的原理有第一印象。在了解學習演算法的結構以及可用於訓練它、評估它並選擇提供最佳預測精度的函數之後,您將了解如何使用 JVM 框架 (Weka)建立機器學習解決方案。本文重點討論監督機器學習,因為它是開發智慧應用程式中最常用的原理。
機器學習和人工智慧
機器學習從人工智慧領域發展而來,旨在創造能夠模仿人類智慧的機器。儘管「機器學習」一詞起源於電腦科學,但人工智慧並不是一個新的科學領域。
圖靈測試由數學家阿蘭·圖靈在20世紀50年代初開發,是最早設計用於確定計算機是否具有真正智能的測試之一。根據圖靈測試,電腦透過模仿一個人來證明人類智慧的存在,而後者並沒有意識到他正在與機器交談。
當今許多流行的機器學習方法都基於幾十年前的想法。但過去十年的運算(和分散式運算平台)已經為應用機器學習演算法帶來了足夠的力量。其中大多數需要大量的矩陣乘法和其他數學計算。二十年前,進行此類計算的計算技術根本不存在,但現在它們已成為現實。機器學習演算法允許程式執行品質改進過程並擴展其功能,而無需人工幹預。使用機器學習開發的程式能夠獨立更新或擴展自己的程式碼。
監督學習與無監督學習
監督學習和無監督學習是兩種最受歡迎的機器學習方法。這兩種選擇都需要向機器提供大量資料記錄來建立關係並從中學習。這種收集的資料通常稱為
「特徵向量」。例如,我們有一棟住宅。在這種情況下,特徵向量可能包含諸如:房屋總面積、房間數量、房屋建造年份等特徵。
在監督式學習中,機器學習演算法被訓練來回答與特徵向量相關的問題。為了訓練演算法,需要輸入一組特徵向量和相關標籤。相關標籤由一個人(老師)提供,它包含所提問題的正確「答案」。學習演算法分析特徵向量和正確的標籤,以找到它們之間的內部結構和關係。這樣機器就能學會正確回答問題。作為一個例子,我們可以考慮一個房地產交易的智慧應用程式。它可以使用特徵向量進行訓練,包括一組房屋的大小、房間數量和建造年份。人們必須根據這些因素為每棟房子分配一個帶有正確價格的標籤。透過分析這些數據,智慧應用程式應該訓練自己回答這個問題:“我可以買這棟房子多少錢?”
一旦準備過程完成,新的輸入資料就不再被標記。機器必須能夠正確回答問題,即使對於未知的、未標記的特徵向量也是如此。在無監督學習中,演算法旨在無需人工標記(甚至無需提出問題)即可預測答案。無監督學習演算法不是確定標籤或結果,而是使用大型資料集和計算能力來發現以前未知的關係。例如,在消費品行銷中,無監督學習可用於識別隱藏的關係或客戶群體,這最終可以幫助改善行銷計劃或創建新的行銷計劃。在本文中,我們將重點放在監督機器學習;這是目前最常用的方法。
監督機器學習
所有的機器學習都是基於數據的。對於監督機器學習項目,您需要用標記來標記數據,以便為所提出的問題提供有意義的答案。在下面的表 1 中,每筆房屋資訊記錄都標示為「房價」。透過識別記錄資料和房屋價格之間的關係,該演算法最終應該能夠預測未包含在給定清單中的房屋的市場價格。(請注意,房屋面積以平方公尺表示,房屋價格以歐元表示)。
表1. 房屋清單
|
符號 |
符號 |
符號 |
標籤 |
房屋面積 |
房間的數量 |
房子的年齡 |
預計房價 |
90 平方米/295 英尺 |
2 間客房 |
23歲 |
249,000 歐元 |
101 平方米 / 331 英尺 |
3 間客房 |
不適用 |
338,000 歐元 |
1330 平方米 / 4363 英尺 |
11間客房 |
12年 |
6,500,000 歐元 |
在早期階段,您可能會手動標記數據,但最終您將教您的程式自行完成此操作。您可能已經看到這種方法適用於電子郵件用戶端,為了將電子郵件移至垃圾郵件資料夾,您需要回答「這封電子郵件是垃圾郵件嗎?」的問題。當您回覆時,您可以訓練程式識別您不想看到的電子郵件。應用程式的垃圾郵件過濾器經過訓練,可以標記來自相同來源或包含相同內容的郵件,並根據適當的規則對其進行管理。標記資料集僅用於準備和測試目的。完成此步驟後,機器學習演算法將處理未標記的資料。例如,您可以向預測演算法提供有關房屋的新的、未標記的資料記錄,它應該根據從準備資料中獲得的「知識」自動預測房屋的預期價格。
機器如何學習預測
監督機器學習的挑戰是為給定問題找到合適的預測函數。從數學上來說,困難在於找到一個以變數作為輸入
х
並傳回預測值的函數
у
。假設的這種功能
(hθ)
是準備過程的結果。假設函數通常也稱為目標函數或預測函數。
y = h θ (x)
大多數情況下,
х
它是一個資料數組。在我們的範例中,這是定義房屋的二維元素數組,由房間數量和房屋面積組成。這些值的陣列就是特徵向量。透過指定特定的目標函數,我們可以用它來預測每個特徵向量
х
。要預測房屋的價格,必須使用由
{101.0, 3.0}
房屋面積和房間數量組成的特徵向量來呼叫目標函數:
Function<Double[], Double> h = ...;
Double[] x = new Double[] { 101.0, 3.0 };
double y = h.apply(x);
在Example-1的原始碼中,陣列中的值
х
代表房屋特徵的向量。目標函數回傳的值
у
就是房屋的預測價格。機器學習的目標是確定在給定未知輸入參數的情況下盡可能準確地工作的目標函數。在機器學習中,目標函數
(hθ)
有時稱為模型。該模型是學習過程的結果。
基於標記的訓練樣本,學習演算法在訓練資料中尋找結構或模式。因此它建立了一個通常對數據有利的模型。一般來說,學習過程本質上是探索性的。在大多數情況下,使用不同的學習演算法和配置變體,該過程會重複多次。因此,所有模型都會根據性能指標進行評估,並選擇最好的模型。並且該模型用於計算未來未標記資料的估計值。
線性迴歸
要教機器“思考”,您首先需要選擇要使用的學習演算法。例如,線性迴歸。這是最簡單、最受歡迎的監督式機器學習演算法之一。此演算法假設輸入特徵和結果標記之間的關係是線性的。下面的一般線性迴歸函數透過將特徵向量的所有元素乘以參數
θ
(theta)求和來傳回預測值。此參數在訓練過程中用於根據訓練資料調整或「調整」回歸函數。
h θ (x) = θ 0 * 1 + θ 1 * x 1 + ... θ n * x n
在線性迴歸函數中,theta 參數和特徵參數以下標編號。
(θ)
下標決定了參數和特徵參數
(х)
在向量中的位置。請注意,x
0特徵是常數移位項,
1
對於計算目的很重要。因此,房屋面積等重要參數的索引以 x
1開頭。因此,如果為 x
1分配特徵向量的第一個值(房屋面積),則 x
2將採用下一個值(房間數),依此類推。範例 2 演示了線性迴歸函數的 Java 實現,在數學上表示為 h
θ (x)。為簡單起見,使用 進行計算
double
。在該方法中
apply()
,假設數組的第一個元素等於 1.0,並將在此函數之外設定。
範例 2:Java 中的線性迴歸
public class LinearRegressionFunction implements Function<Double[], Double> {
private final double[] thetaVector;
LinearRegressionFunction(double[] thetaVector) {
this.thetaVector = Arrays.copyOf(thetaVector, thetaVector.length);
}
public Double apply(Double[] featureVector) {
assert featureVector[0] == 1.0;
double prediction = 0;
for (int j = 0; j < thetaVector.length; j++) {
prediction += thetaVector[j] * featureVector[j];
}
return prediction;
}
public double[] getThetas() {
return Arrays.copyOf(thetaVector, thetaVector.length);
}
}
若要建立新實例
LinearRegressionFunction
,您需要指定參數
θ
。此參數或向量用於使一般線性迴歸函數適應基礎訓練資料。程式中使用的參數
θ
將在訓練過程中根據訓練範例進行調整。訓練後的目標函數的品質將取決於為訓練準備的資料的品質。在下面的例子中我們使用
LinearRegressionFunction
基於房屋大小的價格預測來進行說明。考慮到 x
0必須是值為 1.0 的常數,因此使用兩個參數 初始化目標函數
θ
,其中它們是學習過程的結果。建立新範例後,對面積為 1330 平方米的房屋的價格進行預測,如下所示:
double[] thetaVector = new double[] { 1.004579, 5.286822 };
LinearRegressionFunction targetFunction = new LinearRegressionFunction(thetaVector);
Double[] featureVector = new Double[] { 1.0, 1330.0 };
double predictedPrice = targetFunction.apply(featureVector);
在下圖中,您可以看到預測目標函數的圖表(藍線)。它是透過計算房屋面積所有值的目標函數而獲得的。此圖表還包含用於訓練的價格區域對。
現在預測圖看起來相當不錯。圖形的座標(位置和斜率)由向量 決定
θ { 1.004579, 5.286822 }
。但如何確定哪個
θ
向量最適合您的應用呢?如果更改第一個或第二個參數,函數是否會更適合?要確定最適合的 theta 向量,您需要一個效用函數來評估目標函數的工作效果。
待續 英文翻譯。作者:Gregor Roth,JavaWorld 軟體架構師。
GO TO FULL VERSION