CLOUD MACHINE LEARNING ENGINE簡介(第3部分)

目次

  • 這次GAE / J上的預測API
  • 關於演示程序
  • GCP項目設置
    • 準備使用CLOUD MACHINE LEARNING ENGINE
    • 創建服務帳戶
  • 創建一個Eclipse項目並添加一個庫
  • 創建PredictionLogic類
    • import語句,類聲明,常量聲明
    • 創建服務對象的方法
    • Insert
    • predict
  • 摘要

這次GAE / J上的預測API

大家好。預測API簡介最後是第3部分。

第1部分 CLOUD MACHINE LEARNING ENGINE進行概述,第2部分介紹在使用API瀏覽器,使用Java的客戶端庫此時執行方法,創造了一個演示程序使用GAE / J.的理論推斷API 在本文中,我們將介紹演示程序並使用Prediction API解釋邏輯部分的代碼。

這裡,Eclipse 4.3(Kepler)+ Google插件被假定為開發環境。

第一部分,第二部分的文章是這裡的

CLOUD MACHINE LEARNING ENGINE 簡介(第1部分)

CLOUD MACHINE LEARNING ENGINE 簡介(第2部分)

關於演示程序

您可以通過訪問以下URL來瀏覽演示程序。

https://z-hida-predictionapi.appspot.com/#/prediction-result

在該程序中,使用CLOUD MACHINE LEARNING ENGINE將與GAE和GCP相關的Tweet的內容分為Good(具有良好評價),Neutral(中性)和Bad(具有差評價)中的三個。顯示。然而,由於學習數據枯燥,結果的準確性是巨大的,但請耐心等待。

順便說一下,預測結果存儲在數據存儲區中,當訪問上述URL時,該值從數據存儲區中取出並顯示。

GCP項目設置

這次我們需要一些準備工作來使引入的代碼工作,所以我將解釋這個過程。

創建服務帳戶

演示程序使用一種創建服務帳戶並使用該帳戶訪問API的方法。本節介紹如何創建服務帳戶。

在Google Developers Console中選擇一個項目,然後單擊左側菜單中的“憑據”。接下來,單擊“創建新的客戶端ID”按鈕。

predictionapi3-credentials1

然後,將顯示一個對話框。選擇“服務帳戶”並單擊“創建客戶端ID”按鈕。

predictionapi3-credentials2

這將下載私鑰(擴展名為.p12的文件)並在對話框中顯示私鑰的密碼。單擊“確定”按鈕。

predictionapi3-credentials3

對話框關閉,顯示創建的服務帳戶的信息。

predictionapi3-credentials4

稍後您將需要創建的密鑰,密鑰的密碼以及服務帳戶的電子郵件地址。

創建一個Eclipse項目並添加一個庫

首先,創建一個GAE項目並將服務帳戶的私鑰複製到WEB-INF文件夾下。

接下來,將Client Library添加到構建路徑。在Navigator或Packege Explorer中,右鍵單擊該項目,然後選擇Google>添加Google API …. 在出現的對話框中,在搜索窗口中輸入CLOUD MACHINE LEARNING ENGINE以縮小範圍,選擇CLOUD MACHINE LEARNING ENGINE,然後單擊OK。

predictionapi3-eclipse1

創建PredictionLogic類

現在,從這裡開始,我將介紹和解釋在這次創建的示例中參與CLOUD MACHINE LEARNING ENGINE的代碼。在本節中,我們將創建一個名為PredictionLogic的類,並且我們將實現一個調用CLOUD MACHINE LEARNING ENGINE的方法。

import語句,類聲明,常量聲明

請根據需要替換PROJECT_ID,ACCOUNT_ID,PRIVATE_KEY_PATH和P12_PASSWORD的值。 代碼

