Menu
CoddyTech
flag Ar iconالعربيةdown icon

ورقة scikit-learn (sklearn) المرجعية

آخر تحديث

تحميل البيانات وتقسيمها

اعزل مجموعة الاختبار قبل أي شيء آخر، ولا تنظر إليها إلا في النهاية تمامًا.

المهمةالكود
استيراد دالة التقسيمfrom sklearn.model_selection import train_test_split
الخصائص والهدف من DataFrameX = df.drop(columns="target") y = df["target"]
مجموعة بيانات مدمجة بصيغة pandasfrom sklearn.datasets import load_iris X, y = load_iris(return_X_y=True, as_frame=True)
بيانات اصطناعية للتجريبfrom sklearn.datasets import make_classification X, y = make_classification(n_samples=500, n_features=8, random_state=0)
تقسيم 80/20 للتدريب والاختبارX_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42)
الحفاظ على نسب الفئات في الجزأينtrain_test_split(X, y, test_size=0.2, stratify=y, random_state=42)
تدريب وتحقق واختبار (60/20/20)X_tmp, X_test, y_tmp, y_test = train_test_split(X, y, test_size=0.2, random_state=0) X_train, X_val, y_train, y_val = train_test_split(X_tmp, y_tmp, test_size=0.25, random_state=0)

المعالجة المسبقة للخصائص

درّب المحوِّل على بيانات التدريب فقط، ثم حوّل المجموعتين. التدريب على بيانات الاختبار يسرّب المعلومات.

المهمةالكود
الاستيرادfrom sklearn.preprocessing import StandardScaler, MinMaxScaler, OneHotEncoder, OrdinalEncoder
التحجيم إلى متوسط 0 وانحراف معياري 1scaler = StandardScaler() X_train_s = scaler.fit_transform(X_train[["age", "income"]]) X_test_s = scaler.transform(X_test[["age", "income"]])
التحجيم إلى النطاق من 0 إلى 1MinMaxScaler().fit_transform(X_train[["age", "income"]])
ترميز الفئات بطريقة one-hotenc = OneHotEncoder(handle_unknown="ignore", sparse_output=False) enc.fit_transform(X_train[["city"]])
ترميز الفئات المرتبة كأرقامOrdinalEncoder(categories=[["low", "mid", "high"]]).fit_transform([["mid"], ["high"]])
ملء القيم المفقودةfrom sklearn.impute import SimpleImputer SimpleImputer(strategy="median").fit_transform(X_train[["age", "income"]])
خصائص متعددة الحدود وتفاعليةfrom sklearn.preprocessing import PolynomialFeatures PolynomialFeatures(degree=2, include_bias=False).fit_transform(X_train[["age", "income"]])
إرجاع DataFrame بدلًا من المصفوفاتscaler.set_output(transform="pandas")
تسميات نصية إلى أعداد صحيحةfrom sklearn.preprocessing import LabelEncoder LabelEncoder().fit_transform(["cat", "dog", "cat"])

اختيار نموذج

ابدأ بنموذج بسيط، واجعل نتيجته هي الرقم الذي يجب التفوق عليه.

المشكلةابدأ بـثم جرّب
التنبؤ برقم (انحدار)LinearRegression(), Ridge(alpha=1.0)RandomForestRegressor(), HistGradientBoostingRegressor()
التنبؤ بفئة (تصنيف)LogisticRegression(max_iter=1000)RandomForestClassifier(), HistGradientBoostingClassifier()
بيانات قليلة، والنقاط المتشابهة تتشارك التسميةKNeighborsClassifier(n_neighbors=5)SVC(kernel="rbf")
قواعد يمكنك قراءتهاDecisionTreeClassifier(max_depth=3)RandomForestClassifier()
تجميع الصفوف بدون تسمياتKMeans(n_clusters=3)DBSCAN(eps=0.5)
خصائص أقل للرسم أو السرعةPCA(n_components=2)TSNE(n_components=2)
إيجاد الصفوف الشاذةIsolationForest(random_state=0)LocalOutlierFactor()

تدريب نموذج

