Python 開発者ガイド: 機械学習に役立つ 10 の実践方法!

Python 開発者ガイド: 機械学習に役立つ 10 の実践方法!

[[327915]]

【51CTO.com クイック翻訳】

データ サイエンティストとして、私たちは時々自分たちの仕事を忘れてしまいます。私たちは主に開発者であり、次に研究者であり、そして最終的には数学者になるかもしれません。私たちの第一の責任は、バグのないソリューションを迅速に開発することです。

モデルを構築できるからといって、私たちが神であるわけではなく、くだらないコードを書く自由が与えられるわけでもありません。

最初から、私は多くの間違いを犯してきましたが、機械学習エンジニアリングで最も一般的なスキルは何だと思うかを明らかにしたいと思いました。これは現在業界で最も不足しているスキルでもあると思います。

私は彼らをソフトウェアを理解していないデータ サイエンティストと呼んでいます。なぜなら、彼らの多くはコンピューター サイエンスの正式なトレーニングを受けたエンジニアではないからです。それが私です。

優秀なデータ サイエンティストと優秀な機械学習エンジニアを雇わなければならない場合、私は後者を採用します。

1. 抽象クラスの書き方を学びます。

抽象クラスの記述を開始すると、コード ベースをはるかにクリーンにできる方法がわかります。同じメソッドとメソッド名が適用されます。多くの人が同じプロジェクトに取り組む場合、各人が異なるアプローチを取り始めます。これは深刻な混乱を引き起こすでしょう。

  1. インポートOS  
  2. abcからABCMeta、abstractmethod をインポートします 
  3. クラス DataProcessor(メタクラス = ABCMeta):  
  4. すべての準備に使用するベース プロセッサ。」 「」    
  5. def __init__(self, 入力ディレクトリ, 出力ディレクトリ):  
  6. self.input_directory = 入力ディレクトリ 
  7. self.output_directory = 出力ディレクトリ 
  8. @抽象メソッド 
  9. def読み取り(自己):  
  10. 生データを読み取ります。」 「    
  11. @抽象メソッド 
  12. defプロセス(自己):  
  13. "" "生データを処理します。このステップでは、必要なすべての機能を備えた生データフレームを作成する必要があります。統計またはテキストのクリーニングを実装しないでください。" ""    
  14. @抽象メソッド 
  15. def save(self):  
  16. 処理されたデータを保存します。」 「」    
  17. クラスTrainer(メタクラス=ABCMeta):  
  18. すべてのモデルに使用されるベーストレーナー。」 「」    
  19. def __init__(自分自身、ディレクトリ):  
  20. self.directory = ディレクトリ 
  21. self.model_directory = os.path.join (ディレクトリ、 'モデル​​' )  
  22. @抽象メソッド 
  23. デフプリプロセス(自己):  
  24. これは前処理されたデータを取得し、クリーンなデータを返します。これは統計またはテキストのクリーニングに関するものです。    
  25. @抽象メソッド 
  26. def set_model(self):  
  27. ここでモデルを定義します。」 「」    
  28. @抽象メソッド 
  29. def fit_model(自己):  
  30. これはベクトル化されたデータを受け取り、トレーニングされたモデルを返します。    
  31. @抽象メソッド 
  32. 定義:  
  33. トレーニング済みのモデルとテスト データを使用してメトリックを生成します。  
  34. @抽象メソッド 
  35. def save_model(self, モデル名):  
  36. "" "このメソッドは、必要な形式でモデルを保存します。" ""    
  37. クラス Predict(メタクラス=ABCMeta):  
  38. すべてのモデルに使用される基本予測子。」 「」  
  39. def __init__(自分自身、ディレクトリ):  
  40. self.directory = ディレクトリ 
  41. self.model_directory = os.path.join (ディレクトリ、 'モデル​​' )  
  42. @抽象メソッド 
  43. def load_model(self):  
  44. "" "ここでモデルをロードします。" ""    
  45. @抽象メソッド 
  46. デフプリプロセス(自己):  
  47. これは生データを取得し、予測用のクリーンなデータを返します。」 「」  
  48. @抽象メソッド 
  49. def 予測(自己):  
  50. これは予測に使用されます。」 「」    
  51. クラス BaseDB(メタクラス=ABCMeta):
  52. "" " すべての DB コネクタに使用される基本データベース クラス。" ""    
  53. @抽象メソッド 
  54. get_connection(self)を定義します。  
  55. これにより、新しい DB 接続が作成されます。    
  56. @抽象メソッド 
  57. close_connection(self)を定義します。  
  58. これにより DB 接続が閉じられます。  

2. トップシードを獲得する。

実験の再現性は重要であり、種は敵です。種を大切にしてください。そうしないと、トレーニング/テスト データの分割が異なり、ニューラル ネットワークの重みの初期化も異なります。これにより、一貫性のない結果が生じる可能性があります。

  1. def set_seed(引数):  
  2. ランダムシード(args.シード)  
  3. np.random.seed(args.seed)  
  4. torch.manual_seed(args.seed)  
  5. args.n_gpu > 0 の場合:  
  6. torch.cuda.manual_seed_all(args.seed)

