カテゴリー 「開発メモ」 RSS

2024-11-20

[] IR, Recsysの指標

関連性で推薦すればCTRが最大化されると思ったが、そう単純ではないらしい

状況によっては、関連性の高い情報ばかり表示するとユーザーが飽きてしまい、関連性スコアが低めのものクリックされたりする

そこで、ノベルティダイバーシティといった複数指標考慮すると、よりCTRを増やせる可能性がある

閲覧履歴を保存していれば、そのいくつかを何らかのルールベースを用いて結果から除外する形でノベルティを増やせる

ダイバーシティを増やす方法は、検索結果をパチンコ台みたいに複数の台を用意しておき、それぞれの台から結果を抽出するような方法が使える

[] リファクタリングしたら生産性が上がった

forループからなる処理があり、データに対して、条件に合致する行にスコアを与え、スコア判定されたものは(id, score)というペアを出力し、それ以外のデータリストにまとめて返す、という処理がある。

このパターンが6回ぐらい連続で続いていたが、条件合致部分が複雑で、処理が一致していることに気が付かなかった。

処理が一致していることに気がついて、abstractメソッド実装(条件合致部分)を与えるという方式にして抽象化したらコードスッキリした。

これによって、「Aスコアの部分にこれこれこういう追加修正をしてね」という要求が来たら即対応できるようになった。

これで俺も、札束風呂美女といちゃいちゃできるかな

2024-11-13

[] クローラ開発

構造情報の変化の監視について

robots.txtの遵守について

速度/接続制限マルチスレッディングについて

訪問済みURLのKVSについて

法的要件確認について

UAIPのローテーションについて

その他

追加的なヒント

2024-10-29

[] SQLのIN句

数万件ずつチャンク分けしてデータ抽出するときに、IDリストを分割してINに渡すようなやり方はパフォーマンス的にダメダメなのでやめよう

2024-09-18

[] 施策効果があったか知りたい

施策効果があったか知りたきゃCTRとかそういう指標を正確に収集してプロットしろっつーの!

(おいジャイ子、俺の漫画勝手に読むな)

マジレスすると、クリックデータリアルタイムプロットしんどい

いつクリックが発生するかわからないし、クリックデータの量は莫大であるため

集計関数を作ってtime windowを設定してその範囲の反応を定期的に抽出するような方法はある

2024-09-12

[] リソース節約する

何らかの統計ダッシュボードを作る時、用途によって入出力が変わってくるだろう

しかし、そのバリエーションごとにAWSサービスを立ち上げるとコストがかかる

こういうものは、一元的管理できるように統合したほうが良い

2024-09-10

[] 時間のかかるデータ抽出

DBからデータを取りインデクシングする」「ターゲットサイトからデータクロールする」でもなんでもいいが、最初の全件でかなり時間がかかる

「それで、その間お前何やんの?」と言われそうになるので、以下どちらかの対策

まあ、最初の全件さえやれば、あとは差分からすぐに終わるようになるだろう

ちなみに、データ抽出後に問題が生じる可能性があるため、最初は小さなテストセットで検証し、問題解決してから全件やるのが良い

2024-09-04

[] 検索ESは高可用性インフラにする

多くのWebサービスでは検索機能必須だが、これをいろいろなところで使いまわすことがある。

例1: 推薦機能

例2: メールマガジン

例3: 登録通知アラート

使いまわすことが多いことがわかったら、検索機能用のESは高可用インフラに突っ込む。

2024-09-02

[] SQLを徹底的に最適化しようと思ったら、まずAIに聞く

SQLは構文はわかっていても、最適化方法イマイチからない言語である

ここでいう最適化とは、DB設計の方ではなく、クエリの方

そこで、こういうことはCopilotに全部聞いてしま

大抵のケースでは、DB処理がこれでかなり高速化される

比較のために同僚が用意したSQL比較したが、コピることで数倍高速化された

[] 引数が増え過ぎたら辞書化する

粗結合性から見るとアンチパターンだが、コードの見やすさは上がる。

#改善def honya1(a,b,c,d,e,f,g,h,i,j,k,l,m,n):
     (処理)

#改善def honya2(**kwargs):
     (処理)

追記: 文脈がわかってないようなので書く。これは、どこかの計算で使われた集合を複数個(a,b,c,d,e,f,g,...)引っ張ってきて直積にする算術最初は2つだったので良かったが、徐々に必要直積が増えていき、その分だけ引数定義していた。しか任意個なのでNoneを与える部分もあった。*argsか**kwargsを使えばもっと簡単にかけるはず。

2024-08-27

[] アップサンプリングの注意点

少数データからランダムサンプリングしてかさ増しする方法があるが、似たようなデータに対して訓練するので過学習危険性が高まる

2024-08-26

