GitHubじゃ!Pythonじゃ!

GitHubからPython関係の優良リポジトリを探したかったのじゃー、でも英語は出来ないから日本語で読むのじゃー、英語社会世知辛いのじゃー

instacart

lore – Loreは、機械学習をソフトウェアエンジニアにとって親しみやすくし、機械学習研究者にとって維持可能にする

投稿日:

Loreは、機械学習をソフトウェアエンジニアにとって親しみやすくし、機械学習研究者にとって維持可能にする

伝承

Loreは、機械学習がエンジニアにとって親しみやすく、データサイエンティストにとって維持可能にするためのPythonフレームワークです。

特徴

  • モデルは、データパイプラインを使って見積もりの​​超パラメータ検索をサポートします。 彼らは、複数のGPU(利用可能な場合)を2つの異なる戦略で効率的に利用し、水平スケーラビリティのために保存し配布することができます。
  • ケラス (TensorFlow / Theano / CNTK)、 XGBoostSciKit Learnなど、複数のパッケージからの見積もりがサポートされています。 それらはすべて、ビルド、フィット、またはオーバーライドされた予測でサブクラス化され、アルゴリズムやアーキテクチャを完全にカスタマイズすることができます。
  • パイプラインは、列車とテストセット間の情報漏えいを防ぎます。また、1つのパイプラインによって、さまざまな見積もりを試すことができます。 使用可能なマシンのRAMを超えると、ディスクベースのパイプラインが使用可能になります。
  • トランスフォーマーは高度なフィーチャー・エンジニアリングを標準化 たとえば、米国の国勢調査データを使用して、アメリカのファーストネームを統計年齢または性別に変換します。 自由形式の電話番号文字列から地域コードを抽出します。 一般的な日付、時刻、文字列操作は、パンダで効率的にサポートされています。
  • エンコーダは見積もりに堅牢な入力を提供し、欠落した長いテール値に関する一般的な問題を回避します。 彼らは、ゴミ/ゴミからあなたを救うためによくテストされています。
  • IO接続は、一般的なORM単一行操作ではなく、バルクデータに対するトランザクション管理と読み込みの最適化を使用して、一般的な(no)sqlデータベース用にアプリケーション全体に標準的な方法で設定およびプールされます。 モデルとデータセットを配布するための暗号化されたS3バケットに加えて、接続は設定可能なクエリキャッシュを共有します。
  • 開発中の個々のアプリケーションの依存関係管理。生産に100%複製することができます。 手動のアクティベーション、またはmagic env vars、または他のすべてのためにPythonを壊す隠しファイルはありません。 venv、pyenv、pyvenv、virtualenv、virtualenvwrapper、pipenv、condaの知識は必要ありません。 誰もそんな暇なんかありはせん。
  • モデルのテストは継続的インテグレーション環境で実行できるため、インフラストラクチャチームの作業を増やすことなく、コードとトレーニングの更新を継続的に展開できます。
  • ワークフローコマンドライン、Pythonコンソール、jupyterノートブック、またはIDEを好むかどうかをサポートします。 すべての環境では、本番環境と開発環境の両方で読み取り可能なロギングとタイミングステートメントが設定されます。

Loreプロジェクトを作成する

この例では、ネストされたトランスフォーマーと、機能first_nameと応答has_subscription列を持つpostgresデータベースユーザーテーブルでlore.ioを使用する方法を示します。 データベースを作成したくない場合は、データベース上の無料のサンプルアプリケーションに従うことができます。

$ pip install lore
$ lore init my_app --python-version=3.6.4 --keras --xgboost --postgres

# fix up .env, config/database.cfg, circle.yml, README.rst

かわいい小さな例

私たちは、ユーザがファーストネームであれば、加入者であるかどうかを素直に予測しようとします。

config / database.cfgを更新して、データベースURLを指定します。

# config/database.cfg

[MAIN]
url: $DATABASE_URL

.envファイルを使用してloreプロセスのみの環境変数を設定することができます。

# .env
DATABASE_URL=postgres://localhost:5432/development

データを指定するSQLファイルを作成します。

