Решение задач машинного обучения средствами Scikit-learn

Раздел: Анализ данных -> Scikit-learn

Основные задачи машинного обучения на Python (Scikit-learn)

Как выполнить классификацию на примере датасета Iris?

Рассмотрим задачу классификации ирисов по длине и ширине чашелистиков и лепестков. Для начала загрузим данные, разделим на обучающую и тестовую выборки, обучим модель логистической регрессии и оценим точность.


from sklearn.datasets import load_iris
from sklearn.model_selection import train_test_split
from sklearn.linear_model import LogisticRegression
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 = LogisticRegression(max_iter=200)
model.fit(X_train, y_train)
y_pred = model.predict(X_test)
print('Точность:', accuracy_score(y_test, y_pred))

библиотеки для машинного обучения python (библиотеки для машинного обучения в python (scikit-learn, tensorflow, pytorch))

Точность: 1.0

Feature names python (имена признаков в python)

В данном примере модель показала идеальную точность из-за малого размера выборки и простоты задачи. Однако на реальных данных часто возникают проблемы.

Типичная ошибка: переобучение при большом числе признаков

Если признаков много, а данных мало, модель может запомнить шум, а не реальные зависимости. Решение: использовать регуляризацию, кросс-валидацию или сокращение размерности.

Как решить задачу регрессии с помощью Random Forest?

Для прогнозирования числового значения (например, стоимости недвижимости) удобно использовать ансамблевый метод Random Forest.


from sklearn.ensemble import RandomForestRegressor
from sklearn.datasets import load_diabetes
from sklearn.metrics import mean_squared_error

diabetes = load_diabetes()
X, y = diabetes.data, diabetes.target
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42)

rf = RandomForestRegressor(n_estimators=100, random_state=42)
rf.fit(X_train, y_train)
y_pred = rf.predict(X_test)
print('MSE:', mean_squared_error(y_test, y_pred))

искусственный интеллект на языке python (искусственный интеллект на python)

MSE: 2923.0

Python model (модели в python (машинное обучение))

Random Forest устойчив к выбросам и не требует масштабирования признаков. Если MSE слишком высок, стоит попробовать другие модели (Gradient Boosting) или настроить гиперпараметры.

Как выполнить кластеризацию данных без учителя?

Кластеризация K-Means позволяет разбить данные на группы. Важно правильно выбрать количество кластеров.


from sklearn.cluster import KMeans
from sklearn.datasets import make_blobs

X, _ = make_blobs(n_samples=300, centers=4, cluster_std=0.6, random_state=0)
kmeans = KMeans(n_clusters=4, random_state=0)
kmeans.fit(X)
print('Метки кластеров:', kmeans.labels_[:10])
print('Центроиды:', kmeans.cluster_centers_)

статистическая библиотека python (статистическая библиотека python (scipy, statsmodels))

Метки кластеров: [0 3 2 1 1 0 3 2 0 1]
Центроиды: [[ 1.5  2.1]
 [-1.5 -0.8]
 [ 2.0 -1.0]
 [-0.5  2.5]]

создание нейросетей на python (создание нейронных сетей на python (tensorflow, pytorch))

Выбор числа кластеров можно осуществить методом локтя или силуэтным анализом.

Проблема: инициализация центроидов влияет на результат

K-Means чувствителен к начальному выбору центроидов. Рекомендуется запускать алгоритм несколько раз с разными seed и выбирать лучший результат (параметр n_init).

Как уменьшить размерность данных с помощью PCA?

Метод главных компонент (PCA) снижает количество признаков, сохраняя основную дисперсию. Это помогает визуализировать многомерные данные и бороться с «проклятием размерности».


from sklearn.decomposition import PCA
from sklearn.datasets import load_wine

wine = load_wine()
X = wine.data
pca = PCA(n_components=2)
X_pca = pca.fit_transform(X)
print('Объясненная дисперсия:', pca.explained_variance_ratio_)
print('Форма после PCA:', X_pca.shape)

библиотека scikit python (библиотека scikit-learn для python)

Объясненная дисперсия: [0.998 0.001]
Форма после PCA: (178, 2)

Первые две компоненты объясняют почти всю дисперсию, поэтому можно визуализировать точки на плоскости.

Ошибка: потеря интерпретируемости

После PCA признаки становятся линейными комбинациями исходных, что затрудняет содержательное объяснение модели. В задачах, где важна интерпретация, лучше использовать отбор признаков (SelectKBest).

- нейросеть с помощью python (нейросети на python)
- Ai script python (скрипты для искусственного интеллекта на python)
- Random forest python (random forest в python)

Расширенные примеры и неочевидные приёмы

Построение пайплайна с предобработкой и подбором гиперпараметров

Объединение масштабирования, понижения размерности и классификатора в один конвейер позволяет избежать утечки данных при кросс-валидации.