import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;
import java.io.InputStream;
import java.security.KeyStore;
import java.security.KeyStoreException;
import java.security.NoSuchAlgorithmException;
import java.security.PrivateKey;
import java.security.UnrecoverableKeyException;
import java.security.cert.CertificateException;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Collections;
import java.util.List;
import com.google.api.client.extensions.appengine.http.UrlFetchTransport;
import com.google.api.client.googleapis.auth.oauth2.GoogleCredential;
import com.google.api.client.googleapis.batch.BatchRequest;
import com.google.api.client.googleapis.batch.json.JsonBatchCallback;
import com.google.api.client.googleapis.json.GoogleJsonError;
import com.google.api.client.http.HttpHeaders;
import com.google.api.client.http.HttpTransport;
import com.google.api.client.json.jackson2.JacksonFactory;
import com.google.api.services.prediction.Prediction;
import com.google.api.services.prediction.PredictionScopes;
import com.google.api.services.prediction.model.Input;
import com.google.api.services.prediction.model.Input.InputInput;
import com.google.api.services.prediction.model.Insert;
import com.google.api.services.prediction.model.Output;
public class PredictionLogic { private static final String PROJECT_ID = "GCP項目ID";
private static final String ACCOUNT_ID ="服務帳戶電子郵件地址";
private static final String PRIVATE_KEY_PATH = "WEB-INF/p12文件";
private static final String P12_PASSWORD = "p12文件密碼";
private static final String APPLICATION_NAME = "GAE_PREDCTION_EXAMPLE";
private static final String KEY_STYLE = "PKCS12";
private static final String KEY_ALIAS = "privateKey";
private static final HttpTransport HTTP_TRANSPORT = new UrlFetchTransport();
private static final JacksonFactory JSON_FACTORY = JacksonFactory.getDefaultInstance(); //(中略)}

創建服務對象的方法

首先,在此類中,實現一種方法來生成服務類的實例(com.google.api.services.prediction.Prediction),以便使用服務帳戶調用CLOUD MACHINE LEARNING ENGINE。

@SuppressWarnings("resource")
private PrivateKey loadPrivateKey() throws KeyStoreException, NoSuchAlgorithmException, CertificateException, IOException, UnrecoverableKeyException { File file = new File(PRIVATE_KEY_PATH); InputStream is = new FileInputStream(file);
KeyStore keystore = KeyStore.getInstance(KEY_STYLE); keystore.load(is, P12_PASSWORD.toCharArray());
return (PrivateKey) keystore.getKey(KEY_ALIAS, P12_PASSWORD.toCharArray());
}

private Prediction createPredictionService() throws UnrecoverableKeyException,
KeyStoreException,
NoSuchAlgorithmException,
CertificateException, IOException { GoogleCredential credential = new GoogleCredential.Builder() .setTransport(HTTP_TRANSPORT) .setJsonFactory(JSON_FACTORY) .setServiceAccountId(ACCOUNT_ID) .setServiceAccountScopes( Arrays.asList(PredictionScopes.PREDICTION, PredictionScopes.DEVSTORAGE_FULL_CONTROL)) .setServiceAccountPrivateKey(laodPrivateKey()) .build();
return new com.google.api.services.prediction.Prediction.Builder( HTTP_TRANSPORT, JSON_FACTORY, credential).setApplicationName(APPLICATION_NAME).build();
}

loadPrivateKey方法加載私鑰文件並將其作為PrivateKey類型返回,並在createPredictionService方法中調用。

createPredictionService方法首先創建一個GoogleCredential對象。該對象字面上包含認證所需的信息(服務帳戶ID,密鑰,使用的API範圍等)。將此對像傳遞給Prediction.Builder類並調用構建方法以創建Prediciton對象。

Insert

添加一個方法來執行Prediction API插入方法。

public void insert(String modelId, String csvPath) throws IOException,
UnrecoverableKeyException, KeyStoreException, NoSuchAlgorithmException, CertificateException { Prediction prediction = createPredictionService();
Insert insert = new Insert();
insert.setId(modelId); //指定收藏的modelId insert.setStorageDataLocation(csvPath); // csvPath具有“存儲桶名稱/文件路徑”的形式
prediction.trainedmodels().insert(PROJECT_ID, insert).execute();
}

在此示例中,使用GCS上的CSV文件生成模型作為訓練數據。在創建Insert對象並設置id和學習數據的路徑之後,執行學習過程。

Predict

執行CLOUD MACHINE LEARNING ENGINE的預測方法並添加一個方法來進行一次預測。

public Output predict(String modelId, String text)  
throws UnrecoverableKeyException, KeyStoreException, NoSuchAlgorithmException, CertificateException, IOException { Prediction prediction = createPredictionService();
InputInput inputInput = new InputInput(); inputInput.setCsvInstance(Collections.<Object> singletonList(text)); //將數據設置為預測
Input input = new Input();
input.setInput(inputInput);
return prediction.trainedmodels().predict(PROJECT_ID, modelId, input).execute();}

我在InputInput對像中設置了我想要預測的數據,然後在Input對像中設置它,然後執行預測過程。

由於要預測的數據結構僅為文本格式1列,因此setCsvInstance設置為僅包含要預測的文本的List。如果訓練數據是多列,請確保預測數據列表的順序與訓練數據相同。

預測結果存儲為Output類的對象。在此類中,結果以與JSON 相對應的形式(參見第2部分)保存,可以通過在API Explorer中執行predict來檢查。例如,在像這樣的標籤預測的情況下,您可以使用getOutputLabel()方法和getOutputMulti()獲得預測結果。對於預測數字的回歸預測,您可以使用getOutputValue()獲取預測值。

上面的例子是預測一個目標數據。接下來,添加一個在單個批處理中執行多個預測的方法。定義一個名為PredictionCallback的內部類,並註意該類的成員變量“result”包含每個案例的預測結果列表。

private static class PredictionCallback extends JsonBatchCallback<Output> {  
private List<Output> results = new ArrayList<>();
@Override
public void onSuccess(Output o, HttpHeaders responseHeaders) throws IOException { results.add(o); }
@Override
public void onFailure(GoogleJsonError e, HttpHeaders responseHeaders) throws IOException { results.add(null); }

public List<Output> getResults() { return results; }}

private List<Output> predictInSingleBatch(String modelId, List<String> texts) throws UnrecoverableKeyException, KeyStoreException,
NoSuchAlgorithmException,
CertificateException, IOException {
Prediction prediction = createPredictionService();
BatchRequest batch = prediction.batch();
PredictionCallback callback = new PredictionCallback();
for (String text : texts) {
InputInput inputInput = new InputInput();
inputInput.setCsvInstance(Collections.<Object> singletonList(text));
Input input = new Input();
input.setInput(inputInput);
prediction.trainedmodels().predict(PROJECT_ID, modelId, input).queue(batch, callback); }
batch.execute(); //經過這個過程結果存儲在callback
return callback.getResults();}

在上面的示例中,在執行batch.execute()之後,變量回調存儲預測結果。對於每個預測結果,執行PrectionCallback類的onSuccess()方法或onFailure()方法的處理,並將預測結果添加到結果中。

在這個例子中,在onFailure()方法中,暫時將null添加到結果中,但是在實際使用它時,定義了存儲錯誤消息的變量並進行處理,例如在那裡設置錯誤消息我認為實施起來很好。

摘要

如果您查看上述說明並使用客戶端庫,您可能會發現可以輕鬆使用CLOUD MACHINE LEARNING ENGINE。我這次介紹的代碼只使用insert和predict,但其他方法同樣簡單。

如果您有一個有趣的想法,那麼如何使用CLOUD MACHINE LEARNING ENGINE創建Web應用程序?

第1部分,第2部分的文章在這裡

CLOUD MACHINE LEARNING ENGINE 簡介(第1部分)

CLOUD MACHINE LEARNING ENGINE 簡介(第2部分)

Aaron Lee

超過6年的Google Cloud經驗,服務過上百家G Suite與GCP客戶,擔任多次研討會主講人與教育訓練講師,提供架構諮詢與技術支援,幫助各大企業上雲。

發佈留言