/
LeonBlue
/
ML_algos_from_scratch_python
Обзор
Документация
Войти
/
LeonBlue
/
ML_algos_from_scratch_python
Код
Запросы
0
Задачи
Вики
Пакеты
0
Релизы
0
CI/CD
Аналитика
Безопасность
master
ml_algorithms/supervised/logistic_regression.py
144 строки
4 KB
LeonBlue
Добавлены Jupyter ноутбуки для теории и визуализации алгоритмов, обновлены зависимости в requirements.txt, улучшены классы KMeans и LogisticRegression с методами для получения и установки параметров модели.
07 дек 2025, 01:03
07 дек 2025, 01:03
80e326c
Код
Авторство
О чём код?
""" Логистическая регрессия с нуля """ import numpy as np from ..base.base_model import BaseModel class LogisticRegression(BaseModel): """ Логистическая регрессия с использованием градиентного спуска """ def __init__(self, learning_rate=0.01, max_iter=1000, tol=1e-6): """ Parameters: ----------- learning_rate : float, default=0.01 Скорость обучения max_iter : int, default=1000 Максимальное число итераций tol : float, default=1e-6 Точность сходимости """ super().__init__() self.learning_rate = learning_rate self.max_iter = max_iter self.tol = tol self.coef_ = None self.intercept_ = None def _sigmoid(self, z): """Сигмоидная функция""" # Защита от переполнения z = np.clip(z, -500, 500) return 1 / (1 + np.exp(-z)) def fit(self, X, y): """ Обучение модели логистической регрессии Parameters: ----------- X : array-like, shape (n_samples, n_features) Обучающие данные y : array-like, shape (n_samples,) Целевые значения (0 или 1) """ X = self._validate_input(X) y = np.asarray(y) # Добавляем столбец единиц для intercept X_with_intercept = np.column_stack([np.ones(X.shape[0]), X]) n_samples, n_features = X_with_intercept.shape theta = np.zeros(n_features) for i in range(self.max_iter): # Предсказания (вероятности) z = X_with_intercept @ theta h = self._sigmoid(z) # Градиент gradient = (1 / n_samples) * X_with_intercept.T @ (h - y) # Обновление параметров theta_new = theta - self.learning_rate * gradient # Проверка сходимости if np.linalg.norm(theta_new - theta) < self.tol: break theta = theta_new self.intercept_ = theta[0] self.coef_ = theta[1:] self.is_fitted = True return self def predict_proba(self, X): """ Предсказание вероятностей Parameters: ----------- X : array-like, shape (n_samples, n_features) Данные для предсказания Returns: -------- probabilities : array-like, shape (n_samples,) Вероятности принадлежности классу 1 """ self._check_is_fitted() X = self._validate_input(X) z = X @ self.coef_ + self.intercept_ return self._sigmoid(z) def predict(self, X): """ Предсказание классов Parameters: ----------- X : array-like, shape (n_samples, n_features) Данные для предсказания Returns: -------- predictions : array-like, shape (n_samples,) Предсказанные классы (0 или 1) """ probabilities = self.predict_proba(X) return (probabilities >= 0.5).astype(int) def get_params(self): """ Получение параметров модели Returns: -------- params : dict Параметры модели """ return { 'learning_rate': self.learning_rate, 'max_iter': self.max_iter, 'tol': self.tol, 'coef_': self.coef_, 'intercept_': self.intercept_ } def set_params(self, **params): """ Установка параметров модели Parameters: """ self.learning_rate = params.get('learning_rate', self.learning_rate) self.max_iter = params.get('max_iter', self.max_iter) self.tol = params.get('tol', self.tol) self.coef_ = params.get('coef_', self.coef_) self.intercept_ = params.get('intercept_', self.intercept_) return self