3. 数行から始めます。

データが非常に大きく、プログラミングの後期段階(データのクリーニングやモデリングなど)にある場合は、毎回膨大なデータをロードしないように nrows を使用します。実際に全体を実行せずにコードをテストしたいだけの場合は、このトリックを使用します。

このトリックは、ローカル PC の構成がデータ サイズを処理するのに十分ではないが、Jupyter/VS code/Atom でローカル開発を行う場合に役立ちます。

  1. df_train = pd.read_csv('train.csv', nrows=1000)

4. 失敗を覚悟する(成熟した開発者の証)。

後で問題が発生する可能性があるため、データ内の NA を常に確認してください。現在のデータに NA が含まれていない場合でも、将来の再トレーニング サイクルで NA が表示されなくなるわけではありません。とにかく確認してください。

  1. 印刷(長さ(df))  
  2. df.isna().合計()  
  3. df.dropna()  
  4. 印刷(長さ(df))

5. 処理の進行状況を表示します。

大量のデータを処理しているとき、どれくらいの時間がかかるか、またプロセスのどこにいるのかがわかれば、間違いなく安心できます。

方法 1 — tqdm

  1. tqdmからtqdm をインポート 
  2. インポート時間   
  3. tqdm.pandas()  
  4. df[ 'col' ] = df[ 'col' ].progress_apply(lambda x: x**2)  
  5. テキスト = ""    
  6. のために 文字  tqdm ([ "a" , "b" , "c" , "d" ]):  
  7. 時間.睡眠(0.25)  
  8. テキスト = テキスト +文字 

方法 2 — fastprogress

  1. fastprogress.fastprogressからmaster_bar、progress_bar をインポートします 
  2. から 時間インポート 睡眠 
  3. mb = マスターバー(範囲(10))  
  4. iが mb場合:  
  5. progress_bar(range(100), parent=mb)jの場合:  
  6. 睡眠(0.01)  
  7. mb.child.comment = f '2番目のバーの統計'    
  8. mb.first_bar.comment = f '最初のバーの統計'    
  9. mb.write(f 'ループ {i} を終了しました。' )

6. パンダは遅くなることがあります。

pandas を使用したことがあるなら、特に groupby 操作を実行するときに、それがどれほど遅くなることがあるかご存知でしょう。処理速度を上げるための「素晴らしい」解決策を見つけるために頭を悩ます必要はありません。コードを 1 行変更して modin を使用するだけです。

  1. modin.pandasをpdとしてインポートします

7. 関数の時間を計ります。

すべての機能が同じように作成されるわけではありません。

すべてのコードが正常であっても、素晴らしいコードを書いたことを意味するわけではありません。いくつかのソフト エラーは実際にコードの実行速度を低下させるため、そのエラーを見つける必要があります。このデコレータを使用して関数の時間を計測します。

  1. インポート時間   
  2. タイミングを定義する(f):  
  3. "" "タイミング関数デコレータ 
  4. 使用法:  
  5. @タイミング 
  6. 定義関数(a):  
  7. 合格
  8. 「」 「  
  9. @ラップ(f)  
  10. def wrapper(*args, **kwargs):  
  11. 開始 =時間.時間()  
  12. 結果 = f(*args, **kwargs)  
  13. 終了=時間.時間()  
  14. print( 'function:%r にかかった時間: %2.2f 秒' % (f.__name__, end - start))
  15. 結果を返す 
  16. 返品ラッパー

8. クラウドにお金をかけないでください。

クラウド リソースを無駄にするエンジニアを好む人はいません。

一部のテストは数時間かかる場合があります。実験を追跡することは困難であり、クラウド インスタンスは使用されなくなるとシャットダウンされます。私自身もこの間違いを犯したことがありますし、インスタンスを何日も実行したままにしている人も見てきました。

実行の最後に関数を呼び出すだけで、問題は発生しません。

ただし、このアプローチを実装するには、メイン コードを try と use except でラップします。そうすることで、エラーが発生した場合にサーバーが実行を継続できない状態になります。はい、私もこの状況に対処したことがあります。

責任を持って二酸化炭素の排出をやめたほうがいいでしょう。

  1. インポートOS  
  2. def run_command(cmd):  
  3. os.system(cmd)を返す 
  4. defシャットダウン(秒数=0、OS= 'linux' ):  
  5. "" "指定された秒数後にシステムをシャットダウンします。コストを節約するために EC2 をシャットダウンするのに役立ちます。" ""    
  6. os == 'linux'の場合:  
  7. run_command( 'sudo シャットダウン -h -t sec %s' % 秒)  
  8. elif os == 'windows'場合:  
  9. run_command( 'shutdown -s -t %s' % 秒)

9. レポートを作成して保存します。

モデリングの特定の段階を過ぎると、すべての貴重な情報はエラーとメトリックの分析からのみ得られるようになります。自分自身と上司のために、適切にフォーマットされたレポートを作成して保存するようにしてください。