[] リファクタリング作法

実際のところ、リファクタリング不可能ではない。ただ、やり方がある。

「この機能修正して」「バグがあるから修正して」「新しい機能を追加して」と要求が挙がることがあるだろう。これがチャンスだ。

この要求関係する部分(全体ではない)を、リファクタリングすればいいのである

地道な作業になるが、「修正に伴うリファクタリング」を繰り返せば徐々に波及してくる。

ただし、最低限として、以下を満たす必要がある。

anond:20240826103709

[] アクション予測モデル

ユーザー属性モデルに追加しようとしたんだけど、今までランダムサンプリングで負例生成してたからそれだとできない

そこで「ユーザーから実際のアクション(消費)があったもの」を正例、「クリックだけあってアクションがないもの」を負例にすることにした

2024-07-22

[] A/Bテストすること

レコメンダシステム理解が進んだ段階では、その仕組みを汎用化して、入力パラメータ挙動を変えられるようにできていると仮定する

A/Bテストを行うために必要なのは、まず入力パラメータユーザーアクションの組を保存することである

目標の設定から始める必要があるが、ここではクリック率を追うと仮定する

これだけでは比較が出来ないため、検証対象パラメータAとBを同頻度でユーザー適用する

この適用方法は色々ある。ランダムに切り替える方法もあるし、ユーザーを2つのグループに分ける方法もある。この適用時に、サンプルサイズを決めておく

それで、ある程度の期間データ収集するが、期間をちゃんと決めておく。大体1〜2週間ぐらいになることがおおい

期間が過ぎたら、まずAとBのアクション統計的推移をEDAとしてプロットするとはっきりと傾向を見て取れる

また数値的な比較として統計的検定を実施するのも方法の一つである

結果的に、どういうパラメータ設定であればよりクリック率が増えるのかを明確にする

テスト結果をどのようにフィードバックし、次に進むのかを計画する。得られたデータを基に仮説を再構築し、継続的改善を行うサイクルを確立する

2024-07-16

[] 設定は外部化

たまに設定を引数で全部与えるようにしている人がいるが、それだけでは対応力がない

技術畑の外側の人にも設定できるようにするぐらいでないと

で、その方法が「外部化」ね

要は、設定できるあらゆる項目は、わかりやすく簡易化した上で、jsonで保存できるようにする

こうしておけば、例えばセールス業務人間が「こういう広告設定をしたい」といってjsonへ設定できるようになる

ただし、設定内容が正しいかどうかを簡単にチェックする機構をつけるともっといい

2024-06-12

[] キュー管理すべき処理

例えば、一連の処理の中で、ログ記録機能があるとする。

その処理は、例えばメールを大量に処理するようなものだったりして、速度が要求される。

ログ記録には一定以上の時間がかかるとする。

こういう場合は、処理するべきメールログ(およびそれに必要データ)をジョブキューに突っ込んでいき、必要な前処理は全て済ました状態で一気にデキューしていくのがいい。

ただしこの方法使用するには、ジョブキュー管理や並行処理の管理など、いくつかの追加的な技術必要になる。

またシステムリソース考慮に入れる必要がある。例えば、メモリCPU使用量など。

このようなアプローチは、高速なレスポンスタイムが求められるシステムや、大量のデータ効率的に処理する必要があるシステムでよく使用される。

ジョブキュー使用してバックグラウンド時間がかかるタスクを処理することで、ユーザーに対するレスポンスタイムを短縮し、システムパフォーマンスを向上させることができる。

2024-06-05

[]なぜ機能しているかからないものはそっとしておく

高速化のためといい、前任者がcythonで書いたランダムフォレストコードがあり、どういうわけかsklearnよりも数倍速い

社内ではリラキングモデル(LTR)のためにこのランダムフォレストを使っているらしい

というのも外部ライブラリに頼ると面倒なことになるという認識が開発当初にあり、開発に関係するライブラリは全て自前で書いていたようだ

しかし前任が去ったことでこの最適化最適化を凝らしたようなモジュール理解が誰もできない

しかしかと言って速度面ではsklearnには戻れない

こういうとき深呼吸し、「なんか知らんが動いてるからヨシ」と言って目を背けよう

大丈夫神様ちゃん評価してくださっている

[] サンプル欲しけりゃ自動化しろ

かにプロトタイプを使ってもらって「入力Aに対して出力Bが得られる例はない?」などと言われることがあるだろう

例えばレコメンダシステムでは、ユーザーの行動を入力としてアイテムを出力する

「こういう行動をした場合と、してない場合で、こういうアイテムの違いが想定されて欲しい」という要望が出てくるのである

そういう場合は、可能な行動の組み合わせを全て網羅して、それらを関数自動的入力し、その出力をファイルとして出すなどして見てもらって自動化したほうが良い