كل مقدّر (estimator) يتبع النمط نفسه: أنشئه بإعداداته، ثم استدعِ fit .

المهمةالكود
النمط لكل نموذجmodel = LogisticRegression(max_iter=1000) model.fit(X_train, y_train)
الانحدار الخطيfrom sklearn.linear_model import LinearRegression LinearRegression()
انحدار خطي مع تنظيم (regularization)from sklearn.linear_model import Ridge, Lasso Ridge(alpha=1.0), Lasso(alpha=0.1)
الانحدار اللوجستي (تصنيف)from sklearn.linear_model import LogisticRegression LogisticRegression(C=1.0, max_iter=1000)
أقرب k جيرانfrom sklearn.neighbors import KNeighborsClassifier KNeighborsClassifier(n_neighbors=5)
شجرة القرارfrom sklearn.tree import DecisionTreeClassifier DecisionTreeClassifier(max_depth=3, random_state=0)
الغابة العشوائيةfrom sklearn.ensemble import RandomForestClassifier RandomForestClassifier(n_estimators=200, random_state=0)
Gradient boosting سريع على البيانات الكبيرةfrom sklearn.ensemble import HistGradientBoostingClassifier HistGradientBoostingClassifier(random_state=0)
آلة المتجهات الداعمة (SVM)from sklearn.svm import SVC SVC(kernel="rbf", C=1.0)
Naive Bayesfrom sklearn.naive_bayes import GaussianNB GaussianNB()
نموذج أساسي يخمّن الفئة الأكثر دائمًاfrom sklearn.dummy import DummyClassifier DummyClassifier(strategy="most_frequent")

التنبؤ والفحص

المهمةالكود
التنبؤ بالفئات أو القيمy_pred = model.predict(X_test)
احتمال الفئة الموجبةmodel.predict_proba(X_test)[:, 1]
نتيجة سريعة: الدقة أو R²model.score(X_test, y_test)
معاملات النموذج الخطيmodel.coef_, model.intercept_
أهمية الخصائص في نموذج شجريpd.Series(forest.feature_importances_, index=X_train.columns).sort_values()
الأهمية بخلط كل خاصيةfrom sklearn.inspection import permutation_importance permutation_importance(model, X_test, y_test, random_state=0).importances_mean
الفئات التي يعرفها النموذجmodel.classes_
قراءة الإعدادات وتغييرهاmodel.get_params(), model.set_params(C=0.5)
رسم شجرة قرارfrom sklearn.tree import plot_tree plot_tree(tree, filled=True, feature_names=list(X_train.columns))

مقاييس التصنيف

الدقة وحدها تخفي الأخطاء في الفئة النادرة. افحص أيضًا precision و recall ومصفوفة الالتباس.

المهمةالكود
الاستيرادfrom sklearn.metrics import accuracy_score, precision_score, recall_score, f1_score
الدقة (Accuracy)accuracy_score(y_test, y_pred)
Precision و recall و F1precision_score(y_test, y_pred), recall_score(y_test, y_pred), f1_score(y_test, y_pred)
F1 لعدة فئاتf1_score(y_test, y_pred, average="macro")
كل المقاييس لكل فئةfrom sklearn.metrics import classification_report print(classification_report(y_test, y_pred))
مصفوفة الالتباسfrom sklearn.metrics import confusion_matrix confusion_matrix(y_test, y_pred)
رسم مصفوفة الالتباسfrom sklearn.metrics import ConfusionMatrixDisplay ConfusionMatrixDisplay.from_estimator(model, X_test, y_test)
ROC AUC من الاحتمالاتfrom sklearn.metrics import roc_auc_score roc_auc_score(y_test, model.predict_proba(X_test)[:, 1])
رسم منحنى ROCfrom sklearn.metrics import RocCurveDisplay RocCurveDisplay.from_estimator(model, X_test, y_test)
الدقة للفئات غير المتوازنةfrom sklearn.metrics import balanced_accuracy_score balanced_accuracy_score(y_test, y_pred)
عتبة قرار خاصة بكy_pred = (model.predict_proba(X_test)[:, 1] >= 0.3).astype(int)

مقاييس الانحدار

