{}const=>[]async()letfn</>var
開発Python

Go + AI:機械学習でPythonなしで済むか?

Pythonは機械学習への唯一の道だと思いますか?Goはあなたを驚かせるかもしれません!モデルの推論、MLマイクロサービスの作成、データ処理にGoを使用する方法を分析します。GoがPythonよりも優れている場合、どのライブラリを使用するか、そして両方の言語を組み合わせて最大限の効率を得る方法を学びましょう。

К

Kodik

著者

3分で読める

そもそも、なぜ機械学習にGoを検討するのですか?

Pythonはプロトタイピングと研究に最適な言語ですが、限界があります。

  • 生産性: Pythonは、特に最適化されたライブラリがないと遅い

  • 並列処理:GIL(グローバルインタプリターロック)はマルチスレッドを複雑にする

  • 展開:依存関係のあるPythonアプリケーションのパッケージ化は、さらに難しいタスクです

  • 標準化:動的型付けは、本番環境でエラーにつながる可能性があります

Goはこれらの問題の多くを解決します。

  • 高性能なコンパイル言語

  • Goroutine を介した競合性のサポートを組み込み

  • 依存関係のない単一のバイナリファイル

  • 静的型付け

🔥 10万人以上の学生が参加中

理論を読むのに疲れた?
コーディングの時間だ!

Kodik — 実践でプログラミングを学ぶアプリ。AIメンター、インタラクティブなレッスン、実際のプロジェクト。

🤖 AI 24時間
🎓 修了証
💰 無料
🚀 始める
今日参加

GoでMLの分野で何ができますか?

1. 推論(既製モデルの適用)

最も一般的なシナリオは、すでにトレーニングされたモデルを使用することです。Pythonでモデルをトレーニングし、Goのプロダクションで使用します。

ONNXランタイムの例:

package main

import (
    "fmt"
    onnxruntime "github.com/yalue/onnxruntime_go"
)

func main() {
    // PyTorch/TensorFlowでトレーニングされたモデルを読み込みます
    session, err := onnxruntime.NewSession[float32](
        "model.onnx",
        []string{"input"},
        []string{"output"},
        nil,
    )
    if err != nil {
        panic(err)
    }
    defer session.Destroy()

    // 入力データを準備しています
    input := []float32{1.0, 2.0, 3.0, 4.0}
    
    // 予測を立てる
    output, err := session.Run([][]float32{input})
    if err != nil {
        panic(err)
    }
    
    fmt.Println("Prediction:", output[0])
}

2. 古典的な ML アルゴリズム

多くのタスクではニューラルネットワークは必要ありません。線形回帰、決定木、k平均などはすべてGoで実装できます。

GoLearnライブラリ:

package main

import (
    "fmt"
    "github.com/sjwhitworth/golearn/base"
    "github.com/sjwhitworth/golearn/evaluation"
    "github.com/sjwhitworth/golearn/knn"
)

func main() {
    // データを読み込んでいます
    rawData, err := base.ParseCSVToInstances("data.csv", true)
    if err != nil {
        panic(err)
    }

    // KNN分類子を作成する
    cls := knn.NewKnnClassifier("euclidean", "linear", 2)
    
    // トレーニングとテストに分割します
    trainData, testData := base.InstancesTrainTestSplit(rawData, 0.7)
    
    // 学習
    cls.Fit(trainData)
    
    // 精度を確認しています
    predictions, err := cls.Predict(testData)
    if err != nil {
        panic(err)
    }
    
    confusionMat, err := evaluation.GetConfusionMatrix(testData, predictions)
    if err != nil {
        panic(err)
    }
    
    fmt.Println(evaluation.GetAccuracy(confusionMat))
}

3. データ処理と特徴エンジニアリング

Goは、ETLパイプラインや大量のデータ処理に最適です。

package main

import (
    "encoding/csv"
    "os"
    "strconv"
    "sync"
)

type DataPoint struct {
    Feature1 float64
    Feature2 float64
    Label    int
}

func processData(filename string) ([]DataPoint, error) {
    file, err := os.Open(filename)
    if err != nil {
        return nil, err
    }
    defer file.Close()

    reader := csv.NewReader(file)
    records, err := reader.ReadAll()
    if err != nil {
        return nil, err
    }

    // ハードウェアを介した並列処理
    var wg sync.WaitGroup
    results := make([]DataPoint, len(records)-1)
    
    for i, record := range records[1:] {
        wg.Add(1)
        go func(idx int, rec []string) {
            defer wg.Done()
            
            f1, _ := strconv.ParseFloat(rec[0], 64)
            f2, _ := strconv.ParseFloat(rec[1], 64)
            label, _ := strconv.Atoi(rec[2])
            
            // 正規化またはその他の変換
            results[idx] = DataPoint{
                Feature1: (f1 - 50) / 10,
                Feature2: (f2 - 100) / 20,
                Label:    label,
            }
        }(i, record)
    }
    
    wg.Wait()
    return results, nil
}

4. ML のマイクロサービス