-- my_app/extracts/subscribers.sql
SELECT
  first_name,
  has_subscription
FROM users
LIMIT = %(limit)s

パイプラインは、ほとんどの機械学習アプリケーションでは不可欠ですが、不可欠なコンポーネントです。 生データをモデルのエンコードされたトレーニング(および予測)データに変換します。 Loreにはデータをより美味しくするためのいくつかの機能があります。

# my_app/pipelines/subscribers.py
import lore.io
import lore.pipelines
from lore.encoders import Norm, Discrete, Boolean, Unique
from lore.transformers import NameAge, NameSex, Log


class Holdout(lore.pipelines.holdout.Base):

    def get_data(self):
        # lore.io.main is a Connection created by config/database.cfg + DATABASE_URL
        # dataframe() supports keyword args for interpolation (limit)
        # subscribers is the name of the extract
        # cache=True enables LRU query caching
        return lore.io.main.dataframe(filename='subscribers', limit=100, cache=True)

    def get_encoders(self):
        # An arbitrairily chosen set of encoders (w/ transformers)
        # that reference sql columns in the extract by name.
        # A fair bit of thought will probably go into expanding
        # your list with features for your model.
        return (
            Unique('first_name', minimum_occurrences=100),
            Norm(Log(NameAge('first_name'))),
            Discrete(NameSex('first_name'), bins=10),
        )

    def get_output_encoder(self):
        # A single encoder that references the predicted outcome
        return Boolean('has_subscription')

スーパークラスlore.pipelines.base.Holdoutは次の処理をlore.pipelines.base.Holdoutます:

  • データをtraining_data / validation_data / test_dataデータフレームに分割する
  • training_dataにエンコーダを取り付ける
  • モデルのtraining_data / validation_data / test_dataを変換する

データに適合し、予測するいくつかのモデルを定義する。 ベースモデルは、拡張されオーバーライドされるように設計されていますが、デフォルトですぐに使用できます。

# my_app/models/subscribers.py
import lore.models.keras
import lore.models.xgboost
import lore.estimators.keras
import lore.estimators.xgboost

from my_app.pipelines.subscribers import Holdout


class DeepName(lore.models.keras.Base):
    def __init__(self):
        super(DeepName, self).__init__(
            pipeline=Holdout(),
            estimator=lore.estimators.keras.BinaryClassifier() # a canned estimator for deep learning
        )


class BoostedName(lore.models.xgboost.Base):
    def __init__(self):
        super(BoostedName, self).__init__(
            pipeline=Holdout(),
            estimator=lore.estimators.xgboost.Base() # a canned estimator for XGBoost
        )

モデルの予測力をテストする:

# tests/unit/test_subscribers.py
import unittest

from my_app.models.subscribers import DeepName, BoostedName


class TestSubscribers(unittest.TestCase):
    def test_deep_name(self):
        model = DeepName()  # initialize a new model
        model.fit(epochs=20)  # fit to the pipeline's training_data
        predictions = model.predict(model.pipeline.test_data)  # predict the holdout
        self.assertEqual(list(predictions), list(model.pipeline.encoded_test_data.y))  # hah!

    def test_xgboosted_name(self):
        model = BoostedName()
        model.fit()
        predictions = model.predict(model.pipeline.test_data)
        self.assertEqual(list(predictions), list(model.pipeline.encoded_test_data.y))  # hah hah hah!

テストを実行する:

$ lore test

アプリカーネルを使って$ lore notebookを使って$ lore notebookを試して調整する

プロジェクトの構造

