أبرز الميزات الجديدة في إصدار scikit-learn 1.1#

يسعدنا الإعلان عن إصدار scikit-learn 1.1! تم إصلاح العديد من الأخطاء وإجراء العديد من التحسينات، بالإضافة إلى بعض الميزات الرئيسية الجديدة. نستعرض أدناه بعض الميزات الرئيسية لهذا الإصدار. للاطلاع على قائمة شاملة بجميع التغييرات، يرجى الرجوع إلى release notes.

لتثبيت أحدث إصدار (باستخدام pip):

pip install --upgrade scikit-learn

أو باستخدام conda:

conda install -c conda-forge scikit-learn

خسارة الكمية في HistGradientBoostingRegressor#

HistGradientBoostingRegressor يمكنه نمذجة الكميات مع loss="quantile" ومعامل quantile الجديد.

from sklearn.ensemble import HistGradientBoostingRegressor
import numpy as np
import matplotlib.pyplot as plt

# دالة انحدار بسيطة لـ X * cos(X)
rng = np.random.RandomState(42)
X_1d = np.linspace(0, 10, num=2000)
X = X_1d.reshape(-1, 1)
y = X_1d * np.cos(X_1d) + rng.normal(scale=X_1d / 3)

quantiles = [0.95, 0.5, 0.05]
parameters = dict(loss="quantile", max_bins=32, max_iter=50)
hist_quantiles = {
    f"quantile={quantile:.2f}": HistGradientBoostingRegressor(
        **parameters, quantile=quantile
    ).fit(X, y)
    for quantile in quantiles
}

fig, ax = plt.subplots()
ax.plot(X_1d, y, "o", alpha=0.5, markersize=1)
for quantile, hist in hist_quantiles.items():
    ax.plot(X_1d, hist.predict(X), label=quantile)
_ = ax.legend(loc="lower left")
plot release highlights 1 1 0

لمثال على الاستخدام، راجع الميزات في أشجار التعزيز المتدرج للهيستوغرام

get_feature_names_out متاحة في جميع المحولات#

get_feature_names_out متاحة الآن في جميع المحولات. هذا يمكّن Pipeline من إنشاء أسماء الميزات الناتجة عن أنابيب أكثر تعقيدًا:

from sklearn.compose import ColumnTransformer
from sklearn.preprocessing import OneHotEncoder, StandardScaler
from sklearn.pipeline import make_pipeline
from sklearn.impute import SimpleImputer
from sklearn.feature_selection import SelectKBest
from sklearn.datasets import fetch_openml
from sklearn.linear_model import LogisticRegression

X, y = fetch_openml(
    "titanic", version=1, as_frame=True, return_X_y=True, parser="pandas"
)
numeric_features = ["age", "fare"]
numeric_transformer = make_pipeline(SimpleImputer(strategy="median"), StandardScaler())
categorical_features = ["embarked", "pclass"]

preprocessor = ColumnTransformer(
    [
        ("num", numeric_transformer, numeric_features),
        (
            "cat",
            OneHotEncoder(handle_unknown="ignore", sparse_output=False),
            categorical_features,
        ),
    ],
    verbose_feature_names_out=False,
)
log_reg = make_pipeline(preprocessor, SelectKBest(k=7), LogisticRegression())
log_reg.fit(X, y)
Pipeline(steps=[('columntransformer',
                 ColumnTransformer(transformers=[('num',
                                                  Pipeline(steps=[('simpleimputer',
                                                                   SimpleImputer(strategy='median')),
                                                                  ('standardscaler',
                                                                   StandardScaler())]),
                                                  ['age', 'fare']),
                                                 ('cat',
                                                  OneHotEncoder(handle_unknown='ignore',
                                                                sparse_output=False),
                                                  ['embarked', 'pclass'])],
                                   verbose_feature_names_out=False)),
                ('selectkbest', SelectKBest(k=7)),
                ('logisticregression', LogisticRegression())])
In a Jupyter environment, please rerun this cell to show the HTML representation or trust the notebook.
On GitHub, the HTML representation is unable to render, please try loading this page with nbviewer.org.


هنا نقوم بتقسيم الأنابيب لإدراج جميع الخطوات باستثناء الأخيرة. أسماء الميزات الناتجة عن هذا الجزء من الأنابيب هي الميزات التي يتم إدخالها في الانحدار اللوجستي. هذه الأسماء تقابل مباشرة المعاملات في الانحدار اللوجستي:

import pandas as pd

log_reg_input_features = log_reg[:-1].get_feature_names_out()
pd.Series(log_reg[-1].coef_.ravel(), index=log_reg_input_features).plot.bar()
plt.tight_layout()
plot release highlights 1 1 0

تجميع الفئات غير المتكررة في OneHotEncoder#

OneHotEncoder يدعم تجميع الفئات غير المتكررة في ناتج واحد لكل ميزة. المعاملات لتمكين تجميع الفئات غير المتكررة هي min_frequency و max_categories. راجع User Guide لمزيد من التفاصيل.

from sklearn.preprocessing import OneHotEncoder
import numpy as np

X = np.array(
    [["dog"] * 5 + ["cat"] * 20 + ["rabbit"] * 10 + ["snake"] * 3], dtype=object
).T
enc = OneHotEncoder(min_frequency=6, sparse_output=False).fit(X)
enc.infrequent_categories_
[array(['dog', 'snake'], dtype=object)]

