| // Copyright 2014 The Go Authors. All rights reserved. | |
| // Use of this source code is governed by a BSD-style | |
| // license that can be found in the LICENSE file. | |
| package main | |
| import ( | |
| "fmt" | |
| "log" | |
| "net/http" | |
| "os" | |
| "path/filepath" | |
| "strings" | |
| "google.golang.org/api/googleapi" | |
| prediction "google.golang.org/api/prediction/v1.6" | |
| ) | |
| func init() { | |
| scopes := []string{ | |
| prediction.DevstorageFullControlScope, | |
| prediction.DevstorageReadOnlyScope, | |
| prediction.DevstorageReadWriteScope, | |
| prediction.PredictionScope, | |
| } | |
| registerDemo("prediction", strings.Join(scopes, " "), predictionMain) | |
| } | |
| type predictionType struct { | |
| api *prediction.Service | |
| projectNumber string | |
| bucketName string | |
| trainingFileName string | |
| modelName string | |
| } | |
| // This example demonstrates calling the Prediction API. | |
| // Training data is uploaded to a pre-created Google Cloud Storage Bucket and | |
| // then the Prediction API is called to train a model based on that data. | |
| // After a few minutes, the model should be completely trained and ready | |
| // for prediction. At that point, text is sent to the model and the Prediction | |
| // API attempts to classify the data, and the results are printed out. | |
| // | |
| // To get started, follow the instructions found in the "Hello Prediction!" | |
| // Getting Started Guide located here: | |
| // https://developers.google.com/prediction/docs/hello_world | |
| // | |
| // Example usage: | |
| // go-api-demo -clientid="my-clientid" -secret="my-secret" prediction | |
| // my-project-number my-bucket-name my-training-filename my-model-name | |
| // | |
| // Example output: | |
| // Predict result: language=Spanish | |
| // English Score: 0.000000 | |
| // French Score: 0.000000 | |
| // Spanish Score: 1.000000 | |
| // analyze: output feature text=&{157 English} | |
| // analyze: output feature text=&{149 French} | |
| // analyze: output feature text=&{100 Spanish} | |
| // feature text count=406 | |
| func predictionMain(client *http.Client, argv []string) { | |
| if len(argv) != 4 { | |
| fmt.Fprintln(os.Stderr, | |
| "Usage: prediction project_number bucket training_data model_name") | |
| return | |
| } | |
| api, err := prediction.New(client) | |
| if err != nil { | |
| log.Fatalf("unable to create prediction API client: %v", err) | |
| } | |
| t := &predictionType{ | |
| api: api, | |
| projectNumber: argv[0], | |
| bucketName: argv[1], | |
| trainingFileName: argv[2], | |
| modelName: argv[3], | |
| } | |
| t.trainModel() | |
| t.predictModel() | |
| } | |
| func (t *predictionType) trainModel() { | |
| // First, check to see if our trained model already exists. | |
| res, err := t.api.Trainedmodels.Get(t.projectNumber, t.modelName).Do() | |
| if err != nil { | |
| if ae, ok := err.(*googleapi.Error); ok && ae.Code != http.StatusNotFound { | |
| log.Fatalf("error getting trained model: %v", err) | |
| } | |
| log.Printf("Training model not found, creating new model.") | |
| res, err = t.api.Trainedmodels.Insert(t.projectNumber, &prediction.Insert{ | |
| Id: t.modelName, | |
| StorageDataLocation: filepath.Join(t.bucketName, t.trainingFileName), | |
| }).Do() | |
| if err != nil { | |
| log.Fatalf("unable to create trained model: %v", err) | |
| } | |
| } | |
| if res.TrainingStatus != "DONE" { | |
| // Wait for the trained model to finish training. | |
| fmt.Printf("Training model. Please wait and re-run program after a few minutes.") | |
| os.Exit(0) | |
| } | |
| } | |
| func (t *predictionType) predictModel() { | |
| // Model has now been trained. Predict with it. | |
| input := &prediction.Input{ | |
| Input: &prediction.InputInput{ | |
| CsvInstance: []interface{}{ | |
| "Hola, con quien hablo", | |
| }, | |
| }, | |
| } | |
| res, err := t.api.Trainedmodels.Predict(t.projectNumber, t.modelName, input).Do() | |
| if err != nil { | |
| log.Fatalf("unable to get trained prediction: %v", err) | |
| } | |
| fmt.Printf("Predict result: language=%v\n", res.OutputLabel) | |
| for _, m := range res.OutputMulti { | |
| fmt.Printf("%v Score: %v\n", m.Label, m.Score) | |
| } | |
| // Now analyze the model. | |
| an, err := t.api.Trainedmodels.Analyze(t.projectNumber, t.modelName).Do() | |
| if err != nil { | |
| log.Fatalf("unable to analyze trained model: %v", err) | |
| } | |
| for _, f := range an.DataDescription.OutputFeature.Text { | |
| fmt.Printf("analyze: output feature text=%v\n", f) | |
| } | |
| for _, f := range an.DataDescription.Features { | |
| fmt.Printf("feature text count=%v\n", f.Text.Count) | |
| } | |
| } |