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

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

この記事は公開アカウント「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つの重点政策を理解する

ブログ    

推薦する

初のオープンソースMoE大型モデル公開! 7Bx8の専門家、GPT-4に最も近いエピソード

「今夜の予定は全部キャンセル!」多くのAI開発者は寝ないことを決意しました。最初のオープンソース M...

AI導入時に解決すべき無線ネットワークの運用・保守における4つの大きな課題

無線通信ネットワークの発展に伴い、今後のネットワークは周波数帯域やネットワーク構成の面でより複雑化し...

...

AdobeなどがAIを活用しアニメキャラクターのポーズ移行を実現する新タイプの「パペットアニメーション」を提案

人形アニメーションの制作は、クリエイターの手描きに頼るアニメーションと比べると、非常に手間のかかる作...

...

ChatGPTのトラフィックが減少しており、学生が夏休みに入っているためだと推測する人もいる

7月16日、OpenAIが開発した人工知能チャットボット「ChatGPT」は、ユーザーと自然言語で会...

GitHub が機械学習コードの脆弱性スキャンを無料で提供、JavaScript / TypeScript もサポート

現在、JavaScript および TypeScript リポジトリで開発およびテストが行​​われて...

...

Shi Yigong 氏と彼のチームが Science の表紙に登場: AI とクライオ電子顕微鏡が「原子レベル」の NPC 構造を解明、生命科学の画期的進歩

本文を始める前に、写真を見てみましょう。下の図では、写真の右半分に豊富な情報と明確な構造が表れている...

...

95 年以降の DAMO アカデミーのインターン生がマイクロソフトに勝ち、最も難しい NLP タスクの世界記録を更新

アリババAIは、常識QA分野の権威あるデータセットであるCommonsenseQAで新たな世界記録を...

研究によると、人工知能が書いたツイートに騙される可能性が高くなる

6月29日のニュースによると、新たな研究によると、人間が書いたツイートよりも、人工知能の言語モデルに...

AIプロジェクトが失敗する6つの理由

データの問題は、企業の AI プロジェクトが意図した目標を達成できない主な理由です。しかし、企業が失...

ザッカーバーグは涙ながらに300人のチームを解散させた! Meta、Google、その他の大手企業によるMetaverse OSをめぐる戦いが正式に始まったのでしょうか?

Appleの春のカンファレンスまで残り4日となりました。カラフルなAR招待状が届きました。これはク...

...