優れたコードによる機械学習: データサイエンスのためのソフトウェア エンジニアリングのヒントとベスト プラクティス

優れたコードによる機械学習: データサイエンスのためのソフトウェア エンジニアリングのヒントとベスト プラクティス

この記事は公開アカウント「Reading Core Technique」(ID: AI_Discovery)から転載したものです。

データ サイエンスに興味がある方なら、このワークフローに馴染みがあるかもしれません。プロジェクトを開始するには、まず Jupyter ノートブックを実行し、次に Python コードの記述、複雑な分析の実行、さらにはモデルのトレーニングを行います。関数、クラス、グラフ、ログなどによりノートブック ファイルのサイズが大きくなると、目の前に巨大なコード ブロックが現れることがあります。運が良ければ、すべて順調に進むでしょう。じゃああなたは本当にすごいですね!

[[344175]]

ただし、Jupyter ノートブックには、コーディングを悪夢に変える可能性のある重大な落とし穴がいくつか潜んでいます。これがどのように起こるのかを見て、それを防ぐための適切なコーディング方法について説明しましょう。

Jupyter Notebook の問題

Jupyter プロトタイピングを次のレベルに引き上げたい場合、期待どおりにいかないことがよくあります。以下は、このツールを使用しているときに私が遭遇した、皆さんもよくご存知の状況の一部です。

  • すべてのオブジェクト (関数またはクラス) が定義されインスタンス化されると、保守性が非常に難しくなります。関数に小さな変更を加えたい場合でも、ノートブックのどこかにそれを配置して修正し、再コードを再実行する必要があります。絶対にこんなことが起きてほしくないですよね。ロジックと処理機能を外部スクリプトに分離する方が簡単ではないでしょうか?
  • Jupyter Notebook はインタラクティブ性と即時フィードバックを備えているため、データ サイエンティストが関数を使用する代わりにグローバル名前空間で変数を宣言することを推奨します。これは Python 開発における悪い習慣であり、効果的なコードの再利用を制限します。
  • また、ラップトップがすべての変数を格納する大規模なステートマシンになるため、再現性も低下します。この構成では、どの結果がキャッシュされ、どの結果がキャッシュされないかを覚えておく必要があり、他のユーザーがユニットの実行順序に従うことを想定する必要があります。
  • ノートブックがバックグラウンドでフォーマットされる方法 (JSON オブジェクト) により、コードのバージョン管理が困難になります。このため、データ サイエンティストが GIT を使用してノートブックの異なるバージョンをコミットしたり、ブランチをマージして特定の機能を実装したりするのを目にすることはほとんどありません。

その結果、チームのコラボレーションは非効率かつ不器用なものとなり、チームメンバーは電子メールや Slack 経由でコード スニペットやノートブックを交換し始め、以前のコード バージョンへのロールバックは悪夢となり、ファイルの整理は乱雑になり始めます。適切なバージョン管理を行わずに Jupyter ノートブックを 2 ~ 3 週間使用した後、プロジェクトでよく見られるのは次のようになります。

  1. 分析.ipynb
  2. 分析_コピー(1).ipynb
  3. 分析_コピー(2).ipynb
  4. 分析_FINAL.ipynb
  5. 分析_FINAL_2.ipynb

Jupyter ノートブックは、探索や迅速なプロトタイピングに最適です。これらは、再利用性や実稼働での使用を目的として設計されたものではありません。 Jupyter ノートブックを使用してデータ処理パイプラインを開発する場合、最良のシナリオは、セルが実行される順序どおりに、ラップトップまたは VM 上でコードが線形かつ同期的に実行されることです。

しかし、これは、より複雑な環境、たとえば、より大きな入力データセット、他の非同期並列タスク、またはより少ない割り当てリソースでコードがどのように動作するかについては何も述べていません。実際には、ノートブックの動作は予測できない場合があるため、テストするのは困難です。

  • ほとんどの時間を VSCode で過ごす私にとって、コードの追加、スタイルのフォーマット、コード構造、自動補完、コードベースの検索などの強力な拡張機能を頻繁に利用しているので、Jupyter に戻ると、少し無力感を感じずにはいられません。 VSCode と比較すると、Jupyter ノートブックには、プログラミングのベスト プラクティスを実施するための拡張機能がありません。

はい、文句はもう十分です。私は Jupyter がとても気に入っており、デザイン作業に非常に役立つと思います。小規模なプロジェクトを立ち上げたり、アイデアのプロトタイプを素早く作成したりするためにこれを使用することもできますが、ソフトウェア エンジニアリングの原則に従う必要があります。データ サイエンティストがノートブックを使用するときにこれらの原則が見落とされることがあるので、いくつか確認してみましょう。

