#author("2025-02-27T20:35:06+01:00","","") #author("2025-02-27T20:39:35+01:00","","") [[技術資料]] *目次 [#e890b3d5] #CONTENTS **目的 [#z78b3c7b] ***バージョン [#ta19c6d2] #ref(py3.12バージョン.png,,35%) ~ *環境 [#y9e9060b] Python 3.10.1 64bitでやってますが,たぶんどのバージョンもできるはず...&br; pymooはバージョン0.5.0を使いましょう。 **準備 [#p740f0cb] まず、pymooをインストールします。pymooはpythonでNSGA2を実行するためのモジュールです。&br; また、pymooはバージョンによってコードの書き方が変わります。&br; 自分は0.5.0を使っているので0.5.0をインストールする。&br; pip install pymoo == 0.5.0 ***使用するファイル全部 [#ta19c6d2] |用途|ファイル名|ファイルの場所| |データ収集|献立作成.py|Google ドライブ 2324| |データ収集|server1.py|Google ドライブ 2324| |uxを考慮してデータ収集|2献立作成.py|Google ドライブ 2324| |ロジスティック回帰分析|rogi.py|Google ドライブ 2324| |集めたデータ|cdijnklmn_extracted_with_headers.csv|Google ドライブ 2324| ~ *動かし方 [#ccda06db] 1.codeの中の, ''&color(red){献立作成.py};'', ''&color(red){server1.py};''を動かす.~ 2.必要なモジュールをすべて入れる.(pip installなど)~ 3.最初はPython trial の画面が出てくるので, 30日間の無料trialか, アカウント登録(無料)する.~ 4. 画面通りに進める.~ 5. 途中, グラフが表示されるので, 削除すると, 次に進む.~ 6. スライダーを動かし, 重視する比率を決める.~ 7. 進んでいくと候補が表示され,選択してから「決定」を押すと, ホームページに飛ぶ.~ 8. 項目を選択し, データを送信する.~ 9. ''&color(green){cdijnklmn_extracted_with_headers.csv};''を開き, [Ctrl] + [A] で全選択してから標準→数値にする.~ 10. ''&color(red){rogi.py};''を動かし, ロジスティック回帰分析を行う.~ 11. ''&color(red){2献立作成.py};''を動かす.~ 12. 選択肢メニューが表示されるので, 2つ選び, 画面通りに進む.~ 13. 4. に戻る.~ ※4.~11.を繰り返すことで, より自分にあったメニューが表示されるようになる.~ **献立作成 [#c9661663] ~ 表示される画面を順番通りに載せておく.~ ''&color(red){1};''. #ref(献立作成1.png,,50%) ~ 人数を入力する.~ ''&color(red){2};''. #ref(献立作成2.png,,35%) ~ 各項目を入力する.~ ''&color(red){3};''. #ref(献立作成3.png,,35%) ~ アレルギーがあれば入力する.~ ''&color(red){4};''. #ref(献立作成4.png,,35%) ~ 患っている, または, 予防したい生活習慣病を選択する.~ ''&color(red){5};''. #ref(献立作成5.png,,35%) ~ 日数を設定する.~ ''&color(red){6};''. #ref(献立作成6.png,,35%) ~ グラフが表示されるので, 確認したら消す.~ ''&color(red){7};''. #ref(献立作成7.png,,50%) ~ スライダーを動かし, 比率を決める.~ ''&color(red){8};''. #ref(献立作成8.png,,50%) ~ 候補が表示されるので, OKなら[決定]を押す.~ ''&color(red){9};''. #ref(献立作成9.png,,50%) ~ 候補1がホームページに表示される. [次へ]を押すと, 候補2, 候補3 と表示される.~ ''&color(red){10};''. #ref(献立作成10.png,,20%) ~ ホームページの画面.~ ''&color(red){11};''. #ref(献立作成11.png,,20%) ~ 料理ごとの項目を選択していき, [送信]を押す. 画像通りになると, 送信できている.~ ~ **cdijnklmn_extracted_with_headers.csv [#c9661663] ~ ''&color(red){12};''. #ref(献立作成12.png,,20%) ~ cdijnklmn_extracted_with_headers.csv を開き, [Ctrl] + [A] で全選択してから標準→数値にする.~ 上書き保存も忘れずに.~ **rogi.py [#c9661663] ~ ''&color(red){13};''. #ref(rogi.png,,15%) ~ rogi.py を動かす. ロジスティック回帰分析がうまくいくと, 画面のようになる. **2献立作成.py [#c9661663] ~ ''&color(red){14};''. #ref(2献立作成1.png,,50%) ~ 2献立作成.py を動かすと, 選択肢メニューが表示されるので, 2つ選択し, [選択]を押す.~ その後は, 献立作成.py と同じなので割愛する.~ ''&color(red){15};''. #ref(2献立作成2.png,,35%) ~ ''&color(red){16};''. #ref(2献立作成3.png,,50%) ~ ''&color(red){17};''. #ref(2献立作成4.png,,50%) ~ ''&color(red){18};''. #ref(2献立作成5.png,,50%) ~ ''&color(red){19};''. #ref(2献立作成6.png,,20%) ~ ''&color(red){20};''. #ref(2献立作成7.png,,20%) ''&color(red){21};''. 次にt検定を説明します。&br; 次のファイルに結果が蓄積されていきます&br; #ref(evaluation_metrics.csv)&br; 今回はデータ例を使ってt検定を行いましょう&br; 使うファイルは&br; #ref(収集した例.csv) です。 中身は下のようになっています。 #ref(rei.png,,) まず今回扱うデータを色で示します。&br; #ref(bun5.png,,) 青色がロジスティック回帰分析を一回目に行った結果の精度、緑色が一番最新の精度のデータです。q1からq4はUX項目の精度などを表します。&br; 今回は、精度、適合率、再現率、F値の中から精度に関してt検定を行います。&br; 精度の場合は、青色と緑のデータから黄色とオレンジの部分を使い、平均値に差があるかをt検定によって求めます。&br; Excelでのt検定の順序を次に示します。&br; 1 #ref(bunseki.png,,) 2 #ref(bun2.png,,) 3 #ref(bun3.png,,) これらの作業で右下のようなひょうが表示されるので、t検定が片側で棄却されるか確認してください。オレンジのまるの部分が0.05(α=0.05の場合)未満ならば帰無仮説は棄却され有意性があると認められます。&br; #ref(0218.JPG,,50%) *プログラムの説明 [#k0f9c864] **NSGA-Ⅱ [#b41e0433] #ref(1.png,,) #ref(2.png,,) 1.サンプリング(MySampling)&br; n_max 個の要素を選択し、それをブール値の配列として表現する。&br; n_samples 回繰り返して初期個体群を生成。&br; 交叉(BinaryCrossover) 2.交叉(BinaryCrossover) 2つの親(p1 と p2)の情報を組み合わせて子を作成。 両方の親が True の要素はそのまま保持。&br; それ以外の部分はランダムに片方の親から選択。&br; 突然変異(MyMutation) 3.突然変異(MyMutation) ランダムに True の要素を False にし、False の要素を True に変更。&br; 変異の発生は 1 回のフリップのみ(1要素だけが変化)。&br; 4.最適化問題の設定(SubsetProblem) n_max(レシピ数)が 7×day なので、1日7品、day 日分の献立を選ぶ。&br; 制約条件 c_max = 300(コスト上限?)を設定。&br; Ti, Gi, Ci, f0j, f1j, f2j などのパラメータが問題に影響。&br; eer, rtanpaku, rsisitu, rtansui も栄養関連の制約と推測。&br; 5.NSGA-II アルゴリズムの設定 pop_size=R(集団サイズ R)&br; sampling=MySampling()(カスタムサンプリング)&br; crossover=BinaryCrossover()(カスタム交叉)&br; mutation=MyMutation()(カスタム突然変異)&br; eliminate_duplicates=True(重複解を排除)&br; 6.最適化実行 minimize() に problem と algorithm を渡して最適化開始。&br; n_gen=gen(gen 世代進化させる)。&br; verbose=True で進捗を表示。&br; 最後にユーザに最適化された''&color(red)パレート解;''.を提示する&br; #ref(3.png,,) #ref(4.png,,) **サーバー(Flask) [#ieea1af2] 処理の流れ 1.フォームデータの受け取り mnumber, l1number, l2number, ... などの値をフォームから取得(ユーザが回答したレシピナンバーに対応している)。&br; ユーザーの回答(q1, q2, q3, q4)も取得。&br; 2.対応するCSVファイルのパスを生成 base_dir にある recipe_noX.csv の形でファイル名を作成。&br; 3.CSVファイルの存在確認と更新 recipe_noX.csv が存在するか確認。&br; 存在すれば読み込み、ユーザーの回答を新しい列として追加(入手しやすいか など)。&br; そのまま上書き保存。&br; 4.データの抜き出し 各CSVファイルから1行目(iloc[0:1])を抜き出し、cdijnklmn_extracted_data.csv と に追記保存。ロジスティック回帰分析のために使用する&br; #ref(5.png,,) #ref(6.png,,) **ロジスティック回帰分析 [#z7ac4a76] 1。CSVデータの読み込み df_train: 学習用データ (cdijnklmn_extracted_with_headers.csv)&br; df_predict: 予測用データ (combined_second_rows.csv)&br; 2.説明変数リストの設定 食材や栄養素、料理の調理方法など、多数の特徴量が含まれる。&br; 3.process_question() 関数 スケーリング(StandardScaler) → 標準化(平均0, 分散1に変換)を実施&br; SMOTEによるクラスバランスの調整&br; → sampling_strategy=1.0 で少数クラスのサンプルをオーバーサンプリング&br; ロジスティック回帰の学習と予測&br; → sample_weight を使って学習し、予測確率を算出&br; 4.q1〜q4の分析準備&br; x_train と x_predict を設定&br; results 辞書を用意(予測結果を格納するため)&br; 5.q1〜q4の予測 process_question() を使って各質問(q1〜q4)の確率を算出し、results に格納する。&br; 6.各レシピファイルに予測結果を書き込む recipe_no{i + 1}.csv を開き、該当する列(UX項目)がなければ追加する。&br; 2行目から26行目まで の範囲で、予測確率を -prob_q1 などの形で代入(負の値ににしているのは、NSGA-Ⅱでは二変数の最小化を行うため)。&br; cp932(Shift-JIS互換)で上書き保存する。&br; 7.要約結果を作成 results["q1"] >= 0.5 のように0.5を閾値として0/1に変換し、要約データフレームを作成。&br; summary_results.csv に保存。&br; **データの前処理 [#y1390349] recipe_noX.csvに対して以下の処理を行う。&br; 1.予測結果の追加 q1〜q4の予測値を recipe_no{i}.csv に追加&br; 2.作り方データの統合 howto.csv から recipe_no{i}.csv に対応する作り方データを取得し、新しいファイル (output_combined_{i}.csv) を作成&br; 3.作り方の基本動作ワードのカウント 切, 混, 焼, 煮, などの単語が作り方に何回出現するかをカウントし、recipe_no{i}.csv に追加&br; 4.栄養データの処理 recipe_no{i}.csv の6,7列目(栄養素名と栄養量)を抽出し、転置して25行に拡張し recipe_no{i}.csv に追加&br; 5.食材リストのマッチング recipe_no{i}.csv の5列目を対象に、指定した食材が含まれているかを判定し ingredient_presence.csv に保存 食材データの統合&br; 6.ingredient_presence.csv のデータを recipe_no{i}.csv に結合 不要な列の削除 recipe_no{i}.csv の5〜8列目を削除&br; **ロジスティック回帰分析 [#k27f148d] ロジスティック回帰の概要&br; ロジスティック回帰は、結果が「成功 or 失敗」「はい or いいえ」などの二値(0 or 1)で表せる場合に使う回帰分析の手法。&br; 数学的には、以下のように**シグモイド関数(ロジスティック関数)**を使って、確率 を求める。&br; #ref(7.png,,) ロジスティック回帰は、各𝑋の影響を学習し、UX項目が「あるかどうか」の確率を予測するモデルを作ることができる。&br; **SMOTE [#f566098f] SMOTE(Synthetic Minority Over-sampling Technique)は、不均衡データ(クラスの割合が極端に偏っているデータ)を扱うためのオーバーサンプリング手法の一つだよ。特に、少数クラス(minority class)のデータを人工的に生成して、クラスバランスを改善する目的で使われる。&br; SMOTEの仕組み SMOTEは、単純に少数クラスのデータをコピーして増やすのではなく、既存のデータを基に新しいデータを合成(シンセティック) する。&br; SMOTEの手順&br; 1.少数クラスのデータをランダムに選択&br; 2.選択したデータの近傍から k 個の最近傍点を見つける(k-NNを利用)&br; 3.最近傍のいずれかの点と選択した点を直線で結ぶ&br; 4.その直線上の適当な点をランダムに選び、新しいデータポイントとして追加&br; 5.このプロセスを繰り返して、少数クラスのデータを増やす&br; メリット&br; ✅ データのバランスを改善し、学習精度を向上&br; ✅ 単純なコピーではなく、新しいデータを合成するので過学習を防げる&br; ✅ ロジスティック回帰や決定木、ランダムフォレストなど幅広いモデルで使える&br; デメリット&br; ❌ 合成データが現実的でない可能性がある(特に非線形な分布の場合)&br; ❌ k-NNを使うため、データの分布に影響を受けやすい&br; ❌ データ数が増えるので、計算コストが高くなる&br;