├── .env.template            <- Template for environment variables for developers (mirrors production)
├── README.md                <- The top-level README for developers using this project.
├── requirements.txt         <- keeps dev and production in sync (pip)
├── runtime.txt              <- keeps dev and production in sync (pyenv)
│
├── data/                    <- query cache and other temp data
│
├── docs/                    <- generated from src
│
├── logs/                    <- log files per environment
│
├── models/                  <- local model store from fittings
│
├── notebooks/               <- explorations of data and models
│       └── my_exploration/
│            └── exploration_1.ipynb
│
├── appname/                 <- python module for appname
│   ├── __init__.py          <- loads the various components (makes this a module)
│   │
│   ├── api/                 <- external entry points to runtime models
│   │   └── my_project.py    <- hub endpoint for predictions
│   │
│   ├── extracts/            <- sql
│   │   └── my_project.sql
│   │
│   ├── estimators/          <- Code that make predictions
│   │   └── my_project.py    <- Keras/XGBoost implementations
│   │
│   ├── models/              <- Combine estimator(s) w/ pipeline(s)
│   │   └── my_project.py
│   │
│   └── pipelines/           <- abstractions for processing data
│       └── my_project.py    <- train/test/split data encoding
│
└── tests/
    ├── data/                <- cached queries for fixture data
    ├── models/              <- model store for test runs
    └── unit/                <- unit tests

モジュールの概要

Loreは、複数のライブラリにわたってMachine Learning技術を標準化するためのPythonモジュールを提供しています。

コア機能

  • lore.modelsはあなたの好きなライブラリの互換性ラッパーです – KerasXGBoostSciKit Learn 彼らは、徹底したドラフトトレーニングの合理的なデフォルトを持っています。
  • lore.pipelinesは 、データをフェッチし、エンコードし、モデルのトレーニング/テストセットに分割します。 1つのパイプラインには、モデル内の機能ごとに1つのエンコーダがあります。
  • lore.encodersは、単一の機能を学習のための最適な表現に変換するためにパイプライン内で動作します。
  • lore.transformersはフリーテキストの電話番号からエリアコードを抽出するなど、一般的な操作を提供します。 エンコーダーの内部で連鎖させることができます。 彼らは効率的に

サポート機能

  • lore.ioはpostgres / redshiftに接続し、s3からアップロード/ダウンロードすることができます
  • lore.serializersは、パイプラインとエンコーダを使用してモデルを保持します(そして、再びそれらを取得します)
  • lore.storesは、再現性と効率性のために中間データを保存します。

ユーティリティー

  • lore.utilには、すべてのプロジェクトで書き直した余分な細部があります。
  • lore.envは実行前にすべての依存関係が正しくインストールされていることを保証します

特徴

統合ライブラリ

他のPythonプロジェクトで使用するのと同じように、好きなライブラリをloreプロジェクトで使用します。 彼らはうまく一緒に遊ぶよ。

デイブオペス

開発と生産におけるPythonの依存関係を管理する方法たくさんありますが、それぞれ独自の落とし穴があります。 Loreは、loreのインストールで「うまく動作する」ソリューションをコード化しています。これは、プロダクションで実行されるものを正確に複製します。

Python 2&3との互換性

  • pip install loreは、ベースシステムのPythonが2か3かどうかにかかわらず動作します。Loreプロジェクトは常にruntime.txtで指定されたPythonのバージョンを使用します
  • Loreプロジェクトは、Python 2を必要とするsupervisordではなく、システムサービスマネージャー(ubuntu上でupstart)を使用します。

Heroku_ buildpackの互換性CircleCI_、Domino_、isc)

  • Loreはruntime.txtをサポートし、Python 2または3の一貫したバージョンを開発と運用の両方にインストールして使用します。
  • lore installはvirtualenvを使用してfreezing requirements.txtを自動的に管理します。したがって、pip依存関係は開発と生産においてまったく同じです。 これには、requirements.txt内のgithubパッケージを正しく停止させるための回避策が含まれています。

環境固有の設定

  • Loreは.envから環境変数を読み取ることをサポートしており、プロジェクトごとの設定が容易です。 .gitignore .envをお勧めします。漏れた秘密を防ぐために.env.templateにデベロッパーリファレンスをチェックインしてください。
  • logging.getLogger(__name__)は、環境に応じてコンソール、ファイル、またはsyslogに適切に設定されています
  • syslogは構造化されたデータで複製され、 運用環境ログに記録されます
  • lore.util.timerは開発の情報をログに記録し、 実稼働中のlibratoに記録する
  • 例外処理は、開発とテストでスタックトレースを記録しますが、本番環境ではロールバーにレポートします
  • コンソールのインタラクティブなPythonシェルは、環境の混乱を防ぐために色分けされています