Goは、MLモデルに対応するAPIを作成するのに最適です。

package main

import (
    "encoding/json"
    "net/http"
    "log"
)

type PredictionRequest struct {
    Features []float64 `json:"features"`
}

type PredictionResponse struct {
    Prediction float64 `json:"prediction"`
    Confidence float64 `json:"confidence"`
}

func predictHandler(w http.ResponseWriter, r *http.Request) {
    var req PredictionRequest
    if err := json.NewDecoder(r.Body).Decode(&req); err != nil {
        http.Error(w, err.Error(), http.StatusBadRequest)
        return
    }

    // ここであなたのモデルを呼び出します
    prediction := runModel(req.Features)
    
    response := PredictionResponse{
        Prediction: prediction,
        Confidence: 0.95,
    }

    w.Header().Set("Content-Type", "application/json")
    json.NewEncoder(w).Encode(response)
}

func runModel(features []float64) float64 {
    // あなたの論理的な推論
    return 42.0
}

func main() {
    http.HandleFunc("/predict", predictHandler)
    log.Println("Server starting on :8080")
    log.Fatal(http.ListenAndServe(":8080", nil))
}

MLの人気Goライブラリ

  1. Gorgonia — PyTorch に似たニューラル ネットワークを構築するためのライブラリ

  2. GoLearn — 古典的なMLアルゴリズム

  3. Gonum — 数値計算(NumPyのアナログ)

  4. ONNX Runtime Go — ONNX モデルの起動

  5. TensorFlow Go — TensorFlowのGoバインディング

GoとPythonはいつ使うべきですか?

次の場合に Go を使用します。

  • 生産性の高い生産が必要です

  • 展開の容易さが重要です(1つのバイナリ)

  • 競合の負荷に対応

  • 既製のモデルを使用する(推論)

  • MLマイクロサービスを構築する

次の場合は Python を使用してください。

  • 研究と実験を行う

  • 複雑なニューラルネットワークをトレーニングする

  • 豊富なライブラリの選択肢が必要です

  • データサイエンティストのチームとの連携

最も実用的な選択肢:

  1. Python モデルのトレーニング、実験、データサイエンス

  2. Go 本番環境、API、データ処理用

このアプローチは、各言語の強みを活用します。

実例:推奨システム。

package main

import (
    "math"
    "sort"
)

type Item struct {
    ID       int
    Features []float64
}

type Recommendation struct {
    ItemID int
    Score  float64
}

// コシヌス類似性func cosineSimilarity(a, b []float64) float64 {
    var dotProduct, normA, normB float64
    
    for i := range a {
        dotProduct += a[i] * b[i]
        normA += a[i] * a[i]
        normB += b[i] * b[i]
    }
    
    return dotProduct / (math.Sqrt(normA) * math.Sqrt(normB))
}

// 推奨事項を取得するfunc getRecommendations(userPrefs []float64, items []Item, topN int) []Recommendation {
    recommendations := make([]Recommendation, len(items))
    
    for i, item := range items {
        recommendations[i] = Recommendation{
            ItemID: item.ID,
            Score:  cosineSimilarity(userPrefs, item.Features),
        }
    }
    
    // スコアで並べ替え
    sort.Slice(recommendations, func(i, j int) bool {
        return recommendations[i].Score > recommendations[j].Score
    })
    
    return recommendations[:topN]
}

func main() {
    userPrefs := []float64{0.8, 0.3, 0.9}
    
    items := []Item{
        {ID: 1, Features: []float64{0.9, 0.2, 0.8}},
        {ID: 2, Features: []float64{0.1, 0.9, 0.2}},
        {ID: 3, Features: []float64{0.7, 0.4, 0.9}},
    }
    
    recs := getRecommendations(userPrefs, items, 2)
    // 上位2つの推奨事項を表示します
}

結論

Goは、特に本番環境で、機械学習システムを構築するために十分に使用できます。はい、Pythonは複雑なモデルのトレーニングの標準であり続けますが、推論、データ処理、および高性能サービスの作成にはGoが最適です。

ツールの選択は常にタスクによって異なります。Python を完全に放棄する必要はありませんが、機械学習の分野での Go の機能を無視する必要もありません。

これらの内容は、 コディケ ― すべてを詳細に分析し、実際のタスクを実践して理解を深めます。当社では、Python、Go、JavaScriptなどの言語の構造化されたコースを実用的なアプリケーションに焦点を当てて提供しています。

サポートが必要で、同じ考えを持つ人とコードについて話し合いたい場合は、すでに 2000人以上のアクティブな開発者Telegramチャンネル、プログラミングを学ぶ過程で、いつでも助け、助言し、サポートしてくれます!

🚀開発者コミュニティに参加する コディケ!

🎯先延ばしをやめよう

記事は気に入った?
実践の時間だ!

Kodikでは読むだけでなく、すぐにコードを書く。理論 + 実践 = 本当のスキル。

即座に実践
🧠AIがコードを説明
🏆修了証

登録不要 • カード不要