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

السؤال

Recommended Posts

  • 0
نشر

عند استخدام 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())

 

  • 0
نشر
بتاريخ 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]   

حيث العمود الثاني والثالث بلا حدود دنيا، والعمود الثاني بلا حدود قصوى.

  • 0
نشر

تمام بس انا عملت الكود ده بس رجع القيم كلها كا 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
نشر
بتاريخ 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)
  • 0
نشر
بتاريخ 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)

الف شكرااا جدا جدا لحضرتك

جزاك الله كل خير

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

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

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

×   لقد أضفت محتوى بخط أو تنسيق مختلف.   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.

  • إعلانات

  • تابعنا على



×
×
  • أضف...