نظرًا لأن الكلب والأفعى فئات غير متكررة، يتم تجميعها معًا عند التحويل:

encoded = enc.transform(np.array([["dog"], ["snake"], ["cat"], ["rabbit"]]))
pd.DataFrame(encoded, columns=enc.get_feature_names_out())
x0_cat x0_rabbit x0_infrequent_sklearn
0 0.0 0.0 1.0
1 0.0 0.0 1.0
2 1.0 0.0 0.0
3 0.0 1.0 0.0


تحسينات الأداء#

تم إعادة هيكلة الحسابات على المسافات الزوجية للمجموعات الكثيفة من النوع float64 للاستفادة بشكل أفضل من تعددية الخيوط غير الحاجبة. على سبيل المثال، يمكن أن يكون neighbors.NearestNeighbors.kneighbors و neighbors.NearestNeighbors.radius_neighbors أسرع بمقدار 20 و 5 مرة على التوالي من السابق. وباختصار، فإن الدوال والمقدرات التالية تستفيد الآن من تحسينات الأداء:

لمعرفة المزيد عن التفاصيل التقنية لهذا العمل، يمكنك قراءة هذه السلسلة من المقالات.

علاوة على ذلك، تم إعادة هيكلة حسابات دالات الخسارة باستخدام Cython، مما أدى إلى تحسينات في الأداء للمقدرات التالية:

MiniBatchNMF: نسخة عبر الإنترنت من NMF#

الفئة الجديدة MiniBatchNMF تنفذ نسخة أسرع ولكنها أقل دقة من التحليل المصفوفي غير السلبي (NMF). MiniBatchNMF تقسم البيانات إلى مجموعات صغيرة وتُحسّن نموذج NMF بطريقة عبر الإنترنت عن طريق الدوران عبر المجموعات الصغيرة، مما يجعلها أكثر ملاءمة للمجموعات الكبيرة. على وجه الخصوص، تنفذ partial_fit، والتي يمكن استخدامها للتعلم عبر الإنترنت عندما لا تكون البيانات متاحة بسهولة من البداية، أو عندما لا تتناسب البيانات مع الذاكرة.

import numpy as np
from sklearn.decomposition import MiniBatchNMF

rng = np.random.RandomState(0)
n_samples, n_features, n_components = 10, 10, 5
true_W = rng.uniform(size=(n_samples, n_components))
true_H = rng.uniform(size=(n_components, n_features))
X = true_W @ true_H

nmf = MiniBatchNMF(n_components=n_components, random_state=0)

for _ in range(10):
    nmf.partial_fit(X)

W = nmf.transform(X)
H = nmf.components_
X_reconstructed = W @ H

print(
    f"relative reconstruction error: ",
    f"{np.sum((X - X_reconstructed) ** 2) / np.sum(X**2):.5f}",
)
relative reconstruction error:  0.00364

BisectingKMeans: التقسيم والتجميع#

الفئة الجديدة BisectingKMeans هي نسخة من KMeans، تستخدم التجميع الهرمي التقسيمي. بدلاً من إنشاء جميع المراكز في وقت واحد، يتم اختيار المراكز تدريجياً بناءً على التجميع السابق: يتم تقسيم التجميع إلى تجميعين جديدين بشكل متكرر حتى يتم الوصول إلى عدد التجميعات المستهدف، مما يعطي هيكلًا هرميًا للتجميع.

from sklearn.datasets import make_blobs
from sklearn.cluster import KMeans, BisectingKMeans
import matplotlib.pyplot as plt

X, _ = make_blobs(n_samples=1000, centers=2, random_state=0)

km = KMeans(n_clusters=5, random_state=0, n_init="auto").fit(X)
bisect_km = BisectingKMeans(n_clusters=5, random_state=0).fit(X)

fig, ax = plt.subplots(1, 2, figsize=(10, 5))
ax[0].scatter(X[:, 0], X[:, 1], s=10, c=km.labels_)
ax[0].scatter(km.cluster_centers_[:, 0], km.cluster_centers_[:, 1], s=20, c="r")
ax[0].set_title("KMeans")

ax[1].scatter(X[:, 0], X[:, 1], s=10, c=bisect_km.labels_)
ax[1].scatter(
    bisect_km.cluster_centers_[:, 0], bisect_km.cluster_centers_[:, 1], s=20, c="r"
)
_ = ax[1].set_title("BisectingKMeans")
KMeans, BisectingKMeans

Total running time of the script: (0 minutes 1.370 seconds)

Related examples

أبرز الميزات الجديدة في إصدار scikit-learn 0.23

أبرز الميزات الجديدة في إصدار scikit-learn 0.23

أبرز ميزات الإصدار 1.0 من scikit-learn

أبرز ميزات الإصدار 1.0 من scikit-learn

أبرز ميزات الإصدار 1.3 من scikit-learn

أبرز ميزات الإصدار 1.3 من scikit-learn

sphx_glr_auto_examples_applications_plot_topics_extraction_with_nmf_lda.py

استخراج الموضوعات باستخدام تحليل المصفوفات غير السالبة وتخصيص ديريتشليت الكامن

Gallery generated by Sphinx-Gallery