#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;

トップ   編集 差分 履歴 添付 複製 名前変更 リロード   新規 一覧 検索 最終更新   ヘルプ   最終更新のRSS