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