要するに、プロトタイプポチポチ触るだけでは効率が悪い場合は、入力の組み合わせを自動入力してしまったほうが早いわけである

もし出力に条件があれば、その条件をフィルタリングすることも可能だろう

ただし、自動化設計実装には時間と労力が必要

そのため、自動化必要かどうか、またどの程度の自動化が適切かを判断するためには、テスト目的範囲、そして利用可能リソース考慮することが重要

自動化が適切に行われれば、時間と労力を節約し、より高品質システムを開発することが可能になる

2024-05-31

[] 施策実施前と実施後の比較目視確認できるようにする

モデルAは特徴量を10000個使っていたが、追加で4000個の特徴量を付与したモデルBを作ったとする。

モデルAとモデルBをテストデータを使ってテストすることも可能だが、使用感を確かめるなどの目的場合は、入出力を明確化してデモにするとわかりやすかったりする。

例えばそれは「検索エンジン」のモデルだったりするわけだが、モデルAとBを切り替えるボタン検索エンジンデモに用意しておき、検証可能にしておくのである

具体的には、検索クエリ入力し、その結果をモデルAとモデルBで比較できるようにするということだ。

それにより、各モデルがどのように異なる結果を生成するか、また新たに追加された特徴量が結果にどのように影響を与えるかを直接確認できる。

ただし、このデモ設計する際には、結果を解釈するのを助けるために、各モデルの主要な特徴と動作原理についての説明提供する。

これにより、モデル選択とその結果に対する理解を深めることができる。

2024-05-29

[] 事前に精度の許容条件に合意する

何かテキストを分類するようなモデルを作っているとする。

それで、上司デモを見せる。上司モデルが失敗する細かい条件を見つけ出し「ダメだよ君ぃ、こんなものTrueにしちゃうようじゃ」と言う。

これは不毛なやり方である。いつまで経ってもモデルOKサインが出なくなる。

そこで、予め「このテストデータに対し、これ以上の精度が要件」と決めておくほうが良い。ただし、以下も注意。

2024-05-23

[] 推薦システムは期待利益を利用しろ

推薦システムアルゴリズムは様々ありえて、要するにユーザーに対してどのアイテムを見せるのか、その優先順を出せということだ

マルチステークホルダーだのなんだのという理論があるが、それは単にプロバイダーやユーザーを公平に扱うべきであるという倫理的理由に基づいたものであり、利益とは直接の関係はない

アイテムを消費する確率と、そのアイテムを消費したときに入る単価の積によって期待利益を求め、その期待利益に沿って優先順を決めるのが良いだろう

そうすればそこに競争原理が導入されるし、より多くアイテムを表示させたいと思うプロバイダーは単価を上げてくるだろう

2024-05-15

[] 中間結果を保存してエラーの原因を特定やすしろ

たまに次のような書き方をする人がいるかもしれない。

result = f(g(x, h(y)))[0]

これはエラーメッセージをわかりにくくするのでおすすめできない。例えばIndexErrorが出たとして、どの部分のエラーかパッと見てわかりやすいだろうか。

以下のようにするべき。

z = h(y)
tmp1 = g(x, z)
tmp2 = f(tmp1)
result = tmp2[0]

中間結果を保存しているので、デバッグもしやすい。

[] 最小要件から始める

ユーザー属性の種類ごとに広告を表示する機能必要としよう。

いきなり本格的な広告管理ツールを作るためにデータベース設計するのではなく、最初は簡易的なプレーンテキスト形式設定ファイル管理するところから始める。

そうすれば当面の間はその簡易機能対応できるし、対応の速度も早い。

広告管理スケールが大きくなってきたと感じたところで広告管理CRUD設計するのでも遅くはない。

ただし、このアプローチ採用する際には、将来的にデータベースに移行することを見越した設計をすることが重要

具体的には、設定ファイル形式選択する際には、データベースに容易にインポートできる形式を選ぶこと、また、データ整合性を保つための適切なバリデーションルールを設けることなど。

2024-05-09

[] 自動フォーマッタのコミット

自動フォーマッタを適用したときに、機能追加のコードなども一緒にコミットすると、どれが機能追加でどれが自動フォーマッタの適用部分なのかわかりにくくなる。

機能追加は機能追加分だけでコミットし、自動フォーマッタ適用コミットは分離したほうがよい。

2024-05-05

[] 余計なリポジトリを追加するな

娯楽目的でhypnotixを入れるためだけに非公式リポジトリ容認するなんてのは、やめといたほうがいいな

バックドアがどこに仕込まれいるかわかったものではない

hypnotixを入れるのではなく、公式リポジトリからvlcでも入れて観たほうが良い

ログイン ユーザー登録
ようこそ ゲスト さん