مقاييس الخطأ بوحدات الهدف (الأقل أفضل). و R² هو نسبة التباين المفسَّر (1 يعني تطابقًا تامًا).

المهمةالكود
الاستيرادfrom sklearn.metrics import mean_absolute_error, mean_squared_error, root_mean_squared_error, r2_score
متوسط الخطأ المطلق (MAE)mean_absolute_error(y_test, y_pred)
متوسط مربع الخطأ وجذرهmean_squared_error(y_test, y_pred), root_mean_squared_error(y_test, y_pred)
قيمة R²r2_score(y_test, y_pred)
متوسط نسبة الخطأ المطلق (MAPE)from sklearn.metrics import mean_absolute_percentage_error mean_absolute_percentage_error(y_test, y_pred)
رسم القيم المتوقعة مقابل الفعليةfrom sklearn.metrics import PredictionErrorDisplay PredictionErrorDisplay.from_predictions(y_test, y_pred, kind="actual_vs_predicted")

خطوط المعالجة (Pipelines)

يربط الـ pipeline المعالجة المسبقة والنموذج في مقدّر واحد، فيدرّب التحقق المتقاطع والبحث الشبكي كل خطوة على أجزاء التدريب فقط.

المهمةالكود
الاستيرادfrom sklearn.pipeline import make_pipeline, Pipeline
التحجيم ثم تدريب نموذجpipe = make_pipeline(StandardScaler(), LogisticRegression(max_iter=1000)) pipe.fit(X_train, y_train)
خطوات بأسماء من اختياركpipe = Pipeline([("scale", StandardScaler()), ("model", LogisticRegression(max_iter=1000))])
الوصول إلى خطوة داخليةpipe.named_steps["model"], pipe[-1]
خطوات مختلفة لأعمدة مختلفةfrom sklearn.compose import ColumnTransformer pre = ColumnTransformer([ ("num", StandardScaler(), ["age", "income"]), ("cat", OneHotEncoder(handle_unknown="ignore"), ["city"]), ])
المعالجة المسبقة والنموذج في كائن واحدmodel = make_pipeline(pre, RandomForestClassifier(random_state=0)) model.fit(X_train, y_train) model.score(X_test, y_test)
اختيار الأعمدة حسب النوعfrom sklearn.compose import make_column_selector make_column_selector(dtype_include="number")(X_train)
ملء القيم ثم التحجيمmake_pipeline(SimpleImputer(strategy="median"), StandardScaler())
أسماء الخصائص الناتجةpre.get_feature_names_out()

التحقق المتقاطع

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

المهمةالكود
الاستيرادfrom sklearn.model_selection import cross_val_score, cross_validate, KFold, StratifiedKFold
التقييم على 5 أجزاء (folds)scores = cross_val_score(pipe, X, y, cv=5) scores.mean(), scores.std()
اختيار المقياسcross_val_score(pipe, X, y, cv=5, scoring="f1_macro")
أجزاء مخلوطةcv = KFold(n_splits=5, shuffle=True, random_state=0)
توازن الفئات نفسه في كل جزءcv = StratifiedKFold(n_splits=5, shuffle=True, random_state=0)
عدة مقاييس ونتائج التدريبcross_validate(pipe, X, y, cv=cv, scoring=["accuracy", "f1"], return_train_score=True)
تنبؤ لكل صف من خارج جزئهfrom sklearn.model_selection import cross_val_predict cross_val_predict(pipe, X, y, cv=5)
أجزاء حسب المجموعة، أجزاء بالترتيب الزمنيfrom sklearn.model_selection import GroupKFold, TimeSeriesSplit GroupKFold(n_splits=5), TimeSeriesSplit(n_splits=5)
كل أسماء المقاييس الصالحةfrom sklearn.metrics import get_scorer_names get_scorer_names()

البحث الشبكي وضبط المعاملات

يدرّب البحث النموذج لكل إعداد مع التحقق المتقاطع، ويحتفظ بالأفضل ثم يعيد تدريبه على كل بيانات التدريب.

