技術資料

目次 

目的 

使用するファイル全部 

用途ファイル名ファイルの場所
データ収集献立作成.pycode
データ収集server1.pycode
uxを考慮してデータ収集2献立作成.pycode
ロジスティック回帰分析rogi.pycode
集めたデータcdijnklmn_extracted_with_headers.csvcode


動かし方 

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.

献立作成1.png


人数を入力する.

2.

献立作成2.png


各項目を入力する.

3.

献立作成3.png


アレルギーがあれば入力する.

4.

献立作成4.png


患っている, または, 予防したい生活習慣病を選択する.

5.

献立作成5.png


日数を設定する.

6.

献立作成6.png


グラフが表示されるので, 確認したら消す.

7.

献立作成7.png


スライダーを動かし, 比率を決める.

8.

献立作成8.png


候補が表示されるので, OKなら[決定]を押す.

9.

献立作成9.png


候補1がホームページに表示される. [次へ]を押すと, 候補2, 候補3 と表示される.

10.

献立作成10.png


ホームページの画面.

11.

献立作成11.png


料理ごとの項目を選択していき, [送信]を押す. 画像通りになると, 送信できている.


cdijnklmn_extracted_with_headers.csv 


12.

献立作成12.png


cdijnklmn_extracted_with_headers.csv を開き, [Ctrl] + [A] で全選択してから標準→数値にする.
上書き保存も忘れずに.

rogi.py 


13.

rogi.png


rogi.py を動かす. ロジスティック回帰分析がうまくいくと, 画面のようになる.

2献立作成.py 


14.

2献立作成1.png


2献立作成.py を動かすと, 選択肢メニューが表示されるので, 2つ選択し, [選択]を押す.
その後は, 献立作成.py と同じなので割愛する.
15.

2献立作成2.png


16.

2献立作成3.png


17.

2献立作成4.png


18.

2献立作成5.png


19.

2献立作成6.png


20.

2献立作成7.png

プログラムの説明 

NSGA-Ⅱ 

1.png
2.png

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)パレート解;.を提示する

3.png
4.png

サーバー(Flask) 

処理の流れ

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 と に追記保存。ロジスティック回帰分析のために使用する

5.png
6.png

ロジスティック回帰分析 

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 

SMOTE(Synthetic Minority Over-sampling Technique)は、不均衡データ(クラスの割合が極端に偏っているデータ)を扱うためのオーバーサンプリング手法の一つだよ。特に、少数クラス(minority class)のデータを人工的に生成して、クラスバランスを改善する目的で使われる。

SMOTEの仕組み SMOTEは、単純に少数クラスのデータをコピーして増やすのではなく、既存のデータを基に新しいデータを合成(シンセティック) する。

SMOTEの手順
1.少数クラスのデータをランダムに選択
2.選択したデータの近傍から k 個の最近傍点を見つける(k-NNを利用)
3.最近傍のいずれかの点と選択した点を直線で結ぶ
4.その直線上の適当な点をランダムに選び、新しいデータポイントとして追加
5.このプロセスを繰り返して、少数クラスのデータを増やす

メリット
✅ データのバランスを改善し、学習精度を向上
✅ 単純なコピーではなく、新しいデータを合成するので過学習を防げる
✅ ロジスティック回帰や決定木、ランダムフォレストなど幅広いモデルで使える

デメリット
❌ 合成データが現実的でない可能性がある(特に非線形な分布の場合)
❌ k-NNを使うため、データの分布に影響を受けやすい
❌ データ数が増えるので、計算コストが高くなる


トップ   新規 一覧 検索 最終更新   ヘルプ   最終更新のRSS