Menu
CoddyTech

Scikit-learn (sklearn) Cheat Sheet: ściąga ze scikit-learn

Ostatnia aktualizacja

Wczytanie i podział danych

Zanim zrobisz cokolwiek innego, odłóż zbiór testowy i zajrzyj do niego dopiero na samym końcu.

ZadanieKod
Import funkcji podziałufrom sklearn.model_selection import train_test_split
Cechy i cel z DataFrame'uX = df.drop(columns="target") y = df["target"]
Wbudowany zbiór jako pandasfrom sklearn.datasets import load_iris X, y = load_iris(return_X_y=True, as_frame=True)
Syntetyczne dane do eksperymentówfrom sklearn.datasets import make_classification X, y = make_classification(n_samples=500, n_features=8, random_state=0)
Podział 80/20 na trening i testX_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42)
Te same proporcje klas w obu częściachtrain_test_split(X, y, test_size=0.2, stratify=y, random_state=42)
Trening, walidacja i test (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)

Preprocessing cech

Dopasuj transformator tylko na danych treningowych, potem przekształć oba zbiory. Dopasowanie na danych testowych to wyciek informacji.

ZadanieKod
Importyfrom sklearn.preprocessing import StandardScaler, MinMaxScaler, OneHotEncoder, OrdinalEncoder
Skalowanie do średniej 0 i odchylenia 1scaler = StandardScaler() X_train_s = scaler.fit_transform(X_train[["age", "income"]]) X_test_s = scaler.transform(X_test[["age", "income"]])
Skalowanie do zakresu od 0 do 1MinMaxScaler().fit_transform(X_train[["age", "income"]])
Kodowanie one-hot kategoriienc = OneHotEncoder(handle_unknown="ignore", sparse_output=False) enc.fit_transform(X_train[["city"]])
Kategorie uporządkowane jako liczbyOrdinalEncoder(categories=[["low", "mid", "high"]]).fit_transform([["mid"], ["high"]])
Uzupełnianie brakówfrom sklearn.impute import SimpleImputer SimpleImputer(strategy="median").fit_transform(X_train[["age", "income"]])
Cechy wielomianowe i interakcjefrom sklearn.preprocessing import PolynomialFeatures PolynomialFeatures(degree=2, include_bias=False).fit_transform(X_train[["age", "income"]])
DataFrame'y zamiast tablicscaler.set_output(transform="pandas")
Etykiety tekstowe na liczby całkowitefrom sklearn.preprocessing import LabelEncoder LabelEncoder().fit_transform(["cat", "dog", "cat"])

Wybór modelu

Zacznij od czegoś prostego i traktuj wynik prostego modelu jako poprzeczkę do pobicia.

ProblemZacznij odPotem spróbuj
Przewidywanie liczby (regresja)LinearRegression(), Ridge(alpha=1.0)RandomForestRegressor(), HistGradientBoostingRegressor()
Przewidywanie klasy (klasyfikacja)LogisticRegression(max_iter=1000)RandomForestClassifier(), HistGradientBoostingClassifier()
Mało danych, podobne punkty mają tę samą etykietęKNeighborsClassifier(n_neighbors=5)SVC(kernel="rbf")
Reguły, które da się przeczytaćDecisionTreeClassifier(max_depth=3)RandomForestClassifier()
Grupowanie wierszy bez etykietKMeans(n_clusters=3)DBSCAN(eps=0.5)
Mniej cech do wykresów lub dla szybkościPCA(n_components=2)TSNE(n_components=2)
Wykrywanie nietypowych wierszyIsolationForest(random_state=0)LocalOutlierFactor()

Trenowanie modelu

Każdy estymator działa tak samo: tworzysz go z ustawieniami, a potem wywołujesz fit.

ZadanieKod
Schemat dla każdego modelumodel = LogisticRegression(max_iter=1000) model.fit(X_train, y_train)
Regresja liniowafrom sklearn.linear_model import LinearRegression LinearRegression()
Regresja liniowa z regularyzacjąfrom sklearn.linear_model import Ridge, Lasso Ridge(alpha=1.0), Lasso(alpha=0.1)
Regresja logistyczna (klasyfikacja)from sklearn.linear_model import LogisticRegression LogisticRegression(C=1.0, max_iter=1000)
k najbliższych sąsiadówfrom sklearn.neighbors import KNeighborsClassifier KNeighborsClassifier(n_neighbors=5)
Drzewo decyzyjnefrom sklearn.tree import DecisionTreeClassifier DecisionTreeClassifier(max_depth=3, random_state=0)
Las losowyfrom sklearn.ensemble import RandomForestClassifier RandomForestClassifier(n_estimators=200, random_state=0)
Gradient boosting, szybki na dużych danychfrom sklearn.ensemble import HistGradientBoostingClassifier HistGradientBoostingClassifier(random_state=0)
Maszyna wektorów nośnych (SVM)from sklearn.svm import SVC SVC(kernel="rbf", C=1.0)
Naiwny klasyfikator Bayesafrom sklearn.naive_bayes import GaussianNB GaussianNB()
Baseline, który zawsze zgaduje klasę większościowąfrom sklearn.dummy import DummyClassifier DummyClassifier(strategy="most_frequent")

