0
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

Python×機械学習でのフルスタック基礎開発

Last updated at Posted at 2025-02-16

概要

Python(Flask)と機械学習を使用したフルスタック開発を実施。
講師は酒井潤さんで、レストラン推薦アプリケーション「roboter2」の構築を行う。
書籍「シリコンバレー一流プログラマーが教える Python プロフェッショナル大全」と有料のYouTube解説どうgを参考にしながら、学習を行なった。

学習教材

YouTube

image.png

書籍

image.png

内容

以下のカリキュラムで実施。
ポイントは、20.で機械学習を取り入れている点。

  1. はじめに
  2. Macに開発環境を設定する
  3. Windowsに開発環境設定をする
  4. 応用アプリのrobterの確認と新しく作るroboter2の概要
  5. 開発する手順とMVCイメージ
  6. logging設定
  7. ユーザーモデルの作成
  8. レストランモデルの作成
  9. レイトモデルの作成
  10. FlaskのWebサーバーの起動とhello htmlの作成
  11. FlaskでのPOST処理
  12. スタイルの変更
  13. templateの共有化
  14. 評価フォームの作成
  15. Flask WFTプラグインによるフォーム作成
  16. テンプレート、コントローラー、モデルの連携
  17. レストランモデルのget or create
  18. Rateテーベルのupdate or create
  19. レコメンデーションの画面作成
  20. 機械学習でレコメンデーションをする
  21. コードの見直し
  22. コードのフォーマットの修正
  23. 最後に

開発したアプリ

GitHub

動画

Screen-Recording-2025-02-16-at-11.30.15 AM_1.gif

TOP画面

image.png

おすすめレストラン紹介画面

image.png

レストラン評価画面

image.png

レストラン評価完了画面

image.png

おすすめ機能の解説

レストランとユーザーの評価するrate.pyにrecommend_restaurantを実装

テーブル構成

image.png

関数の概要

機能: ユーザーの過去のレストラン評価データに基づいて、そのユーザーが好む可能性の高いレストランを推薦します。
入力: ユーザーオブジェクト (User)
出力: おすすめのレストラン名のリスト

推薦の流れ

1. 設定による推薦方法の切り替え

RECOMMEND_ENGIN_ENABLEがtrueの場合、シンプルな推薦処理を実施。falseの場合は機械学習による推薦を実施。

if not settings.RECOMMEND_ENGIN_ENABLE:
    # シンプルな推薦処理
else:
    # 機械学習による推薦処理

2. シンプルな推薦処理

session = database.connnect_db()
recommend = [
    r.name
    for r in session.query(Restaurant).all()[:TOP_RECOMMEND_RESTAURANT_NUM]
]
session.close()
return recommend

データベースからすべてのレストラン情報を取得し、最初の TOP_RECOMMEND_RESTAURANT_NUM 個のレストラン名をリストとして返します。

3. 機械学習による推薦処理

3.1 データベースからユーザーの評価データ (rate テーブル) を取得し、pandas DataFrame df に格納します。

session = database.connnect_db()
df = pd.read_sql("SELECT user_id, restaurant_id, value from rate", session.bind)
session.close()

3.2 評価データを surprise ライブラリのデータ形式に変換します。

dataset_columns = ["user_id", "restaurant_id", "value"]
reader = Reader()
data = Dataset.load_from_df(df[dataset_columns], reader)

3.3 NormalPredictor を使用して、データの基本的な検証を行います。
エラーが発生した場合は、ログに記録し、None を返します。

try:
    cross_validate(NormalPredictor(), data, cv=2)
except ValueError as ex:
    logger.error({"action": "recommended_restaurant", "error": ex})
    return None

3.4 SVD モデルを訓練します。

svd = SVD()
trainset = data.build_full_trainset()
svd.fit(trainset)

3.5 各レストランに対するユーザーの予測評価値を計算し、予測評価値に基づいてレストランをランキングします。

predict_df = df.copy()
item_id = "restaurant_id"
predict_df["Predicted_Score"] = predict_df[item_id].apply(
    lambda x: svd.predict(user.id, x).est
)
predict_df = predict_df.sort_values(by=["Predicted_Score"], ascending=False)
predict_df = predict_df.drop_duplicates(subset=item_id)

3.6 予測結果の DataFrame が None の場合は、ログに記録し、空のリストを返します。

if predict_df is None:
    logger.error(
        {"action": "recommended_restaurant", "status": "no predict data"}
    )
    return []

3.7 ランキング上位のレストラン名をリストとして抽出します。

recommended_restaurants = []
for index, row in predict_df.iterrows():
    restaurant_id = int(row["restaurant_id"])
    restaurant = Restaurant.get(restaurant_id)
    recommended_restaurants.append(restaurant.name)
        return recommended_restaurants[:TOP_RECOMMEND_RESTAURANT_NUM]

4.まとめ

推薦アルゴリズム: 設定によってシンプルな推薦と機械学習を用いた推薦を切り替えます。
機械学習モデル: surprise ライブラリの SVD モデルを使用しています。
評価データ: データベースの rate テーブルから評価データを取得します。
エラーハンドリング: エラーが発生した場合、ログに記録し、適切な値を返します。
ログ出力: logger.error を使用してエラー情報をログに出力します。

0
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?