コードを再び素晴らしいものにするためのヒント

これらのヒントは、さまざまなプロジェクト、私が参加したミートアップ、および過去一緒に働いたソフトウェア エンジニアやアーキテクトとのディスカッションからまとめたものです。以下では、ノートブックではなく Python スクリプトを記述していることを前提としていることに注意してください。

1. コードを整理する

コード品質の最も重要な側面は明確さです。明確で読みやすいコードは、コラボレーションと保守性にとって不可欠です。これを行うと、より簡潔なコードが得られます。

  • 意味があり、説明的で、示唆に富んだ変数名を使用します。たとえば、属性 (年齢など) に関するブール変数を宣言して、人が高齢かどうかをチェックする場合は、is_old を使用して、説明と型の情報の両方を伝えることができます。データの宣言についても同様です。解釈可能なものにしてください。
  1. 良くない...
  2. pandasをpdとしてインポートする
  3. df = pd.read_csv(path) # より良い!transactions = pd.read_csv(path)
  • 自分だけが理解できる略語や、誰も我慢できない長い変数名の使用は避けてください。
  • コード内で「マジックナンバー」を直接エンコードしないでください。誰もが何を指しているのか理解できるように、変数で定義します。
  1. 良くない...
  2. optimizer = SGD(0.0045, momentum= True ) # 良くなりました!
  3. 学習率 = 0.0045
  4. オプティマイザー = SGD(学習率、勢い= True )
  • オブジェクトの命名については PEP8 規則に従ってください。たとえば、関数名とメソッド名は小文字、単語はアンダースコアで区切られ、クラス名は UpperCaseCamelCase 規則に従い、定数は大文字、などです。
  • インデントとスペースを使用して、コードをより美しくします。 「インデントごとに 4 つのスペースを使用する」、「セクションを分ける場合は追加の空白行を入れる」など、いくつかの標準的な規則があります。

[[344176]]

2. コードをモジュール化する

同じプロジェクトまたは他のプロジェクトで再利用できるものを構築し始めるときは、コードを論理的な関数とモジュールに整理する必要があります。これにより、組織化と保守性が向上します。

たとえば、NLP プロジェクトに取り組んでいて、テキスト データを処理するためのさまざまな処理関数 (トークン化、URL の削除、単語の変更など) が必要になる場合があります。これらすべてのユニットを text_processing.py という Python モジュールに入れて、そこからインポートすることで、メイン プログラムをより軽量にすることができます。

モジュールコードを書く際のヒントをいくつか紹介します。

  • 同じことを繰り返さないでください。可能な限りコードを一般化または統合してください。
  • 関数は 1 つのことだけを行う必要があります。関数が複数の操作を実行する場合、要約するのは困難です。
  • 関数内のロジックを抽象化しますが、過度に設計しないでください。そうしないと、モジュールが多すぎる可能性があります。自分の判断で行ってください。経験がない場合は、scikit-learn などの人気のある GitHub リポジトリを調べて、コーディング スタイルを学んでください。

3. コードをリファクタリングする

リファクタリングは、コードの機能を変えずにコードの内部構造を再編成することを目的としており、通常は動作中の(ただしまだ完全には編成されていない)バージョンのコードに対して実行されます。重複する機能を排除し、ファイルを再構築し、抽象化を追加するのに役立ちます。

4. コード効率を向上させる

実行速度が速く、メモリとストレージ容量の消費量が少ない効率的なコードを書くことは、ソフトウェア開発におけるもう 1 つの重要なスキルです。効率的なコードを書くには何年もの経験が必要ですが、コードが遅いかどうかを判断し、どのように高速化するかを判断するのに役立つヒントをいくつか紹介します。

  • 何かを行う前に、アルゴリズムの複雑さをチェックして実行時間を見積もります。
  • 各操作の実行時間を調べて、スクリプト内のボトルネックの可能性を確認します。
  • 特に NumPy や pandas などのライブラリを使用している場合は、可能な限り for ループを避け、操作をベクトル化します。
  • マルチプロセッシングを使用して、コンピューターの CPU コアを最大限に活用します。

5. GITまたはその他のバージョン管理システムを使用する

GIT + Github を使用することで、コーディング スキルが向上し、プロジェクトをより適切に整理できるようになりました。友人や同僚と協力して使用していたため、これまでは従っていなかった基準に従うことになりました。

[[344177]]

