Решение задач машинного обучения средствами 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).
Расширенные примеры и неочевидные приёмы
Построение пайплайна с предобработкой и подбором гиперпараметров
Объединение масштабирования, понижения размерности и классификатора в один конвейер позволяет избежать утечки данных при кросс-валидации.
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') усредняет предсказанные вероятности, что даёт прирост, если модели хорошо калиброваны.