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

السؤال

نشر

في الكود التالي، قام بتشفير القيم التصنيفية وملء القيم المفقودة بشكل يدوي دون استخدام مكتبة scikit-learn:

def preprocess_data(df):
    """
    Performs transformations on df and returns transformed df.
    """
    df["saleYear"] = df.saledate.dt.year
    df["saleMonth"] = df.saledate.dt.month
    df["saleDay"] = df.saledate.dt.day
    df["saleDayOfWeek"] = df.saledate.dt.dayofweek
    df["saleDayOfYear"] = df.saledate.dt.dayofyear
    
    df.drop("saledate", axis=1, inplace=True)
    
    # Fill the numeric rows with median
    for label, content in df.items():
        if pd.api.types.is_numeric_dtype(content):
            if pd.isnull(content).sum():
                # Add a binary column which tells us if the data was missing or not
                df[label+"_is_missing"] = pd.isnull(content)
                # Fill missing numeric values with median
                df[label] = content.fillna(content.median())
    
        # Fill categorical missing data and turn categories into numbers
        if not pd.api.types.is_numeric_dtype(content):
            df[label+"_is_missing"] = pd.isnull(content)
            # Add +1 to category codes to avoid -1 for missing categories
            df[label] = pd.Categorical(content).codes+1
    
    return df
 

متى يجب عليّ استخدام هذه الطريقة اليدوية لتشفير القيم وملء القيم المفقودة؟ ومتى يكون من الأفضل استخدام مكتبة scikit-learn، مثل استخدام دالة SimpleImputer لملء القيم المفقودة و OneHotEncoder لتشفير القيم التصنيفية؟

أيضًا، متى يجب تقسيم البيانات قبل القيام بعمليات المعالجة المسبقة (مثل التشفير وملء القيم المفقودة)؟ ومتى يكون من المناسب معالجة البيانات كاملة كما في المثال أعلاه؟

مثال باستخدام scikit-learn:

from sklearn.model_selection import train_test_split
from sklearn.impute import SimpleImputer
from sklearn.preprocessing import OneHotEncoder
from sklearn.compose import ColumnTransformer
from sklearn.pipeline import Pipeline

# Split data
X_train, X_test, y_train, y_test = train_test_split(df.drop("target", axis=1), df["target"], test_size=0.2)

# Define preprocessing pipeline
numeric_features = ['age', 'income']
categorical_features = ['gender']

numeric_transformer = SimpleImputer(strategy='median')
categorical_transformer = Pipeline(steps=[
    ('imputer', SimpleImputer(strategy='most_frequent')),
    ('onehot', OneHotEncoder(handle_unknown='ignore'))
])

# Combine both transformers
preprocessor = ColumnTransformer(
    transformers=[
        ('num', numeric_transformer, numeric_features),
        ('cat', categorical_transformer, categorical_features)
    ])

# Apply the transformations on training and testing sets
X_train_transformed = preprocessor.fit_transform(X_train)
X_test_transformed = preprocessor.transform(X_test)
 

Recommended Posts

  • 0
نشر

الطريقة اليدوية مناسبة في حال لديك مجموعة بيانات صغيرة وسهلة الفهم، وتسمح لك بفهم كل خطوة بشكل دقيق جداً في كيفية معالجة البيانات المفقودة أو تشفير المتغيرات التصنيفية (مثلاً، استخدام متوسط بدلاً من الوسيط، أو طريقة تشفير معينة).

أيضًا في البداية عندما تتعلم كيفية معالجة البيانات، فكتابة الكود يدوياً يساعدك على فهم العملية بشكل أفضل.

ومع زيادة حجم البيانات وتعقيدها، تصبح مكتبات مثل scikit-learn ضرورية، حيث توفر وظائف فعالة وقوية لمعالجة البيانات بكفاءة عالية، وتسهل إعادة استخدام الكود، من خلال إنشاء خطوط أنابيب (Pipelines) قابلة لإعادة الاستخدام في مشاريع أخرى، فالوظائف في scikit-learn مُحسّنة للأداء، خاصةً مع البيانات الكبيرة.

بتاريخ 8 ساعة قال Ahmed Nmer:

أيضًا، متى يجب تقسيم البيانات قبل القيام بعمليات المعالجة المسبقة (مثل التشفير وملء القيم المفقودة)؟ ومتى يكون من المناسب معالجة البيانات كاملة كما في المثال أعلاه؟

وبخصوص تقسيم البيانات، فالأفضل تقسيمها إلى مجموعات تدريب واختبار قبل المعالجة المسبقة في معظم الحالات، وذلك لتجنب تسريب المعلومات من مجموعة الاختبار إلى مجموعة التدريب، ولو قمت بمعالجة البيانات كاملةً ثم قمت بالتقسيم، فقد تستخدم معلومات من مجموعة الاختبار لحساب الإحصائيات (مثل الوسيط أو القيمة الأكثر شيوعاً) المستخدمة في معالجة البيانات المفقودة، الأمر الذي يؤدي إلى تقدير غير دقيق لأداء النموذج على بيانات جديدة.

وباستطاعتك معالجة البيانات كاملًة في حال البيانات قليلة جداً بحيث لا يكون تقسيمها منطقياً او في المراحل الأولية من تحليل البيانات، لفهم خصائصها العامة. لكن النتائج التي تحصل عليها في تلك الحالة أحيانًا تكون غير دقيقة.

وبعض أنواع المعالجة المسبقة، مثل تحويل البيانات إلى قيم z-score، يمكن تطبيقها على كامل البيانات دون مشكلة تسريب المعلومات.

  • 0
نشر

المستخدم في مشروع Bluebook for Bulldozers على GitHub، لاحظت أنه تم استخدام الطريقة اليدوية لتشفير البيانات وملء القيم المفقودة على مجموعة بيانات كبيرة. هذا ما جعلني مشوشًا.

كيف يمكن تفسير استخدام الطريقة اليدوية هنا مع العلم أن scikit-learn يعتبر أكثر كفاءة خاصة مع البيانات الكبيرة؟

ولماذا لم يتم تقسيم البيانات إلى مجموعة تدريب واختبار قبل القيام بالمعالجة المسبقة في هذا الكود، كما ذكرت أن تقسيم البيانات قبل المعالجة أفضل لتجنب تسريب البيانات؟

رابط المثال على Kaggle: Bluebook for Bulldozers

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

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

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

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

  • إعلانات

  • تابعنا على



×
×
  • أضف...