ورقة scikit-learn (sklearn) المرجعية
آخر تحديث
تحميل البيانات وتقسيمها
اعزل مجموعة الاختبار قبل أي شيء آخر، ولا تنظر إليها إلا في النهاية تمامًا.
| المهمة | الكود |
|---|---|
| استيراد دالة التقسيم | from sklearn.model_selection import train_test_split |
| الخصائص والهدف من DataFrame | X = df.drop(columns="target")
y = df["target"] |
| مجموعة بيانات مدمجة بصيغة pandas | from 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 وانحراف معياري 1 | scaler = StandardScaler()
X_train_s = scaler.fit_transform(X_train[["age", "income"]])
X_test_s = scaler.transform(X_test[["age", "income"]]) |
| التحجيم إلى النطاق من 0 إلى 1 | MinMaxScaler().fit_transform(X_train[["age", "income"]]) |
| ترميز الفئات بطريقة one-hot | enc = 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 Bayes | from 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 و F1 | precision_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]) |
| رسم منحنى ROC | from 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) |
| ضبط خطوة داخل pipeline | GridSearchCV(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-means | from sklearn.cluster import KMeans
km = KMeans(n_clusters=3, random_state=0)
labels = km.fit_predict(X) |
| مراكز العناقيد و inertia | km.cluster_centers_, km.inertia_ |
| مدى انفصال العناقيد | from sklearn.metrics import silhouette_score
silhouette_score(X, labels) |
| عناقيد حسب الكثافة، والضوضاء -1 | from 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 المرجعية هذه مجانية؟
هل sklearn هي نفسها 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 يتولى ذلك عنك.هل أحتاج إلى تحجيم الخصائص؟
بأي نموذج في scikit-learn أبدأ؟
LinearRegression للتنبؤ بالأرقام، و LogisticRegression للتنبؤ بالفئات. ثم جرّب RandomForestClassifier أو HistGradientBoostingClassifier (أو نسختيهما للانحدار)، وقارن بينها بالتحقق المتقاطع، واضبط أفضلها باستخدام GridSearchCV .ما إصدار scikit-learn الذي تغطيه هذه الورقة المرجعية؟
squared=False في mean_squared_error و sparse=False في OneHotEncoder والوسيط penalty في LogisticRegression ، موجودة في جدول الصيغ القديمة بجانب ما تكتبه بدلًا منها.