健康長寿・献立作成
をテンプレートにして作成
[
トップ
] [
新規
|
一覧
|
検索
|
最終更新
|
ヘルプ
]
開始行:
[[由利恵]]
*目次 [#e890b3d5]
#CONTENTS
**目的 [#z78b3c7b]
***バージョン [#ta19c6d2]
#ref(py3.12バージョン.png,,35%)
~
*環境 [#y9e9060b]
Python 3.10.1 64bitでやってますが,たぶんどのバージョンも...
pymooはバージョン0.5.0を使いましょう。
**準備 [#p740f0cb]
まず、pymooをインストールします。pymooはpythonでNSGA2を実...
また、pymooはバージョンによってコードの書き方が変わります...
自分は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...
~
*動かし方 [#ccda06db]
1.codeの中の, ''&color(red){献立作成.py};'', ''&color(re...
2.必要なモジュールをすべて入れる.(pip installなど)~
3.最初はPython trial の画面が出てくるので, 30日間の無料t...
4. 画面通りに進める.~
5. 途中, グラフが表示されるので, 削除すると, 次に進む.~
6. スライダーを動かし, 重視する比率を決める.~
7. 進んでいくと候補が表示され,選択してから「決定」を押す...
8. 項目を選択し, データを送信する.~
9. ''&color(green){cdijnklmn_extracted_with_headers.csv};...
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, ...
''&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 を動かすと, 選択肢メニューが表示されるので, ...
その後は, 献立作成.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,,)
青色がロジスティック回帰分析を一回目に行った結果の精度、...
今回は、精度、適合率、再現率、F値の中から精度に関してt検...
精度の場合は、青色と緑のデータから黄色とオレンジの部分を...
Excelでのt検定の順序を次に示します。&br;
1
#ref(bunseki.png,,)
2
#ref(bun2.png,,)
3
#ref(bun3.png,,)
これらの作業で右下のようなひょうが表示されるので、t検定...
#ref(0218.JPG,,50%)
*プログラムの説明 [#k0f9c864]
**NSGA-Ⅱ [#b41e0433]
#ref(1.png,,)
#ref(2.png,,)
1.サンプリング(MySampling)&br;
n_max 個の要素を選択し、それをブール値の配列として表現す...
n_samples 回繰り返して初期個体群を生成。&br;
交叉(BinaryCrossover)
2.交叉(BinaryCrossover)
2つの親(p1 と p2)の情報を組み合わせて子を作成。
両方の親が True の要素はそのまま保持。&br;
それ以外の部分はランダムに片方の親から選択。&br;
突然変異(MyMutation)
3.突然変異(MyMutation)
ランダムに True の要素を False にし、False の要素を True ...
変異の発生は 1 回のフリップのみ(1要素だけが変化)。&br;
4.最適化問題の設定(SubsetProblem)
n_max(レシピ数)が 7×day なので、1日7品、day 日分の献立...
制約条件 c_max = 300(コスト上限?)を設定。&br;
Ti, Gi, Ci, f0j, f1j, f2j などのパラメータが問題に影響。&...
eer, rtanpaku, rsisitu, rtansui も栄養関連の制約と推測。&...
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)パレート解;''.を提...
#ref(3.png,,)
#ref(4.png,,)
**サーバー(Flask) [#ieea1af2]
処理の流れ
1.フォームデータの受け取り
mnumber, l1number, l2number, ... などの値をフォームから取...
ユーザーの回答(q1, q2, q3, q4)も取得。&br;
2.対応するCSVファイルのパスを生成
base_dir にある recipe_noX.csv の形でファイル名を作成。&br;
3.CSVファイルの存在確認と更新
recipe_noX.csv が存在するか確認。&br;
存在すれば読み込み、ユーザーの回答を新しい列として追加(...
そのまま上書き保存。&br;
4.データの抜き出し
各CSVファイルから1行目(iloc[0:1])を抜き出し、cdijnklmn_...
#ref(5.png,,)
#ref(6.png,,)
**ロジスティック回帰分析 [#z7ac4a76]
1。CSVデータの読み込み
df_train: 学習用データ (cdijnklmn_extracted_with_headers....
df_predict: 予測用データ (combined_second_rows.csv)&br;
2.説明変数リストの設定
食材や栄養素、料理の調理方法など、多数の特徴量が含まれる...
3.process_question() 関数
スケーリング(StandardScaler)
→ 標準化(平均0, 分散1に変換)を実施&br;
SMOTEによるクラスバランスの調整&br;
→ sampling_strategy=1.0 で少数クラスのサンプルをオーバー...
ロジスティック回帰の学習と予測&br;
→ sample_weight を使って学習し、予測確率を算出&br;
4.q1〜q4の分析準備&br;
x_train と x_predict を設定&br;
results 辞書を用意(予測結果を格納するため)&br;
5.q1〜q4の予測
process_question() を使って各質問(q1〜q4)の確率を算出し...
6.各レシピファイルに予測結果を書き込む
recipe_no{i + 1}.csv を開き、該当する列(UX項目)がなけれ...
2行目から26行目まで の範囲で、予測確率を -prob_q1 などの...
cp932(Shift-JIS互換)で上書き保存する。&br;
7.要約結果を作成
results["q1"] >= 0.5 のように0.5を閾値として0/1に変換し、...
summary_results.csv に保存。&br;
**データの前処理 [#y1390349]
recipe_noX.csvに対して以下の処理を行う。&br;
1.予測結果の追加
q1〜q4の予測値を recipe_no{i}.csv に追加&br;
2.作り方データの統合
howto.csv から recipe_no{i}.csv に対応する作り方データを...
3.作り方の基本動作ワードのカウント
切, 混, 焼, 煮, などの単語が作り方に何回出現するかをカウ...
4.栄養データの処理
recipe_no{i}.csv の6,7列目(栄養素名と栄養量)を抽出し、...
5.食材リストのマッチング
recipe_no{i}.csv の5列目を対象に、指定した食材が含まれ...
食材データの統合&br;
6.ingredient_presence.csv のデータを recipe_no{i}.csv に...
不要な列の削除
recipe_no{i}.csv の5〜8列目を削除&br;
**ロジスティック回帰分析 [#k27f148d]
ロジスティック回帰の概要&br;
ロジスティック回帰は、結果が「成功 or 失敗」「はい or い...
数学的には、以下のように**シグモイド関数(ロジスティック...
#ref(7.png,,)
ロジスティック回帰は、各𝑋の影響を学習し、UX項目が「あるか...
**SMOTE [#f566098f]
SMOTE(Synthetic Minority Over-sampling Technique)は、不...
SMOTEの仕組み
SMOTEは、単純に少数クラスのデータをコピーして増やすのでは...
SMOTEの手順&br;
1.少数クラスのデータをランダムに選択&br;
2.選択したデータの近傍から k 個の最近傍点を見つける(k-NN...
3.最近傍のいずれかの点と選択した点を直線で結ぶ&br;
4.その直線上の適当な点をランダムに選び、新しいデータポイ...
5.このプロセスを繰り返して、少数クラスのデータを増やす&br;
メリット&br;
✅ データのバランスを改善し、学習精度を向上&br;
✅ 単純なコピーではなく、新しいデータを合成するので過学習...
✅ ロジスティック回帰や決定木、ランダムフォレストなど幅広...
デメリット&br;
❌ 合成データが現実的でない可能性がある(特に非線形な分布...
❌ k-NNを使うため、データの分布に影響を受けやすい&br;
❌ データ数が増えるので、計算コストが高くなる&br;
終了行:
[[由利恵]]
*目次 [#e890b3d5]
#CONTENTS
**目的 [#z78b3c7b]
***バージョン [#ta19c6d2]
#ref(py3.12バージョン.png,,35%)
~
*環境 [#y9e9060b]
Python 3.10.1 64bitでやってますが,たぶんどのバージョンも...
pymooはバージョン0.5.0を使いましょう。
**準備 [#p740f0cb]
まず、pymooをインストールします。pymooはpythonでNSGA2を実...
また、pymooはバージョンによってコードの書き方が変わります...
自分は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...
~
*動かし方 [#ccda06db]
1.codeの中の, ''&color(red){献立作成.py};'', ''&color(re...
2.必要なモジュールをすべて入れる.(pip installなど)~
3.最初はPython trial の画面が出てくるので, 30日間の無料t...
4. 画面通りに進める.~
5. 途中, グラフが表示されるので, 削除すると, 次に進む.~
6. スライダーを動かし, 重視する比率を決める.~
7. 進んでいくと候補が表示され,選択してから「決定」を押す...
8. 項目を選択し, データを送信する.~
9. ''&color(green){cdijnklmn_extracted_with_headers.csv};...
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, ...
''&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 を動かすと, 選択肢メニューが表示されるので, ...
その後は, 献立作成.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,,)
青色がロジスティック回帰分析を一回目に行った結果の精度、...
今回は、精度、適合率、再現率、F値の中から精度に関してt検...
精度の場合は、青色と緑のデータから黄色とオレンジの部分を...
Excelでのt検定の順序を次に示します。&br;
1
#ref(bunseki.png,,)
2
#ref(bun2.png,,)
3
#ref(bun3.png,,)
これらの作業で右下のようなひょうが表示されるので、t検定...
#ref(0218.JPG,,50%)
*プログラムの説明 [#k0f9c864]
**NSGA-Ⅱ [#b41e0433]
#ref(1.png,,)
#ref(2.png,,)
1.サンプリング(MySampling)&br;
n_max 個の要素を選択し、それをブール値の配列として表現す...
n_samples 回繰り返して初期個体群を生成。&br;
交叉(BinaryCrossover)
2.交叉(BinaryCrossover)
2つの親(p1 と p2)の情報を組み合わせて子を作成。
両方の親が True の要素はそのまま保持。&br;
それ以外の部分はランダムに片方の親から選択。&br;
突然変異(MyMutation)
3.突然変異(MyMutation)
ランダムに True の要素を False にし、False の要素を True ...
変異の発生は 1 回のフリップのみ(1要素だけが変化)。&br;
4.最適化問題の設定(SubsetProblem)
n_max(レシピ数)が 7×day なので、1日7品、day 日分の献立...
制約条件 c_max = 300(コスト上限?)を設定。&br;
Ti, Gi, Ci, f0j, f1j, f2j などのパラメータが問題に影響。&...
eer, rtanpaku, rsisitu, rtansui も栄養関連の制約と推測。&...
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)パレート解;''.を提...
#ref(3.png,,)
#ref(4.png,,)
**サーバー(Flask) [#ieea1af2]
処理の流れ
1.フォームデータの受け取り
mnumber, l1number, l2number, ... などの値をフォームから取...
ユーザーの回答(q1, q2, q3, q4)も取得。&br;
2.対応するCSVファイルのパスを生成
base_dir にある recipe_noX.csv の形でファイル名を作成。&br;
3.CSVファイルの存在確認と更新
recipe_noX.csv が存在するか確認。&br;
存在すれば読み込み、ユーザーの回答を新しい列として追加(...
そのまま上書き保存。&br;
4.データの抜き出し
各CSVファイルから1行目(iloc[0:1])を抜き出し、cdijnklmn_...
#ref(5.png,,)
#ref(6.png,,)
**ロジスティック回帰分析 [#z7ac4a76]
1。CSVデータの読み込み
df_train: 学習用データ (cdijnklmn_extracted_with_headers....
df_predict: 予測用データ (combined_second_rows.csv)&br;
2.説明変数リストの設定
食材や栄養素、料理の調理方法など、多数の特徴量が含まれる...
3.process_question() 関数
スケーリング(StandardScaler)
→ 標準化(平均0, 分散1に変換)を実施&br;
SMOTEによるクラスバランスの調整&br;
→ sampling_strategy=1.0 で少数クラスのサンプルをオーバー...
ロジスティック回帰の学習と予測&br;
→ sample_weight を使って学習し、予測確率を算出&br;
4.q1〜q4の分析準備&br;
x_train と x_predict を設定&br;
results 辞書を用意(予測結果を格納するため)&br;
5.q1〜q4の予測
process_question() を使って各質問(q1〜q4)の確率を算出し...
6.各レシピファイルに予測結果を書き込む
recipe_no{i + 1}.csv を開き、該当する列(UX項目)がなけれ...
2行目から26行目まで の範囲で、予測確率を -prob_q1 などの...
cp932(Shift-JIS互換)で上書き保存する。&br;
7.要約結果を作成
results["q1"] >= 0.5 のように0.5を閾値として0/1に変換し、...
summary_results.csv に保存。&br;
**データの前処理 [#y1390349]
recipe_noX.csvに対して以下の処理を行う。&br;
1.予測結果の追加
q1〜q4の予測値を recipe_no{i}.csv に追加&br;
2.作り方データの統合
howto.csv から recipe_no{i}.csv に対応する作り方データを...
3.作り方の基本動作ワードのカウント
切, 混, 焼, 煮, などの単語が作り方に何回出現するかをカウ...
4.栄養データの処理
recipe_no{i}.csv の6,7列目(栄養素名と栄養量)を抽出し、...
5.食材リストのマッチング
recipe_no{i}.csv の5列目を対象に、指定した食材が含まれ...
食材データの統合&br;
6.ingredient_presence.csv のデータを recipe_no{i}.csv に...
不要な列の削除
recipe_no{i}.csv の5〜8列目を削除&br;
**ロジスティック回帰分析 [#k27f148d]
ロジスティック回帰の概要&br;
ロジスティック回帰は、結果が「成功 or 失敗」「はい or い...
数学的には、以下のように**シグモイド関数(ロジスティック...
#ref(7.png,,)
ロジスティック回帰は、各𝑋の影響を学習し、UX項目が「あるか...
**SMOTE [#f566098f]
SMOTE(Synthetic Minority Over-sampling Technique)は、不...
SMOTEの仕組み
SMOTEは、単純に少数クラスのデータをコピーして増やすのでは...
SMOTEの手順&br;
1.少数クラスのデータをランダムに選択&br;
2.選択したデータの近傍から k 個の最近傍点を見つける(k-NN...
3.最近傍のいずれかの点と選択した点を直線で結ぶ&br;
4.その直線上の適当な点をランダムに選び、新しいデータポイ...
5.このプロセスを繰り返して、少数クラスのデータを増やす&br;
メリット&br;
✅ データのバランスを改善し、学習精度を向上&br;
✅ 単純なコピーではなく、新しいデータを合成するので過学習...
✅ ロジスティック回帰や決定木、ランダムフォレストなど幅広...
デメリット&br;
❌ 合成データが現実的でない可能性がある(特に非線形な分布...
❌ k-NNを使うため、データの分布に影響を受けやすい&br;
❌ データ数が増えるので、計算コストが高くなる&br;
ページ名: