Scikit-learn: инструментарий для ML проектов на Python
Введение в Scikit-learn
Scikit-learn (sklearn) – одна из самых популярных библиотек машинного обучения на Python. Она предоставляет единый интерфейс для множества алгоритмов, инструменты для предобработки данных, оценки моделей и подбора гиперпараметров. Библиотека активно используется в исследовательских и промышленных проектах благодаря простоте и документированности.
Как обучить первую модель классификации с помощью Scikit-learn?
Рассмотрим базовый сценарий – задачу классификации на наборе данных Iris. Основные шаги включают загрузку данных, разделение на обучающую и тестовую выборки, обучение модели и оценку точности.
from sklearn.datasets import load_iris
from sklearn.model_selection import train_test_split
from sklearn.ensemble import RandomForestClassifier
from sklearn.metrics import accuracy_score
# загрузка данных
iris = load_iris()
X, y = iris.data, iris.target
# разделение
X_train, X_test, y_train, y_test = train_test_split(
X, y, test_size=0.2, random_state=42
)
# создание и обучение модели
model = RandomForestClassifier(n_estimators=100, random_state=42)
model.fit(X_train, y_train)
# прогноз и оценка
y_pred = model.predict(X_test)
print(f"Точность: {accuracy_score(y_test, y_pred):.3f}")библиотеки для машинного обучения python (библиотеки для машинного обучения в python (scikit-learn, tensorflow, pytorch))
Точность: 1.000
Feature names python (имена признаков в python)
Возможные проблемы:
- Если не указать random_state, результаты могут не воспроизводиться.
- При использовании алгоритмов, чувствительных к масштабу (SVM, k-ближайших соседей), необходимо предварительное масштабирование признаков.
Как заменить модель на другую, например, на метод опорных векторов?
from sklearn.svm import SVC
svm_model = SVC(kernel='rbf', gamma='scale', C=1.0)
svm_model.fit(X_train, y_train)
y_pred_svm = svm_model.predict(X_test)
print(f"Точность SVM: {accuracy_score(y_test, y_pred_svm):.3f}")Python model (модели в python (машинное обучение))
Точность SVM: 1.000
статистическая библиотека python (статистическая библиотека python (scipy, statsmodels))
При этом важно выполнить стандартизацию признаков с помощью StandardScaler, иначе модель может давать нестабильные результаты.
from sklearn.preprocessing import StandardScaler
scaler = StandardScaler()
X_train_scaled = scaler.fit_transform(X_train)
X_test_scaled = scaler.transform(X_test)
svm_model.fit(X_train_scaled, y_train)
print(accuracy_score(y_test, svm_model.predict(X_test_scaled)))создание нейросетей на python (создание нейронных сетей на python (tensorflow, pytorch))
Как оценить качество модели с помощью других метрик, например, F1-меры?
from sklearn.metrics import f1_score, classification_report
print(classification_report(y_test, y_pred, target_names=iris.target_names))
print(f"F1 (weighted): {f1_score(y_test, y_pred, average='weighted'):.3f}")библиотека scikit python (библиотека scikit-learn для python)
precision recall f1-score support
setosa 1.00 1.00 1.00 10
versicolor 1.00 1.00 1.00 9
virginica 1.00 1.00 1.00 11
accuracy 1.00 30
macro avg 1.00 1.00 1.00 30
weighted avg 1.00 1.00 1.00 30
F1 (weighted): 1.000задачи машинного обучения python (задачи машинного обучения на python)
Типичная ошибка:
Использование accuracy_score на несбалансированных данных без учёта распределения классов. Рекомендуется смотреть на f1-score и confusion_matrix.
Как выполнить регрессию и оценить её через среднюю квадратичную ошибку?
from sklearn.datasets import fetch_california_housing
from sklearn.linear_model import LinearRegression
from sklearn.metrics import mean_squared_error
housing = fetch_california_housing()
X_h, y_h = housing.data, housing.target
X_train_h, X_test_h, y_train_h, y_test_h = train_test_split(
X_h, y_h, test_size=0.2, random_state=42
)
lin_reg = LinearRegression()
lin_reg.fit(X_train_h, y_train_h)
y_pred_h = lin_reg.predict(X_test_h)
mse = mean_squared_error(y_test_h, y_pred_h)
print(f"MSE: {mse:.3f}")машинное обучение на данных python (машинное обучение на данных с помощью python)
MSE: 0.555
нейросеть python (нейросеть на python)
Как применить кластеризацию методом K-средних?
from sklearn.cluster import KMeans
from sklearn.datasets import make_blobs
X_blob, y_blob = make_blobs(n_samples=300, centers=3, random_state=42)
kmeans = KMeans(n_clusters=3, random_state=42, n_init='auto')
kmeans.fit(X_blob)
print("Метки кластеров:", kmeans.labels_[:10])Python создание модели (создание модели машинного обучения на python)
Метки кластеров: [1 2 1 0 1 2 2 0 1 2]
Проблема выбора числа кластеров:
Метод локтя (inertia) помогает определить оптимальное n_clusters. Необходимо провести анализ для нескольких значений и построить график.
Расширенные примеры использования Scikit-learn
Как объединить предобработку и обучение в единый пайплайн с подбором гиперпараметров?
Использование Pipeline и GridSearchCV позволяет автоматизировать процесс масштабирования и настройки модели. В примере ниже для задачи классификации на наборе Iris подбираются параметры SVM и выбирается метод масштабирования.
from sklearn.pipeline import Pipeline
from sklearn.model_selection import GridSearchCV
from sklearn.svm import SVC
from sklearn.preprocessing import StandardScaler, MinMaxScaler
pipeline = Pipeline([
('scaler', StandardScaler()),
('svm', SVC())
])
param_grid = {
'scaler': [StandardScaler(), MinMaxScaler()],
'svm__kernel': ['linear', 'rbf'],
'svm__C': [0.1, 1, 10]
}
grid = GridSearchCV(pipeline, param_grid, cv=5, scoring='accuracy')
grid.fit(X_train, y_train)
print("Лучшие параметры:", grid.best_params_)
print("Лучшая точность (CV):", grid.best_score_)Лучшие параметры: {'scaler': StandardScaler(), 'svm__C': 1, 'svm__kernel': 'rbf'}
Лучшая точность (CV): 0.9833333333333333Как обработать категориальные признаки с помощью OneHotEncoder и ColumnTransformer?
На примере датасета Titanic (вымышленный код) показана обработка смешанных типов данных. Сначала разделяем числовые и категориальные колонки, применяем к ним разные преобразования и объединяем через ColumnTransformer.
from sklearn.compose import ColumnTransformer
from sklearn.preprocessing import OneHotEncoder, StandardScaler
from sklearn.pipeline import Pipeline
from sklearn.ensemble import RandomForestClassifier
# Предположим, что df содержит числовые и категориальные признаки
numeric_features = ['age', 'fare']
categorical_features = ['sex', 'embarked']
preprocessor = ColumnTransformer(
transformers=[
('num', StandardScaler(), numeric_features),
('cat', OneHotEncoder(handle_unknown='ignore'), categorical_features)
]
)
full_pipeline = Pipeline([
('prep', preprocessor),
('clf', RandomForestClassifier(random_state=42))
])
# full_pipeline.fit(X_train, y_train)Типичная ошибка:
Забыть указать handle_unknown='ignore' для OneHotEncoder, что может привести к ошибке, если в тестовой выборке появятся новые категории.
Как сохранить обученную модель и загрузить её для дальнейшего использования?
import joblib
from sklearn.ensemble import RandomForestClassifier
model = RandomForestClassifier().fit(X_train, y_train)
joblib.dump(model, 'model.pkl')
# загрузка
loaded_model = joblib.load('model.pkl')
preds = loaded_model.predict(X_test)
print(preds[:5])[0 1 2 1 1]
Проблема совместимости версий:
Модели, сохранённые в одной версии sklearn, могут не загружаться в другой из-за изменений в API. Рекомендуется фиксировать версии библиотек.
Как выполнить кросс-валидацию вручную для оценки стабильности модели?
from sklearn.model_selection import cross_val_score
from sklearn.linear_model import LogisticRegression
scores = cross_val_score(LogisticRegression(max_iter=1000), X, y, cv=5, scoring='accuracy')
print("Оценки по фолдам:", scores)
print("Среднее:", scores.mean())Оценки по фолдам: [0.96666667 1. 0.93333333 0.96666667 1. ] Среднее: 0.9733333333333334
Как использовать метрики для регрессии, например, R² и MAE?
from sklearn.metrics import r2_score, mean_absolute_error
y_true = [3, -0.5, 2, 7]
y_pred = [2.5, 0.0, 2, 8]
print("R²:", r2_score(y_true, y_pred))
print("MAE:", mean_absolute_error(y_true, y_pred))R²: 0.9486081370449679 MAE: 0.5
Как построить кривую ROC и вычислить AUC для бинарного классификатора?
from sklearn.metrics import roc_curve, auc
from sklearn.linear_model import LogisticRegression
from sklearn.datasets import make_classification
X_bin, y_bin = make_classification(n_samples=200, n_features=2, random_state=42)
X_train_b, X_test_b, y_train_b, y_test_b = train_test_split(X_bin, y_bin, test_size=0.3, random_state=42)
lr = LogisticRegression()
lr.fit(X_train_b, y_train_b)
y_score = lr.predict_proba(X_test_b)[:, 1]
fpr, tpr, _ = roc_curve(y_test_b, y_score)
roc_auc = auc(fpr, tpr)
print("AUC:", roc_auc)AUC: 0.9743589743589743
Для визуализации ROC-кривой можно использовать библиотеку matplotlib.