結局のところ、経営陣はレポートを読むのが大好きですよね?

  1. jsonをインポート 
  2. インポートOS  
  3. sklearn.metricsからインポート (accuracy_score、classification_report、  
  4. 混乱行列、f1_スコア、fbeta_スコア)  
  5. def get_metrics(y, y_pred, beta=2, average_method= 'macro' , y_encoder=None):  
  6. y_encoderの場合:  
  7. y = y_encoder.inverse_transform(y)  
  8. y_pred = y_encoder.inverse_transform(y_pred)  
  9. 戻る{  
  10. '精度' : round(accuracy_score(y, y_pred), 4),  
  11. 'f1_score_macro' : round(f1_score(y, y_pred, average=average_method), 4),  
  12. 'fbeta_score_macro' : round(fbeta_score(y, y_pred, beta, average=average_method), 4),  
  13. 'レポート' : 分類レポート(y, y_pred, output_dict= True ),  
  14. 'report_csv' : 分類レポート(y, y_pred, output_dict= False )。置換( '\n' , '\r\n' )  
  15. }  
  16. def save_metrics(メトリック: dict、モデルディレクトリ、ファイル名):  
  17. パス = os.path.join (モデルディレクトリ、ファイル名 + '_report.txt' )  
  18. 分類レポートをcsvへ(メトリック[ 'report_csv' ], パス)  
  19. メトリックス.pop( 'report_csv' )  
  20. パス = os.path.join (モデルディレクトリ、ファイル名 + '_metrics.json' )  
  21. json.dump(メトリック、オープン(パス、 'w' )、インデント=4)

10. 優れた API を作成します。

悪い結末を持つコードはすべて悪いです。

データのクリーニングとモデリングをうまく行っても、最終的には大きな混乱が生じることがあります。経験から、多くの人が適切な API、ドキュメント、サーバー構成の書き方を知らないことがわかりました。

以下は、負荷がそれほど高くない (例: 1000/分) 一般的な機械学習およびディープラーニングの展開に適したアプローチです。

Fastapi + uvicornの組み合わせを見てみましょう

  • 最速: I/O タイプの操作では fastapi が最も高速であるため、API を fastapi で記述します (https://www.techempower.com/benchmarks/#section=test&runid=7464e520-0dc2-473d-bd34-dbdfd7e85911&hw=ph&test=query&l=zijzen-7)。その理由は、こちら (https://fastapi.tiangolo.com/benchmarks/) で説明されています。
  • ドキュメント: fastapi を使用して API を記述すると、http:url/docs で無料のドキュメントとテスト エンドポイントが提供されます → コードを変更すると fastapi によって自動的に生成および更新されます。
  • ワーカー: uvicorn を使用して API をデプロイします。

4 つのワーカーを使用してデプロイするには、次のコマンドを実行します。負荷テストを通じてワーカーの数を最適化します。

  1. pip インストール fastapi uvicorn  
  2. uvicorn メイン:app --workers 4 --host 0.0.0.0 --port 8000  

原題: Python 開発者のための 10 の有用な機械学習プラクティス、著者: Pratik Bhavsar

[51CTOによる翻訳。パートナーサイトに転載する場合は、元の翻訳者と出典を51CTO.comとして明記してください]

<<:  都市の気質を改善し、住みやすい環境を守る。AIはガバナンスの閉ループを開く

>>:  ファーウェイマシンビジョンが16の新製品を連続発売、数千億元相当のセキュリティの新たな戦場を切り開く

ブログ    
ブログ    

推薦する

顔認識訪問者システムの利点は何ですか?

[[373764]]顔認識訪問者システムの利点は何ですか?以前は、訪問者の管理に手書きの登録が使用...

あなたのビジネスに最適なRPAコンサルタントを見つける方法

RPA 導入を成功させるために、この記事では、ビジネスに最適な RPA コンサルタントを選択するプロ...

...

...

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

[[344168]] 2019年8月、科学技術部は「国家新世代人工知能イノベーション開発パイロットゾ...

...

ディープラーニングの「記憶喪失」に応えて、科学者たちは類似性に基づく重み付けインターリーブ学習を提案し、PNASに掲載された。

人間とは異なり、人工ニューラル ネットワークは新しいことを学習するときに以前に学習した情報をすぐに忘...

データセンター管理者は AI と ML の爆発的な増加にどのように備えればよいのでしょうか?

生成 AI と機械学習 (ML) は急速に一般の人々の意識に入り込み、これらの有望なテクノロジーの能...

世界中のコードの品質が急激に低下、その原因は AI です。 1億5300万行のコードの詳細な分析レポートが公開されました

AI が世界中のコード品質を低下させています。最近、GitClear が発表した調査レポートによると...

ジェネレーティブ AI 時代のデータ センターの再構築

最近の人工知能に関する議論には、OpenAI の大規模言語モデル (LLM) の GPT ファミリー...

...

障害検出におけるデータ機械学習の応用

はじめに: 従来の産業では、故障診断が機械メンテナンスで最も困難な段階であるため、メンテナンスに費や...

...

...