المهمةالكود
الاستيرادfrom sklearn.model_selection import GridSearchCV, RandomizedSearchCV
تجربة كل التوليفاتgrid = GridSearchCV(RandomForestClassifier(random_state=0), {"n_estimators": [50, 100], "max_depth": [None, 5]}, cv=5) grid.fit(X_train, y_train)
أفضل الإعدادات ونتيجتهاgrid.best_params_, grid.best_score_
استخدام أفضل نموذجgrid.best_estimator_.predict(X_test), grid.score(X_test, y_test)
ضبط خطوة داخل pipelineGridSearchCV(pipe, {"logisticregression__C": [0.1, 1, 10]}, cv=5).fit(X_train, y_train)
إعدادات عشوائية من توزيعاتfrom scipy.stats import randint search = RandomizedSearchCV(RandomForestClassifier(random_state=0), {"n_estimators": randint(50, 150)}, n_iter=5, cv=3, random_state=0) search.fit(X_train, y_train)
استخدام كل أنوية المعالجGridSearchCV(pipe, {"logisticregression__C": [0.1, 1]}, cv=5, n_jobs=-1)
كل النتائج في جدولpd.DataFrame(grid.cv_results_).sort_values("rank_test_score")

التجميع العنقودي وتقليل الأبعاد

النماذج غير الموجَّهة تتعلم من X وحدها. حجّم الخصائص أولًا، لأن كليهما يعتمد على المسافات.

المهمةالكود
عناقيد k-meansfrom sklearn.cluster import KMeans km = KMeans(n_clusters=3, random_state=0) labels = km.fit_predict(X)
مراكز العناقيد و inertiakm.cluster_centers_, km.inertia_
مدى انفصال العناقيدfrom sklearn.metrics import silhouette_score silhouette_score(X, labels)
عناقيد حسب الكثافة، والضوضاء -1from sklearn.cluster import DBSCAN DBSCAN(eps=0.5, min_samples=5).fit_predict(X)
الإسقاط على مكوّنينfrom sklearn.decomposition import PCA pca = PCA(n_components=2) X_2d = pca.fit_transform(X)
التباين الذي يفسّره كل مكوّنpca.explained_variance_ratio_
الاحتفاظ بـ 95% من التباينPCA(n_components=0.95).fit_transform(X)

scikit-learn 1.9: الصيغ القديمة وما تكتبه الآن

الكود المنسوخ من الدروس القديمة قد يفشل أو يُظهر تحذيرات في scikit-learn 1.9. اكتب الصيغ الموجودة في عمود scikit-learn 1.9 بدلًا منه.

المهمةscikit-learn 1.9الصيغة القديمة
جذر متوسط مربع الخطأ (RMSE)root_mean_squared_error(y_test, y_pred)mean_squared_error(y_test, y_pred, squared=False)
مخرجات one-hot كثيفةOneHotEncoder(sparse_output=False)OneHotEncoder(sparse=False)
انحدار لوجستي L1 (lasso)LogisticRegression(l1_ratio=1, solver="liblinear")LogisticRegression(penalty="l1", solver="liblinear")
انحدار لوجستي بدون تنظيمLogisticRegression(C=np.inf)LogisticRegression(penalty=None)

الحفظ والتحميل وإعادة الإنتاج

المهمةالكود
حفظ نموذج أو pipeline مدرَّبimport joblib joblib.dump(model, "model.joblib")
تحميله من جديدmodel = joblib.load("model.joblib")
النتيجة نفسها في كل تشغيلrandom_state=0
الإصدار المثبّتimport sklearn sklearn.__version__

كود scikit-learn الذي يقوم عليه سير عمل حقيقي لتعلم الآلة، بالترتيب الذي تكتبه به: تحميل البيانات وتقسيمها، معالجتها مسبقًا، اختيار نموذج، التدريب والتنبؤ، قياس النتيجة، ربط الخطوات في pipeline، التحقق المتقاطع، والضبط بالبحث الشبكي. كل صف مقتطف قصير يمكنك لصقه مباشرة، مع سطر واحد يشرح ما يفعله.