複数のプロジェクトの並行互換性

  • Loreは、プロジェクトごとに別々のpython virtualenvを管理しています。これは、インストール時に最初からインストールすることができます

ISCとの互換性

  • 一般的に使われているvirtualenvwrapper(とconda)は、プロジェクトで作業しているときはいつでも、iscのようなシステムのpythonユーティリティを破壊します。 Loreは、開発者によって呼び出されたときにのみ適切なvirtualenvにブートストラップすることによって、この問題を回避します。

最大速度のバイナリライブラリのインストール

  • 開発マシンの要件に列挙されている場合、Loreはソースからテンソルフローを構築することができ、ランタイムのトレーニングパフォーマンスが2〜3倍向上します。 lore install –nativeを使用する
  • Loreは自動並列化を可能にするためにclangの代わりにgcc-5を使ってOS X上のxgboostもコンパイルする

Loreライブラリ

IO

  • lore.io.connection.Connection.select()Connection.dataframe()は自動的にLRUをディスクにキャッシュすることができます
  • ConnectionはPython%(name)をサポートします。
  • Connectionステートメントは常にpgHeroのメタデータで注釈が付けられます
  • 高速起動時にConnectionが遅延し、接続性の低い開発時の起動エラーを回避
  • Connectionは複数の同時データベース接続をサポートします

シリアライゼーション

  • Loreシリアライザはkeras / xgboost / scikitモデル用の環境認識S3ディストリビューションを提供します
  • 近日公開予定:herokuビルドパックは、シリアライズされたモデルをサポートし、安全にロールバックできる反復可能なコードと結びつけることができます

キャッシング

  • Loreは、構成可能な複数のキャッシュタイプ、RAM、Diskをすぐに提供します:MemCached&Redis
  • ディスクキャッシュは、csv、h5py、pickleのシリアライズに伴う落とし穴を避けるために、パンダでテストされています

エンコーダ

  • ユニーク
  • 離散
  • 数量
  • ノルム

トランスフォーマー

  • 市外局番
  • EmailDomain
  • 名前年齢
  • NameSex
  • 名前集団
  • ファミリー

ベースモデル

  • keras、xgboost、およびscikitの抽象基本クラス – data()、encoders()、output_encoder()、benchmark()を定義するクラスを継承する – カスタム基本クラスからの多重継承
  • ハイパーパラメータの最適化を提供

フィッティング

  • Model.fit()を呼び出すたびに、生成されたモデルがエポックチェックポイントとその結果の統計に適合するように保存され、リロードまたはシリアライザでアップロードできます

Keras / Tensorflow

  • tensorboardを使ってすぐにテンソルボードをサポートする–logdir = models
  • 偽の例外を防ぐためにプロセスが終了する前にテンソルフローをクリーンアップする
  • Keras 2.0モデルは、いくつかのバグを避けるために特別な注意を払ってシリアル化しています。
  • ReloadBestコールバックは早期にval_lossの増加に対するトレーニングを停止し、最良のエポックをリロードします。

Utils

  • lore.util.timerコンテキストマネージャは、本番環境での開発やリベートのログに書き込みます*
  • lore.util.timedは関数の実行時間を記録するためのデコレータです

コマンド

$ lore server  #  start an api process
$ lore console  # launch a console in your virtual env
$ lore notebook  # launch jupyter notebook in your virtual env
$ lore fit MODEL  #  train the model
$ lore generate [scaffold, model, estimator, pipeline, notebook, test] NAME
$ lore init [project]  #  create file structure
$ lore install  #  setup dependencies in virtualenv
$ lore test  #  make sure the project is in working order
$ lore pip  #  launch pip in your virtual env
$ lore python  # launch python in your virtual env







-instacart

執筆者:

instacart

lore – Loreは、機械学習をソフトウェアエンジニアにとって親しみやすくし、機械学習研究者にとって維持可能にする

投稿日:

(さらに…)







-instacart

執筆者: