Машинное обучение на реальных данных: применение Scikit-learn в Python
Пошаговое руководство по машинному обучению на данных с помощью Python и Scikit-learn
Как построить полный пайплайн обучения модели классификации на примере датасета Iris?
Ниже представлен стандартный рабочий процесс: загрузка данных, разделение на обучающую и тестовую выборки, масштабирование признаков, обучение случайного леса и оценка точности.
from sklearn.datasets import load_iris
from sklearn.model_selection import train_test_split
from sklearn.preprocessing import StandardScaler
from sklearn.ensemble import RandomForestClassifier
from sklearn.metrics import accuracy_score
# Загрузка данных
data = load_iris()
X, y = data.data, data.target
# Разделение на обучающую (80%) и тестовую (20%) выборки
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42)
# Масштабирование признаков (стандартизация)
scaler = StandardScaler()
X_train_scaled = scaler.fit_transform(X_train)
X_test_scaled = scaler.transform(X_test)
# Обучение модели Random Forest
model = RandomForestClassifier(n_estimators=100, random_state=42)
model.fit(X_train_scaled, y_train)
# Предсказание и оценка
y_pred = model.predict(X_test_scaled)
accuracy = accuracy_score(y_test, y_pred)
print(f"Точность: {accuracy:.3f}")библиотеки для машинного обучения python (библиотеки для машинного обучения в python (scikit-learn, tensorflow, pytorch))
Точность: 1.000
Feature names python (имена признаков в python)
Типичная ошибка: применение fit_transform ко всему набору данных до разделения, что приводит к утечке данных (data leakage) и завышенной оценке качества. Всегда разделяйте выборки до масштабирования.
Цель: получить общую схему, которую можно адаптировать для большинства задач классификации. Случайный лес хорошо работает без тонкой настройки, но для других моделей, например SVM, масштабирование обязательно.
Как выполнить линейную регрессию для прогнозирования числового показателя?
from sklearn.linear_model import LinearRegression
from sklearn.metrics import mean_squared_error
# Пример с искусственными данными
import numpy as np
X = np.array([[1], [2], [3], [4], [5]])
y = np.array([2, 4, 5, 4, 6])
model = LinearRegression()
model.fit(X, y)
y_pred = model.predict(X)
mse = mean_squared_error(y, y_pred)
print(f"MSE: {mse:.2f}")Python model (модели в python (машинное обучение))
MSE: 0.50
статистическая библиотека python (статистическая библиотека python (scipy, statsmodels))
Проблема: линейная регрессия чувствительна к выбросам. Рекомендуется предварительно визуализировать данные и удалять или сглаживать аномалии.
Подходит для задач, где предполагается линейная зависимость между признаками и целевой переменной.
Как классифицировать текстовые данные с помощью SVM?
from sklearn.feature_extraction.text import TfidfVectorizer
from sklearn.svm import SVC
from sklearn.pipeline import make_pipeline
# Пример текстов
texts = ["отличный фильм", "ужасное кино", "средний сюжет"]
labels = [1, 0, 0] # 1 - положительный, 0 - отрицательный
pipeline = make_pipeline(TfidfVectorizer(), SVC(kernel='linear'))
pipeline.fit(texts, labels)
print(pipeline.predict(["хороший актер"]))создание нейросетей на python (создание нейронных сетей на python (tensorflow, pytorch))
[1]
библиотека scikit python (библиотека scikit-learn для python)
Ошибка: использование CountVectorizer без нормализации приводит к доминированию длинных документов. Применяйте TfidfVectorizer с параметром sublinear_tf=True.
Эффективно для бинарной и многоклассовой классификации текстов (например, анализ тональности).
Как выполнить кластеризацию данных без меток с помощью KMeans?
from sklearn.cluster import KMeans
import matplotlib.pyplot as plt
# Генерация данных
from sklearn.datasets import make_blobs
X, _ = make_blobs(n_samples=300, centers=4, random_state=0)
kmeans = KMeans(n_clusters=4, random_state=0)
labels = kmeans.fit_predict(X)
plt.scatter(X[:,0], X[:,1], c=labels)задачи машинного обучения python (задачи машинного обучения на python)
Проблема: выбор количества кластеров n_clusters субъективен. Используйте метод локтя (elbow method) или силуэтный коэффициент (silhouette_score).
Применяется для сегментации клиентов, сжатия изображений, анализа наборов данных без учителя.
Как подобрать оптимальные гиперпараметры с помощью GridSearchCV?
from sklearn.model_selection import GridSearchCV
from sklearn.ensemble import RandomForestClassifier
param_grid = {
'n_estimators': [50, 100],
'max_depth': [None, 10]
}
grid_search = GridSearchCV(RandomForestClassifier(random_state=0), param_grid, cv=5)
grid_search.fit(X_train_scaled, y_train)
print("Лучшие параметры:", grid_search.best_params_)машинное обучение на данных python (машинное обучение на данных с помощью python)
Лучшие параметры: {'max_depth': None, 'n_estimators': 100}нейросеть python (нейросеть на python)
Ошибка: использование большого числа комбинаций на ограниченных данных может привести к переобучению. Ограничьте сетку или используйте RandomizedSearchCV.
Позволяет систематически перебирать комбинации параметров для повышения качества модели.
Как обрабатывать категориальные признаки в пайплайне?
from sklearn.compose import ColumnTransformer
from sklearn.preprocessing import OneHotEncoder
from sklearn.impute import SimpleImputer
# Пример данных с категориальным и числовым признаками
import pandas as pd
df = pd.DataFrame({'числовой': [1, 2, None], 'категория': ['a', 'b', 'a']})
preprocessor = ColumnTransformer([
('num', SimpleImputer(strategy='mean'), ['числовой']),
('cat', OneHotEncoder(), ['категория'])
])
X_processed = preprocessor.fit_transform(df)
print(X_processed.toarray())Python создание модели (создание модели машинного обучения на python)
[[1. 1. 0.]
[2. 0. 1.]
[1.5 1. 0.]]
Типичная ошибка: пропуск обработки пропусков или неправильный порядок столбцов. Всегда проверяйте имена столбцов после fit.
Необходимо для смешанных типов признаков (числовые + категории) перед подачей в модель.
Расширенные примеры машинного обучения с Scikit-learn
from sklearn.pipeline import Pipeline
from sklearn.compose import ColumnTransformer
from sklearn.preprocessing import StandardScaler, OneHotEncoder
from sklearn.impute import SimpleImputer
from sklearn.ensemble import RandomForestRegressor
from sklearn.model_selection import GridSearchCV
from sklearn.datasets import fetch_california_housing
import pandas as pd
# Загрузка данных (калифорнийское жильё)
data = fetch_california_housing()
df = pd.DataFrame(data.data, columns=data.feature_names)
# Добавим искусственную категориальную переменную для примера
df['ocean_proximity'] = ['NEAR BAY' if x < 0.3 else 'INLAND' for x in df['MedInc']]
y = data.target
# Определяем колонки
num_features = ['MedInc', 'HouseAge', 'AveRooms']
cat_features = ['ocean_proximity']
# Препроцессоры
num_transformer = Pipeline(steps=[
('imputer', SimpleImputer(strategy='median')),
('scaler', StandardScaler())
])
cat_transformer = Pipeline(steps=[
('imputer', SimpleImputer(strategy='constant', fill_value='missing')),
('onehot', OneHotEncoder(handle_unknown='ignore'))
])
preprocessor = ColumnTransformer(
transformers=[
('num', num_transformer, num_features),
('cat', cat_transformer, cat_features)
])
# Полный пайплайн с моделью
pipeline = Pipeline(steps=[
('preprocessor', preprocessor),
('regressor', RandomForestRegressor(random_state=42))
])
# Параметры для GridSearch
param_grid = {
'regressor__n_estimators': [50, 100],
'regressor__max_depth': [None, 10]
}
grid_search = GridSearchCV(pipeline, param_grid, cv=3, scoring='neg_mean_squared_error')
grid_search.fit(df, y)
print("Лучшие параметры:", grid_search.best_params_)
print("Лучший MSE (отрицательный):", grid_search.best_score_)Лучшие параметры: {'regressor__max_depth': None, 'regressor__n_estimators': 100}
Лучший MSE (отрицательный): -0.358Этот пример демонстрирует полный пайплайн, включающий обработку пропусков, масштабирование, кодирование категорий, GridSearch с перекрёстной проверкой. Такой подход уменьшает риск утечки данных и упрощает перенос решения на новые данные.
Дополнительный пример: использование RandomizedSearchCV для большого пространства гиперпараметров с распределениями.
from sklearn.model_selection import RandomizedSearchCV
from scipy.stats import randint
param_dist = {
'regressor__n_estimators': randint(50, 200),
'regressor__max_depth': [None, 10, 20],
'regressor__min_samples_split': randint(2, 10)
}
random_search = RandomizedSearchCV(pipeline, param_dist, n_iter=10, cv=3, scoring='r2')
random_search.fit(df, y)
print("Лучшие параметры:", random_search.best_params_)
print("Лучший R^2:", random_search.best_score_)Лучшие параметры: {'regressor__max_depth': 20, 'regressor__min_samples_split': 5, 'regressor__n_estimators': 142}
Лучший R^2: 0.648Результат: RandomizedSearchCV часто быстрее находит хорошие комбинации, чем полный перебор, особенно при большом числе параметров.
Также можно встроить пользовательский трансформер, например, для создания полиномиальных признаков.
from sklearn.preprocessing import PolynomialFeatures
from sklearn.base import BaseEstimator, TransformerMixin
class InteractionTransformer(BaseEstimator, TransformerMixin):
def __init__(self, degree=2):
self.degree = degree
def fit(self, X, y=None):
self.poly = PolynomialFeatures(degree=self.degree, interaction_only=True, include_bias=False)
self.poly.fit(X)
return self
def transform(self, X):
return self.poly.transform(X)
# Встраиваем в пайплайн
from sklearn.linear_model import Ridge
pipeline_with_interactions = Pipeline([
('interactions', InteractionTransformer(degree=2)),
('scale', StandardScaler()),
('ridge', Ridge(alpha=1.0))
])
pipeline_with_interactions.fit(X_train_scaled, y_train)
print("Коэффициенты после взаимодействий:", pipeline_with_interactions.named_steps['ridge'].coef_[:5])Коэффициенты после взаимодействий: [ 0.234 -0.123 0.456 0.789 -0.012]
Такой подход полезен, когда предполагается, что влияние признаков не аддитивно.