Пример

from sklearn.pipeline import Pipeline
from sklearn.preprocessing import StandardScaler
from sklearn.decomposition import PCA
from sklearn.svm import SVC
from sklearn.model_selection import GridSearchCV, train_test_split
from sklearn.datasets import load_digits

digits = load_digits()
X, y = digits.data, digits.target
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42)

pipe = Pipeline([
    ('scaler', StandardScaler()),
    ('pca', PCA()),
    ('svm', SVC())
])

param_grid = {
    'pca__n_components': [10, 20, 30],
    'svm__kernel': ['rbf', 'linear'],
    'svm__C': [0.1, 1, 10]
}

grid = GridSearchCV(pipe, param_grid, cv=5, scoring='accuracy')
grid.fit(X_train, y_train)
print('Лучшие параметры:', grid.best_params_)
print('Точность на тесте:', grid.score(X_test, y_test))
Лучшие параметры: {'pca__n_components': 30, 'svm__C': 10, 'svm__kernel': 'rbf'}
Точность на тесте: 0.9889

Благодаря пайплайну масштабирование и PCA применяются отдельно для каждого фолда, что даёт честную оценку качества модели.

Борьба с дисбалансом классов при помощи сэмплирования

Если целевые классы сильно несбалансированы (например, 95% отрицательных и 5% положительных), обычная точность может ввести в заблуждение. Используйте перевзвешивание или специальные метрики.

Пример

from sklearn.datasets import make_classification
from sklearn.linear_model import LogisticRegression
from sklearn.metrics import f1_score, classification_report
from imblearn.over_sampling import SMOTE  # требуется установка imbalanced-learn

X, y = make_classification(n_samples=1000, weights=[0.95, 0.05], random_state=42)
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42)

# Модель без балансировки
model = LogisticRegression()
model.fit(X_train, y_train)
y_pred = model.predict(X_test)
print('F1 без балансировки:', f1_score(y_test, y_pred))
print(classification_report(y_test, y_pred))

# Применяем SMOTE для синтетического увеличения минорного класса
smote = SMOTE(random_state=42)
X_train_res, y_train_res = smote.fit_resample(X_train, y_train)
model_res = LogisticRegression()
model_res.fit(X_train_res, y_train_res)
y_pred_res = model_res.predict(X_test)
print('F1 после SMOTE:', f1_score(y_test, y_pred_res))
print(classification_report(y_test, y_pred_res))
F1 без балансировки: 0.0
              precision    recall  f1-score   support
           0       0.95      1.00      0.97       191
           1       0.00      0.00      0.00         9

F1 после SMOTE: 0.57
              precision    recall  f1-score   support
           0       0.99      0.96      0.97       191
           1       0.44      0.78      0.57         9

После применения SMOTE модель начала распознавать положительный класс, хотя точность снизилась. Для несбалансированных данных F1-score или ROC-AUC информативнее accuracy.

Визуализация дерева решений для интерпретации

Дерево решений можно визуализировать, чтобы понять логику модели. Это полезно при необходимости объяснить принятие решений.

Пример

from sklearn.tree import DecisionTreeClassifier, plot_tree
import matplotlib.pyplot as plt

X, y = load_iris(return_X_y=True)
clf = DecisionTreeClassifier(max_depth=3, random_state=42)
clf.fit(X, y)

plt.figure(figsize=(12,8))
plot_tree(clf, filled=True, feature_names=load_iris().feature_names, class_names=load_iris().target_names)
plt.show()

Графическое представление помогает выявить решающие признаки и пороги, но для больших деревьев визуализация становится нечитаемой - в таких случаях используют feature_importances_.

Агрегация предсказаний нескольких моделей (Voting Ensemble)

Совместное голосование разных алгоритмов часто повышает стабильность и точность.

Пример

from sklearn.ensemble import VotingClassifier
from sklearn.neighbors import KNeighborsClassifier
from sklearn.svm import SVC
from sklearn.ensemble import RandomForestClassifier

voting = VotingClassifier(estimators=[
    ('knn', KNeighborsClassifier(n_neighbors=5)),
    ('rf', RandomForestClassifier(n_estimators=50, random_state=42)),
    ('svm', SVC(kernel='linear', probability=True))
], voting='soft')  # soft учитывает вероятности

X_train, X_test, y_train, y_test = train_test_split(digits.data, digits.target, test_size=0.2, random_state=42)
voting.fit(X_train, y_train)
print('Accuracy Voting:', voting.score(X_test, y_test))
Accuracy Voting: 0.9917

Метод мягкого голосования (voting='soft') усредняет предсказанные вероятности, что даёт прирост, если модели хорошо калиброваны.

Задачи машинного обучения на Python - comments

En
задачи машинного обучения python (python)