Predykcja i analiza modelu

ZadanieKod
Przewidywanie klas lub wartościy_pred = model.predict(X_test)
Prawdopodobieństwo klasy pozytywnejmodel.predict_proba(X_test)[:, 1]
Szybki wynik: accuracy lub R²model.score(X_test, y_test)
Współczynniki modelu liniowegomodel.coef_, model.intercept_
Ważność cech w modelu drzewiastympd.Series(forest.feature_importances_, index=X_train.columns).sort_values()
Ważność przez permutację cechfrom sklearn.inspection import permutation_importance permutation_importance(model, X_test, y_test, random_state=0).importances_mean
Etykiety klas znane modelowimodel.classes_
Odczyt i zmiana ustawieńmodel.get_params(), model.set_params(C=0.5)
Rysowanie drzewa decyzyjnegofrom sklearn.tree import plot_tree plot_tree(tree, filled=True, feature_names=list(X_train.columns))

Metryki klasyfikacji

Sama accuracy ukrywa błędy na rzadkiej klasie. Sprawdź też precision, recall i macierz pomyłek.

ZadanieKod
Importyfrom sklearn.metrics import accuracy_score, precision_score, recall_score, f1_score
Accuracyaccuracy_score(y_test, y_pred)
Precision, recall i F1precision_score(y_test, y_pred), recall_score(y_test, y_pred), f1_score(y_test, y_pred)
F1 dla wielu klasf1_score(y_test, y_pred, average="macro")
Wszystkie metryki dla każdej klasyfrom sklearn.metrics import classification_report print(classification_report(y_test, y_pred))
Macierz pomyłekfrom sklearn.metrics import confusion_matrix confusion_matrix(y_test, y_pred)
Wykres macierzy pomyłekfrom sklearn.metrics import ConfusionMatrixDisplay ConfusionMatrixDisplay.from_estimator(model, X_test, y_test)
ROC AUC z prawdopodobieństwfrom sklearn.metrics import roc_auc_score roc_auc_score(y_test, model.predict_proba(X_test)[:, 1])
Wykres krzywej ROCfrom sklearn.metrics import RocCurveDisplay RocCurveDisplay.from_estimator(model, X_test, y_test)
Accuracy dla niezbalansowanych klasfrom sklearn.metrics import balanced_accuracy_score balanced_accuracy_score(y_test, y_pred)
Własny próg decyzyjnyy_pred = (model.predict_proba(X_test)[:, 1] >= 0.3).astype(int)

Metryki regresji

Metryki błędu są w jednostkach zmiennej docelowej (im niżej, tym lepiej). R² to część wyjaśnionej wariancji (1 to ideał).

ZadanieKod
Importyfrom sklearn.metrics import mean_absolute_error, mean_squared_error, root_mean_squared_error, r2_score
Średni błąd bezwzględny (MAE)mean_absolute_error(y_test, y_pred)
Błąd średniokwadratowy i jego pierwiastekmean_squared_error(y_test, y_pred), root_mean_squared_error(y_test, y_pred)
Wynik R²r2_score(y_test, y_pred)
Średni bezwzględny błąd procentowy (MAPE)from sklearn.metrics import mean_absolute_percentage_error mean_absolute_percentage_error(y_test, y_pred)
Wykres przewidywań względem rzeczywistościfrom sklearn.metrics import PredictionErrorDisplay PredictionErrorDisplay.from_predictions(y_test, y_pred, kind="actual_vs_predicted")

Pipeline'y

Pipeline łączy preprocessing i model w jeden estymator, więc walidacja krzyżowa i grid search dopasowują każdy krok wyłącznie na foldach treningowych.

