きどたかのブログスマートフォン用の表示で見るきどたかのブログいつか誰かがこのブログからトラブルを解決しますように。Optunaさいきん書いたんで、どういうコードを書いたかをテキトーに書く。ちなみに、公式のモデル保存の例はこちら。https://optuna.readthedocs.io/en/stable/faq.html#how-to-save-machine-learning-models-trained-in-objective-functions嫌だ、trial数分のモデルを保存するだなんて!では、話を戻して。今回の実装の制限事項は、シリアルでしか正しく動かないことかな。__init__で、X_trainなどに加えて、Callbackクラスも受け取る。trial)内で、学習したのち、良い悪いに関わらず、出来たモデルをCallbackクラスに引き渡す、その際のキーは、trialのnumberにする。max_binもチューニングしたいなら、lgb.Datasetは毎回作らないといけない。codeCallbackの実装Callbackクラスは元来、study.optimize()に渡すものです。今回も渡しますけどね。study.best_trial.numberがtrial.numberと一致したら、ベストが更新されてます。登録されてるはずのモデルを取り出せるはずです。ベストが更新されてないなら、要らないモデルが登録されてるはずです、消してしまいましょう。モデルの登録はただのdictを使うだけです。ついでに、bestが更新されたら、best_paramsをjsonにして保存したり、更新されなくても、studyのdataframeを毎回保存したりなんかも出来ます。これをしてると、何トライアル目かを高速に流れるログから探さなくてすみます。study.trials_dataframe()思ったより終わらずに、止めたくなることがある。いう時に備えて、ベスト更新時に、ファイル保存。ベスト未更新でもtrials_dataframe()を毎回ファイル保存。callback.get_model(study.best_trial.number)再現性を持たせたい時には、TPESamplerのseedを固定する必要がある。ベストモデルを毎回保存するなら、Callbackの__call__の中で書けばいい。最後にcallbackから取り出して保存するなら、optimize後に取り出して保存すればいい。add_modelを明示的に呼ぶのがやはりださい。y))こっちのパターンのほうが汎用性が高いか?結局はobjective側で何を登録するのか決めてるので、利点はなさそう。You、DLL呼び出しちゃいなよgolang発端java.nio.file.attributeで「所有者」情報が取れる。PowerShellでも取れる。Go言語はどうだ?調査たとえば、C++でそれを行う場合、こういうことをする。(Windows)ここで登場する「GetSecurityInfo関数」はGo言語で使われているか?調べた結果、使われていない。dll呼び出しは、"src/syscall/zsyscall_windows.go"を読むと分かる。「GetSecurityInfo関数」は、「advapi32.dll」に含まれています。(Windows)Go言語は、内部で「advapi32.dll」を読み込んではいるものの、「GetSecurityInfo関数」を呼び出せるようにはなっていません。今見ているソースはGo1.8です。挑戦ネジがゆるい私は、「よし、DLL呼び出してみよう」と、泥船に足を突っ込んだ。Go内部では、ロードしているDLLですが、変数が公開されていません。しかたない、自分でロードすんぜ。modadvapi32.NewProc("GetSecurityInfo"))はい、ただのもろパクリです。あ、でもsysdll.Add()を挟むのは除外しました、なぜならばinternalはコンパイルエラーになるからです。NewLazyDLLやNewProcについては、「src/syscall/dll_windows.go」に書かれています。Procには呼び出し用のポインタレシーバが付いてます。error)とりあえず、引数を全部uintptrで渡せってことか。HANDLEhandleには、ファイルハンドルを渡すことになる。os.OpenFileして、fileからFdを得ると、それはuintptrなので、そのまま渡してみる。SE_OBJECT_TYPE今回は、SE_FILE_OBJECTを渡したいわけです。(Windows)enumで先頭が0初期化してますから、2つ目の定数SE_FILE_OBJECTは、1ってことですね。これをuintptrで渡すとか、まどろっこしいなぁ。SECURITY_INFORMATION今回はOWNER_SECURITY_INFORMATIONを渡したいので、おそらく1ですDWORDとあるので、uint32にしときます。型はPSIDこれが受け取りたい。PSIDって何?どうやら、可変長な構造であるSIDをポイントしているポインターっぽい。uintptr(unsafe.Pointer(sid))ちょっと変数名をどうするか、ちぐはぐな感じになったが、こんな感じで書いてみた。LookupSIDを参考にしている。残りの引数どうせオプションだし、渡さないことにする。ダメだった点1をあらわしている引数をuintptrにして渡してるのがどうもダメっぽかったので修正。最終的にこの形にした。