データ サイエンスでもソフトウェア開発でも、バージョン管理システムを使用すると多くの利点があります。

  • 変更を追跡する
  • 以前のコードバージョンにロールバックする
  • マージとリクエストによるチームメンバー間の効果的なコラボレーション
  • コード品質の向上
  • コードレビュー
  • チーム メンバーにタスクを割り当て、継続的インテグレーションと継続的デリバリーのフックを提供して、プロジェクトを自動的にビルドおよびデプロイします。

6. コードをテストする

一連の操作を実行するデータ パイプラインを構築する場合、設計どおりに実行されることを確認する 1 つの方法は、予想される動作をチェックするテストを作成することです。テストは、関数の出力形状や期待値を確認するのと同じくらい簡単です。

関数とモジュールのテストを記述することには多くの利点があります。

  • コードの安定性が向上し、エラーを見つけやすくなります。
  • 予期しない出力を防ぐ
  • エッジケースの検出に役立ちます
  • 壊れたコードが本番環境にプッシュされるのを防ぐ

7. ログを使用する

コードの最初のバージョンを実行したら、各ステップを監視して、何が起こっているかを把握し、進行状況を追跡し、エラーを検出する必要があります。ログ記録を使用できます。ログを効果的に使用するためのヒントをいくつか紹介します。

  • ログに記録するメッセージの性質に応じて、異なるレベル (デバッグ、情報、警告) が使用されます。
  • 関連する問題のトラブルシューティングに役立つ情報をログに提供します。
  1. インポートログ
  2. ログ記録.basicConfig(ファイル名 = 'example.log' レベル= ログ記録.DEBUG)
  3. logging.debug( 'このメッセージはログファイルに記録されます' )
  4. logging.info( 'これもそうあるべきです' )
  5. ロギング.警告( 'そしてこれも' )

コードの悪夢に別れを告げて、これらのヒントを学びましょう。

<<:  プログラム可能な磁気駆動ソフトロボットが登場しました!科学サブジャーナル:この原理は19世紀後半に提案されました

>>:  重要なポイントを強調します。最大2億元の支援、AIイノベーション開発パイロットゾーンの5つの重点政策を理解する

ブログ    
ブログ    
ブログ    

推薦する

生徒のエッセイ採点における新たな傾向: 教師と AI の共同モデル

テクノロジーが進歩するにつれ、それが従来の人間の仕事をどのように変えたり、置き換えたりするのかという...

...

オリンピックのコーチたちが、人工知能によって職を奪われる危険に直面する番なのだろうか?

中国の飛び込みドリームチームは、「消える水しぶき」の技術に長けており、オリンピックのあらゆる大会で金...

没入型環境向けロボットの開発における3つの課題

[51CTO.com 速訳] 最近、FacebookはMessengerプラットフォーム上のチャット...

オブジェクトストレージがAIの最大の課題を克服するのに理想的な理由

2020 年のコロナウイルスのパンデミックは、データの迅速な分析と解釈の重要性、そして情報に基づいた...

将来のスマートホームに AI はどのように統合されるのでしょうか?

人工知能(AI)については多くの誇大宣伝がなされていますが、それは人類のこれまでの発明と同じくらい画...

Baidu の最新の IDL 成果: 自然言語から始めて、AI エージェントに人間のように学習することを教える

AI は驚異的な進歩を遂げていますが、多くの分野ではまだ限界があります。たとえば、コンピューター ゲ...

AIが人々の職場復帰を支援:重慶の音声ロボット、北京の無人配達、広州の顔認識体温測定

この記事はAI新メディアQuantum Bit(公開アカウントID:QbitAI)より許可を得て転載...

Baidu Brainのインテリジェント会話エンジンが9つのコア機能のリリースで「警笛を鳴らす」

言語は思考と知識を伝達し、人類の文明を推進します。そして会話によって機械はより賢くなり、人間にとって...

「ソースコード解析」仮想DOMアルゴリズムの実装方法

[[378869]]前回の記事「仮想 DOM が実際の DOM に進化する方法」では、仮想 DOM ...

サイバーセキュリティにおける AI と ML のユースケース

サイバー攻撃の性質と標的が多様化するにつれて、サイバーセキュリティの専門家が脆弱性に対処する方法を決...

...

シングルチッププロセッサの終焉?アップルとNVIDIAはマルチチップパッケージングに興味を持っており、相互接続技術が鍵となる

3月10日、Appleは2022年春のカンファレンスで、M1 Maxチップのアップグレード版であるM...

英国最高裁:特許の「発明者」は人工知能ではなく自然人でなければならない

ロイター通信は12月21日、現地時間20日に発表された英国最高裁判所の判決で、米国のコンピューター科...