ZadanieKod
Importyfrom sklearn.pipeline import make_pipeline, Pipeline
Skalowanie, potem modelpipe = make_pipeline(StandardScaler(), LogisticRegression(max_iter=1000)) pipe.fit(X_train, y_train)
Kroki z własnymi nazwamipipe = Pipeline([("scale", StandardScaler()), ("model", LogisticRegression(max_iter=1000))])
Dostęp do kroku w środkupipe.named_steps["model"], pipe[-1]
Różne kroki dla różnych kolumnfrom sklearn.compose import ColumnTransformer pre = ColumnTransformer([ ("num", StandardScaler(), ["age", "income"]), ("cat", OneHotEncoder(handle_unknown="ignore"), ["city"]), ])
Preprocessing i model w jednym obiekciemodel = make_pipeline(pre, RandomForestClassifier(random_state=0)) model.fit(X_train, y_train) model.score(X_test, y_test)
Wybór kolumn po typiefrom sklearn.compose import make_column_selector make_column_selector(dtype_include="number")(X_train)
Uzupełnianie braków, potem skalowaniemake_pipeline(SimpleImputer(strategy="median"), StandardScaler())
Nazwy cech wyjściowychpre.get_feature_names_out()

Walidacja krzyżowa

Walidacja krzyżowa trenuje i ocenia model na kilku podziałach, co daje stabilniejsze oszacowanie niż jeden zbiór testowy.

ZadanieKod
Importyfrom sklearn.model_selection import cross_val_score, cross_validate, KFold, StratifiedKFold
Wynik na 5 foldachscores = cross_val_score(pipe, X, y, cv=5) scores.mean(), scores.std()
Wybór metrykicross_val_score(pipe, X, y, cv=5, scoring="f1_macro")
Foldy z przetasowaniemcv = KFold(n_splits=5, shuffle=True, random_state=0)
Ten sam rozkład klas w każdym foldziecv = StratifiedKFold(n_splits=5, shuffle=True, random_state=0)
Kilka metryk i wyniki treningowecross_validate(pipe, X, y, cv=cv, scoring=["accuracy", "f1"], return_train_score=True)
Predykcja dla każdego wiersza spoza foldufrom sklearn.model_selection import cross_val_predict cross_val_predict(pipe, X, y, cv=5)
Foldy według grup, foldy w kolejności czasufrom sklearn.model_selection import GroupKFold, TimeSeriesSplit GroupKFold(n_splits=5), TimeSeriesSplit(n_splits=5)
Wszystkie poprawne nazwy metrykfrom sklearn.metrics import get_scorer_names get_scorer_names()

Grid search i strojenie

Wyszukiwanie trenuje model dla każdego ustawienia z walidacją krzyżową, wybiera najlepsze i trenuje je ponownie na wszystkich danych treningowych.

ZadanieKod
Importyfrom sklearn.model_selection import GridSearchCV, RandomizedSearchCV
Wszystkie kombinacjegrid = GridSearchCV(RandomForestClassifier(random_state=0), {"n_estimators": [50, 100], "max_depth": [None, 5]}, cv=5) grid.fit(X_train, y_train)
Najlepsze ustawienia i ich wynikgrid.best_params_, grid.best_score_
Użycie najlepszego modelugrid.best_estimator_.predict(X_test), grid.score(X_test, y_test)
Strojenie kroku w pipelineGridSearchCV(pipe, {"logisticregression__C": [0.1, 1, 10]}, cv=5).fit(X_train, y_train)
Losowe ustawienia z rozkładówfrom 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)
Wszystkie rdzenie procesoraGridSearchCV(pipe, {"logisticregression__C": [0.1, 1]}, cv=5, n_jobs=-1)
Wszystkie wyniki jako tabelapd.DataFrame(grid.cv_results_).sort_values("rank_test_score")

Klasteryzacja i redukcja wymiarowości

Modele nienadzorowane uczą się z samego X. Najpierw przeskaluj cechy, bo oba podejścia używają odległości.

ZadanieKod
Klastry k-meansfrom sklearn.cluster import KMeans km = KMeans(n_clusters=3, random_state=0) labels = km.fit_predict(X)
Środki klastrów i inercjakm.cluster_centers_, km.inertia_
Jak dobrze rozdzielone są klastryfrom sklearn.metrics import silhouette_score silhouette_score(X, labels)
Klastry gęstościowe, szum to -1from sklearn.cluster import DBSCAN DBSCAN(eps=0.5, min_samples=5).fit_predict(X)
Rzut na 2 składowefrom sklearn.decomposition import PCA pca = PCA(n_components=2) X_2d = pca.fit_transform(X)
Wariancja wyjaśniona przez każdą składowąpca.explained_variance_ratio_
Zachowaj 95% wariancjiPCA(n_components=0.95).fit_transform(X)

scikit-learn 1.9: stare zapisy i co pisać teraz

Kod skopiowany ze starszych tutoriali może w scikit-learn 1.9 rzucić błąd albo ostrzeżenie. Używaj zapisów z kolumny scikit-learn 1.9.