كل نماذج scikit-learn تتشارك واجهة واحدة: تتعلم fit من بيانات التدريب، وتطبّق predict و transform ما تعلّمه النموذج. كل ما هنا مكتوب لإصدار scikit-learn 1.9، وهو الإصدار الذي يشغّله Coddy، حيث يرمز X إلى الخصائص و y إلى الهدف. تعمل scikit-learn على مصفوفات NumPy وجداول DataFrame في pandas، وتغطي ورقة Matplotlib المرجعية الرسوم البيانية. هل أنت جديد على Python نفسها؟ ابدأ بـ ورقة Python المرجعية.

الأسئلة الشائعة حول ورقة scikit-learn المرجعية

هل ورقة scikit-learn المرجعية هذه مجانية؟
نعم. ورقة scikit-learn المرجعية هذه مجانية تمامًا ولا تحتاج إلى تسجيل. أضفها إلى المفضلة أو اطبعها بصيغة PDF من متصفحك، وارجع إليها متى احتجت إلى الاستدعاء الدقيق لـ pipeline أو مقياس أو بحث شبكي.
هل sklearn هي نفسها scikit-learn؟
نعم. scikit-learn هو اسم المكتبة واسم الحزمة التي تثبّتها ( pip install scikit-learn )، و sklearn هو الاسم الذي تستورده في الكود ( from sklearn.linear_model import LinearRegression ). ورقة sklearn المرجعية وورقة scikit-learn المرجعية تغطيان الشيء نفسه.
ما الفرق بين fit و transform و fit_transform؟
تتعلم fit من البيانات: أداة التحجيم تتعلم متوسط كل عمود، والنموذج يتعلم أوزانه. وتطبّق transform ما تم تعلّمه، بينما تفعل fit_transform الأمرين في استدعاء واحد. استخدم fit_transform على مجموعة التدريب و transform فقط على مجموعة الاختبار، وإلا تسربت بيانات الاختبار إلى التدريب. والـ pipeline يتولى ذلك عنك.
هل أحتاج إلى تحجيم الخصائص؟
نعم، للنماذج التي تعتمد على المسافات أو التدرجات: أقرب k جيران و SVM و k-means و PCA والانحدار الخطي واللوجستي مع التنظيم، كلها تعمل أفضل على بيانات محجّمة. أما النماذج الشجرية مثل أشجار القرار والغابات العشوائية و gradient boosting فلا تحتاج إلى تحجيم. ضع أداة التحجيم داخل pipeline حتى تُدرَّب على بيانات التدريب فقط.
بأي نموذج في scikit-learn أبدأ؟
ابدأ بنموذج بسيط وسريع كخط أساس: LinearRegression للتنبؤ بالأرقام، و LogisticRegression للتنبؤ بالفئات. ثم جرّب RandomForestClassifier أو HistGradientBoostingClassifier (أو نسختيهما للانحدار)، وقارن بينها بالتحقق المتقاطع، واضبط أفضلها باستخدام GridSearchCV .
ما إصدار scikit-learn الذي تغطيه هذه الورقة المرجعية؟
scikit-learn 1.9، وهو الإصدار الذي يشغّله Coddy، مع NumPy 2 و pandas 3. الاستدعاءات القديمة التي أصبحت تفشل أو تُظهر تحذيرات، مثل squared=False في mean_squared_error و sparse=False في OneHotEncoder والوسيط penalty في LogisticRegression ، موجودة في جدول الصيغ القديمة بجانب ما تكتبه بدلًا منها.
هل يمكنني تشغيل كود scikit-learn عبر الإنترنت؟
نعم. ساحة تجربة Matplotlib المجانية تشغّل Python مع scikit-learn و pandas و NumPy و Matplotlib في متصفحك، فيمكنك لصق أي مقتطف من هذه الورقة المرجعية وتشغيله دون تثبيت أي شيء. ودورة تعلم الآلة في Coddy تعلّمك سير العمل الموجود في هذه الصفحة كاملًا خطوة بخطوة، من تقسيم البيانات إلى ضبط النموذج.
رسم توضيحي للغات البرمجة في Coddy

تعلّم Scikit-learn مع Coddy

ابدأ الآن