Ali Ahmed55 نشر السبت في 18:44 أرسل تقرير نشر السبت في 18:44 السلام عليكم هو انا ازي اقدر اتعلمل مع خاصيه الmin_value و الmax_value في الIterativeImputer ؟ مع العلم ان فيه اعميد كثير جدا 60عمود مختلف جدا 2 اقتباس
0 Chihab Hedidi نشر السبت في 20:02 أرسل تقرير نشر السبت في 20:02 عند استخدام IterativeImputer، يمكنك تحديد القيم الدنيا والعليا التي يمكن أن يأخذها التقدير لكل عمود، و هذا مفيد خصوصا عندما يكون لديك نطاقات محددة للقيم المفقودة وتريد التأكد من أن التقدير لا يخرج عن هذه الحدود، و إذا كنت تريد تعيين حدود مختلفة لكل عمود، فيمكنك تمرير قائمة أو مصفوفة بنفس طول عدد الأعمدة، أما إذا كنت تريد تعيين نفس الحد لكل الأعمدة، فيمكنك تمرير قيمة ثابتة بهذا الشكل: import numpy as np import pandas as pd from sklearn.impute import IterativeImputer min_values = np.full(60, -0.5) # حد أدنى لكل الأعمدة max_values = np.full(60, 2.0) # حد أقصى لكل الأعمدة imputer = IterativeImputer(min_value=min_values, max_value=max_values, random_state=42) df_imputed = pd.DataFrame(imputer.fit_transform(df), columns=df.columns) # عرض بعض البيانات بعد التعويض print(df_imputed.head()) 1 اقتباس
0 Ali Ahmed55 نشر الأحد في 11:15 الكاتب أرسل تقرير نشر الأحد في 11:15 بتاريخ 15 ساعة قال Chihab Hedidi: تريد تعيين حدود مختلفة لكل عمود، فيمكنك تمرير قائمة أو مصفوفة بنفس طول عدد الأعمدة ايوه بس ازي اقدر اعمل كده 1 اقتباس
0 Mustafa Suleiman نشر الأحد في 13:08 أرسل تقرير نشر الأحد في 13:08 بتاريخ 26 دقائق مضت قال Ali Ahmed55: ايوه بس ازي اقدر اعمل كده عليك إنشاء قائمتين لكل عمود، فلو لديك 3 أعمدة رقمية: العمود 1 (مثل العمر): min=0, max=100 العمود 2 (مثل الراتب): min=1000, max=10000 العمود 3 (مثل درجة الحرارة): min=-20, max=50 فستكون القوائم: min_values = [0, 1000, -20] max_values = [100, 10000, 50] ثم تحديد القيم ديناميكيًا، ففي حال الأعمدة كثيرة مثل 60 عمودًا، فتستطيع حساب الحدود لكل عمود تلقائيًا باستخدام الرباعيات أو القيم الدنيا/القصوى: import pandas as pd min_values = df[numerical_cols].quantile(0.05).tolist() max_values = df[numerical_cols].quantile(0.95).tolist() لاحظ حساب الحد الأدنى كـ 5% لكل عمود ثم حساب الحد الأقصى كـ 95% لكل عمود. ثم تمرير القوائم إلى IterativeImputer from sklearn.experimental import enable_iterative_imputer from sklearn.impute import IterativeImputer imputer = IterativeImputer( min_value=min_values, max_value=max_values, estimator=RandomForestRegressor(), max_iter=50, random_state=42 ) df_imputed = imputer.fit_transform(df[numerical_cols]) ولو الأعمدة غير مرتبة بنفس ترتيب القوائم min_values و max_values، ستُطبَّق القيم الخاطئة، لذا علينا التأكد من أن ترتيب الأعمدة في df[numerical_cols] مطابق تمامًا لترتيب القيم في min_values و max_values. numerical_cols = df.select_dtypes(include=['number']).columns.tolist() min_values = df[numerical_cols].quantile(0.05).values max_values = df[numerical_cols].quantile(0.95).values وفي حال بعض الأعمدة لا تحتاج إلى حدود (مثل الأعمدة التي يمكن أن تأخذ أي قيمة)، عليك استخدم None أو np.inf: import numpy as np min_values = [0, None, -np.inf] max_values = [100, np.inf, 50] حيث العمود الثاني والثالث بلا حدود دنيا، والعمود الثاني بلا حدود قصوى. 1 اقتباس
0 Ali Ahmed55 نشر الأحد في 13:11 الكاتب أرسل تقرير نشر الأحد في 13:11 تمام بس انا عملت الكود ده بس رجع القيم كلها كا float مش عارف ليه ؟ min_values = data.min().values max_values = data.max().values بتاريخ 16 دقائق مضت قال Mustafa Suleiman: numerical_cols = df.select_dtypes(include=['number']).columns.tolist() min_values = df[numerical_cols].quantile(0.05).values max_values = df[numerical_cols].quantile(0.95).values ايوه بس بردو القيمه كلها عبار عن float بس في اعمده من نوع int ازي اخلي الint يكون زي ماهو والfloat يكون زي ما هو اقتباس
0 Mustafa Suleiman نشر الأحد في 13:39 أرسل تقرير نشر الأحد في 13:39 بتاريخ 17 دقائق مضت قال Ali Ahmed55: تمام بس انا عملت الكود ده بس رجع القيم كلها كا float مش عارف ليه ؟ min_values = data.min().values max_values = data.max().values ايوه بس بردو القيمه كلها عبار عن float بس في اعمده من نوع int ازي اخلي الint يكون زي ماهو والfloat يكون زي ما هو قبل التعويض، حدد الأعمدة التي من نوع int وfloat: import pandas as pd int_cols = df.select_dtypes(include=['int']).columns.tolist() float_cols = df.select_dtypes(include=['float']).columns.tolist() numerical_cols = int_cols + float_cols ثم استخدم IterativeImputer على الأعمدة الرقمية وسيحول جميعها إلى float مؤقتًا: from sklearn.experimental import enable_iterative_imputer from sklearn.impute import IterativeImputer imputer = IterativeImputer(random_state=42) df_imputed = pd.DataFrame( imputer.fit_transform(df[numerical_cols]), columns=numerical_cols ) ثم إعادة تحويل الأعمدة إلى أنواعها الأصلية، بتقريب القيم العشرية إلى أقرب عدد صحيح لو كان ذلك مناسب للبيانات. df_imputed[int_cols] = df_imputed[int_cols].round().astype(int) ولو لديك أعمدة غير رقمية (فئوية)، أعد دمجها، وهنا افترض أن df يحتوي أيضًا على أعمدة فئوية مثل 'category_col'. df_final = pd.concat([ df_imputed, df[['category_col']] ], axis=1) 1 اقتباس
0 Ali Ahmed55 نشر الأحد في 13:41 الكاتب أرسل تقرير نشر الأحد في 13:41 بتاريخ 2 دقائق مضت قال Mustafa Suleiman: قبل التعويض، حدد الأعمدة التي من نوع int وfloat: import pandas as pd int_cols = df.select_dtypes(include=['int']).columns.tolist() float_cols = df.select_dtypes(include=['float']).columns.tolist() numerical_cols = int_cols + float_cols ثم استخدم IterativeImputer على الأعمدة الرقمية وسيحول جميعها إلى float مؤقتًا: from sklearn.experimental import enable_iterative_imputer from sklearn.impute import IterativeImputer imputer = IterativeImputer(random_state=42) df_imputed = pd.DataFrame( imputer.fit_transform(df[numerical_cols]), columns=numerical_cols ) ثم إعادة تحويل الأعمدة إلى أنواعها الأصلية، بتقريب القيم العشرية إلى أقرب عدد صحيح لو كان ذلك مناسب للبيانات. df_imputed[int_cols] = df_imputed[int_cols].round().astype(int) ولو لديك أعمدة غير رقمية (فئوية)، أعد دمجها، وهنا افترض أن df يحتوي أيضًا على أعمدة فئوية مثل 'category_col'. df_final = pd.concat([ df_imputed, df[['category_col']] ], axis=1) الف شكرااا جدا جدا لحضرتك جزاك الله كل خير اقتباس
السؤال
Ali Ahmed55
السلام عليكم
هو انا ازي اقدر اتعلمل مع خاصيه الmin_value و الmax_value في الIterativeImputer ؟
مع العلم ان فيه اعميد كثير جدا 60عمود مختلف جدا
6 أجوبة على هذا السؤال
Recommended Posts
انضم إلى النقاش
يمكنك أن تنشر الآن وتسجل لاحقًا. إذا كان لديك حساب، فسجل الدخول الآن لتنشر باسم حسابك.