Zadaniescikit-learn 1.9Stary zapis
Pierwiastek błędu średniokwadratowegoroot_mean_squared_error(y_test, y_pred)mean_squared_error(y_test, y_pred, squared=False)
Gęsty wynik one-hotOneHotEncoder(sparse_output=False)OneHotEncoder(sparse=False)
Regresja logistyczna z L1 (lasso)LogisticRegression(l1_ratio=1, solver="liblinear")LogisticRegression(penalty="l1", solver="liblinear")
Regresja logistyczna bez regularyzacjiLogisticRegression(C=np.inf)LogisticRegression(penalty=None)

Zapis, odczyt i powtarzalność

ZadanieKod
Zapisz wytrenowany model lub pipelineimport joblib joblib.dump(model, "model.joblib")
Wczytaj go z powrotemmodel = joblib.load("model.joblib")
Ten sam wynik przy każdym uruchomieniurandom_state=0
Zainstalowana wersjaimport sklearn sklearn.__version__

Kod scikit-learn, który stoi za prawdziwym procesem uczenia maszynowego, w kolejności, w jakiej go piszesz: wczytanie i podział danych, preprocessing, wybór modelu, fit i predict, ocena wyniku, połączenie kroków w pipeline, walidacja krzyżowa i strojenie przez grid search. Każdy wiersz to krótki fragment kodu do wklejenia i jedno zdanie o tym, co robi.

Wszystkie modele w scikit-learn mają jedno wspólne API: fit uczy się na danych treningowych, a predict i transform stosują to, czego się nauczyły. Wszystko tutaj jest napisane dla scikit-learn 1.9, wersji, której używa Coddy, z X jako cechami i y jako zmienną docelową. scikit-learn działa na tablicach NumPy i DataFrame'ach pandas, a wykresy opisuje ściąga z Matplotlib. Dopiero zaczynasz z Pythonem? Zajrzyj do ściągi z Pythona.

FAQ: ściąga ze scikit-learn

Czy ta ściąga ze scikit-learn jest darmowa?
Tak. Ta ściąga ze scikit-learn jest całkowicie darmowa i nie wymaga rejestracji. Dodaj ją do zakładek albo wydrukuj do PDF z przeglądarki i wracaj, kiedy tylko potrzebujesz dokładnego wywołania dla pipeline'u, metryki czy grid search.
Czy sklearn to to samo co scikit-learn?
Tak. scikit-learn to nazwa biblioteki i pakietu, który instalujesz (pip install scikit-learn), a sklearn to nazwa, którą importujesz w kodzie (from sklearn.linear_model import LinearRegression). Ściąga ze sklearn i ściąga ze scikit-learn obejmują to samo.
Czym różnią się fit, transform i fit_transform?
fit uczy się z danych: scaler poznaje średnią każdej kolumny, a model swoje wagi. transform stosuje to, czego się nauczył, a fit_transform robi obie rzeczy w jednym wywołaniu. Na zbiorze treningowym używaj fit_transform, a na testowym tylko transform, inaczej dane testowe wyciekną do treningu. Pipeline zrobi to za ciebie.
Czy muszę skalować cechy?
Dla modeli, które używają odległości lub gradientów, tak: k najbliższych sąsiadów, SVM, k-means, PCA oraz regresja liniowa i logistyczna z regularyzacją działają lepiej na przeskalowanych danych. Modele drzewiaste, takie jak drzewa decyzyjne, lasy losowe i gradient boosting, nie potrzebują skalowania. Umieść scaler w pipeline, żeby był dopasowywany tylko na danych treningowych.
Od którego modelu scikit-learn zacząć?
Zacznij od prostego, szybkiego modelu jako baseline'u: LinearRegression do przewidywania liczb, LogisticRegression do przewidywania klas. Potem spróbuj RandomForestClassifier albo HistGradientBoostingClassifier (lub ich wersji do regresji), porównaj je walidacją krzyżową i dostrój najlepszy przez GridSearchCV.
Którą wersję scikit-learn obejmuje ta ściąga?
scikit-learn 1.9, wersję, której używa Coddy, na NumPy 2 i pandas 3. Starsze wywołania, które teraz rzucają błąd lub ostrzeżenie, takie jak squared=False w mean_squared_error, sparse=False w OneHotEncoder i argument penalty w LogisticRegression, są w tabeli starych zapisów obok tego, co pisać zamiast nich.
Czy mogę uruchomić kod scikit-learn online?
Tak. Darmowy Matplotlib playground uruchamia Pythona ze scikit-learn, pandas, NumPy i Matplotlib w przeglądarce, więc możesz wkleić dowolny fragment z tej ściągi i uruchomić go bez instalowania czegokolwiek. Kurs Machine Learning w Coddy uczy krok po kroku całego procesu z tej strony, od podziału danych po strojenie modelu.
Ilustracja języków programowania w Coddy

Naucz się języka Scikit-learn z Coddy

ZACZNIJ