اذهب إلى المحتوى

السؤال

Recommended Posts

  • 0
نشر

هل تقصد إرسال البيانات إلى العنوان predict ؟

إذا كان كذلك فيمكنك إرساله في ال body هكذا من خلال برنامج postman ولكن يجب عليك أن تكون قد قمت بتسجيل الدخول أولا :

 image.thumb.png.0786ca4f4236e3cea34e5db8ece804cb.png

وهذه هي البيانات التي يمكنك إدخالها :

{
    "age":10,
    "sex":1.0,
    "cp":1,
    "trestbps":1,
    "chol":1,
    "fbs":1,
    "restecg":1,
    "thalch":2,
    "oldpeak":1,
    "slope":1,
    "thal":1,
    "ca":1,
    "exang":1

}

ولكن يفضل تغير نوع الطلب إلى post وليس get للتعامل معه بشكل أفضل.

  • 0
نشر
بتاريخ منذ ساعة مضت قال Youcef Kias:

yes but directly in the website, not using postman

أولا في ملف api.py يجب تغير get إلى post في Predict في السطر 22 هكذا :

class Predict(Resource):
    @login_required
    def post(self):
        args = parser.parse_args()
        print(args)
        df = pd.DataFrame([args]); Xs = scaler.transform(df)
        Xdl = extractor.predict(Xs); X = np.hstack([Xs, Xdl])
        y = int(rf.predict(X)[0]); probs = rf.predict_proba(X)[0].tolist()
        rec = (["مراجعة طبيب قلب","رسم قلب","متابعة مستمرة"]
               if y>=2 else ["نظام غذائي","رياضة","متابعة سنوية"])
        pr = Prediction(result=y, proba=probs, user=current_user._get_current_object())
        db.session.add(pr); db.session.commit()
        print(y,probs,rec)
        return jsonify(prediction=y, probabilities=probs, recommendations=rec)

بعد ذلك يجب إنشاء ملف templates\predict.html ولقد قمت بإرفاقه لك يمكنك وضعه مباشرة في مجلد templates وهذا هو الذي سيحوي النموذج والمدخلات إلى الخادم.

والآن في ملف auth.py يجب وضع المسار الجديد الذي يعرض النموذج هكذا :

@bp.route('/predict', methods=['GET'])
@login_required
def predict():
    return render_template('predict.html')

يجب إيقاف الخادم الآن وإعادة تشغيله والذهاب إلى العنوان 

http://127.0.0.1:5000/predict

وسيظهر لك النموذج .

predict.html

  • 0
نشر
بتاريخ On 5‏/7‏/2025 at 20:00 قال Youcef Kias:

مشكلة

المشكلة لديك هي  ValueError: X has 13 features, but StandardScaler is expecting 15 features as input بسبب عدم تطابق عدد السمات التي يتوقعها الـ scaler حيث تم تدريبه على 5 سمات رقمية محددة فقط.

أي عندما تستدعي الدالة scaler.transform(df)، يتوقع scaler أن تكون df لها نفس عدد الأعمدة 15 وبنفس الترتيب الذي تعلمه، لكن تمرر له DataFrame (df) يحتوي على 13 عمودًا فقط، وذلك يؤدي إلى الـ ValueError.

بالتالي عليك محاكاة نفس خطوات المعالجة المسبقة التي تمت في الـ Notebook داخل دالة التنبؤ في Flask، من خلال استقبال الـ 13 ميزة من المستخدم.

ثم إنشاء DataFrame من المدخلات، وافصله إلى جزأين:

  • df_numerical: DataFrame يحتوي على الميزات الرقمية الخمس.
  • df_categorical: DataFrame يحتوي على الميزات الفئوية الثمانية.

ويجب أن تكون قد قمت بحفظ كائن الـ One-Hot Encoder في ملف مثل encoder.joblib وقم بتحميله، ثم استخدم الكائن المحمل لتحويل df_categorical، وسينتج عن ذلك مصفوفة NumPy أو DataFrame جديد يحتوي على 10 أعمدة.

ثم قم بدمج بيانات الميزات الرقمية الخمس الأصلية مع بيانات الميزات الفئوية المحولة أي الـ 10 أعمدة، ويجب أن يكون ترتيب الأعمدة مطابق تمام للترتيب الذي تم استخدامه لتدريب الـ scaler.

بعد ذلك  تمرير المصفوفة الجديدة المكونة من 15 ميزة إلى scaler.transform()، ولن يحدث خطأ لأن الأبعاد متطابقة.

انضم إلى النقاش

يمكنك أن تنشر الآن وتسجل لاحقًا. إذا كان لديك حساب، فسجل الدخول الآن لتنشر باسم حسابك.

زائر
أجب على هذا السؤال...

×   لقد أضفت محتوى بخط أو تنسيق مختلف.   Restore formatting

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   جرى استعادة المحتوى السابق..   امسح المحرر

×   You cannot paste images directly. Upload or insert images from URL.

  • إعلانات

  • تابعنا على



×
×
  • أضف...