claros 0.7.0__tar.gz

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (40) hide show
  1. claros-0.7.0/LICENSE +21 -0
  2. claros-0.7.0/PKG-INFO +318 -0
  3. claros-0.7.0/README.md +289 -0
  4. claros-0.7.0/claros/__init__.py +58 -0
  5. claros-0.7.0/claros/base.py +27 -0
  6. claros-0.7.0/claros/cluster.py +109 -0
  7. claros-0.7.0/claros/decomposition.py +32 -0
  8. claros-0.7.0/claros/ensemble.py +132 -0
  9. claros-0.7.0/claros/feature_selection.py +26 -0
  10. claros-0.7.0/claros/linear_model.py +51 -0
  11. claros-0.7.0/claros/links.py +34 -0
  12. claros-0.7.0/claros/losses.py +58 -0
  13. claros-0.7.0/claros/metrics.py +42 -0
  14. claros-0.7.0/claros/model_selection.py +57 -0
  15. claros-0.7.0/claros/multiclass.py +36 -0
  16. claros-0.7.0/claros/naive_bayes.py +42 -0
  17. claros-0.7.0/claros/neighbors.py +35 -0
  18. claros-0.7.0/claros/pipeline.py +49 -0
  19. claros-0.7.0/claros/preprocessing.py +16 -0
  20. claros-0.7.0/claros/svm.py +32 -0
  21. claros-0.7.0/claros/tree.py +92 -0
  22. claros-0.7.0/claros.egg-info/PKG-INFO +318 -0
  23. claros-0.7.0/claros.egg-info/SOURCES.txt +38 -0
  24. claros-0.7.0/claros.egg-info/dependency_links.txt +1 -0
  25. claros-0.7.0/claros.egg-info/requires.txt +5 -0
  26. claros-0.7.0/claros.egg-info/top_level.txt +1 -0
  27. claros-0.7.0/pyproject.toml +37 -0
  28. claros-0.7.0/setup.cfg +4 -0
  29. claros-0.7.0/tests/test_cluster.py +46 -0
  30. claros-0.7.0/tests/test_decomposition.py +27 -0
  31. claros-0.7.0/tests/test_ensemble.py +39 -0
  32. claros-0.7.0/tests/test_linear_model.py +22 -0
  33. claros-0.7.0/tests/test_model_selection.py +13 -0
  34. claros-0.7.0/tests/test_multiclass.py +23 -0
  35. claros-0.7.0/tests/test_naive_bayes.py +25 -0
  36. claros-0.7.0/tests/test_neighbors.py +20 -0
  37. claros-0.7.0/tests/test_pipeline.py +47 -0
  38. claros-0.7.0/tests/test_preprocessing.py +20 -0
  39. claros-0.7.0/tests/test_svm.py +25 -0
  40. claros-0.7.0/tests/test_tree.py +33 -0
claros-0.7.0/LICENSE ADDED
@@ -0,0 +1,21 @@
1
+ MIT License
2
+
3
+ Copyright (c) 2026 Сафин Георгий
4
+
5
+ Permission is hereby granted, free of charge, to any person obtaining a copy
6
+ of this software and associated documentation files (the "Software"), to deal
7
+ in the Software without restriction, including without limitation the rights
8
+ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9
+ copies of the Software, and to permit persons to whom the Software is
10
+ furnished to do so, subject to the following conditions:
11
+
12
+ The above copyright notice and this permission notice shall be included in all
13
+ copies or substantial portions of the Software.
14
+
15
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
21
+ SOFTWARE.
claros-0.7.0/PKG-INFO ADDED
@@ -0,0 +1,318 @@
1
+ Metadata-Version: 2.4
2
+ Name: claros
3
+ Version: 0.7.0
4
+ Summary: Учебная ML-библиотека с нуля на NumPy: sklearn-подобный интерфейс и свои робастные компоненты
5
+ Author-email: Сафин Георгий <sikirchannel@gmail.com>
6
+ License: MIT
7
+ Project-URL: Homepage, https://github.com/kuketa-tech/claros
8
+ Project-URL: Repository, https://github.com/kuketa-tech/claros
9
+ Keywords: machine-learning,numpy,from-scratch,education,scikit-learn
10
+ Classifier: Development Status :: 4 - Beta
11
+ Classifier: Intended Audience :: Science/Research
12
+ Classifier: Intended Audience :: Education
13
+ Classifier: License :: OSI Approved :: MIT License
14
+ Classifier: Operating System :: OS Independent
15
+ Classifier: Programming Language :: Python :: 3
16
+ Classifier: Programming Language :: Python :: 3.9
17
+ Classifier: Programming Language :: Python :: 3.10
18
+ Classifier: Programming Language :: Python :: 3.11
19
+ Classifier: Programming Language :: Python :: 3.12
20
+ Classifier: Topic :: Scientific/Engineering :: Artificial Intelligence
21
+ Requires-Python: >=3.9
22
+ Description-Content-Type: text/markdown
23
+ License-File: LICENSE
24
+ Requires-Dist: numpy>=1.20
25
+ Provides-Extra: dev
26
+ Requires-Dist: pytest; extra == "dev"
27
+ Requires-Dist: scikit-learn; extra == "dev"
28
+ Dynamic: license-file
29
+
30
+ # Claros
31
+
32
+ **Учебная ML-библиотека, написанная с нуля на чистом NumPy.** Sklearn-подобный интерфейс, никаких готовых ML-зависимостей — все алгоритмы реализованы руками.
33
+
34
+ `Python ≥ 3.9` · `только NumPy` · `лицензия MIT` · `32 теста зелёных`
35
+
36
+ ---
37
+
38
+ ## Содержание
39
+
40
+ - [Установка](#установка)
41
+ - [Документация](#документация)
42
+ - [Как устроено](#как-устроено)
43
+ - [Удобство: предобработка без Pipeline](#удобство-предобработка-без-pipeline)
44
+ - [Функции с примерами](#функции-с-примерами)
45
+ - [Валидация](#валидация)
46
+ - [Структура и тесты](#структура-и-тесты)
47
+ - [Дорожная карта](#дорожная-карта)
48
+
49
+ ---
50
+
51
+ ## Установка
52
+
53
+ ```bash
54
+ pip install -e . # библиотека
55
+ pip install -e ".[dev]" # + pytest и scikit-learn для тестов
56
+ ```
57
+
58
+ ## Документация
59
+
60
+ Полная документация — в папке [`docs/`](docs/index.md): по каждому классу параметры (тип, дефолт, смысл), методы, что возвращают, атрибуты, примеры, плюс гайд «как писать свои компоненты».
61
+
62
+ - [**Полный справочник всех функций**](docs/reference.md) — всё одним списком
63
+ - [Модели](docs/models.md) · [Кластеризация и PCA](docs/clustering.md) · [Потери и сжимающие функции](docs/losses-and-links.md)
64
+ - [Предобработка и конвейеры](docs/preprocessing-and-pipelines.md) · [Оценка и подбор](docs/evaluation.md) · [Как писать свои компоненты](docs/extending.md)
65
+
66
+ Можно собрать в сайт: `pip install mkdocs && mkdocs serve`.
67
+
68
+ ## Как устроено
69
+
70
+ Все модели наследуют `Estimator` и говорят на одном языке: `fit(X, y)` обучает (возвращает `self`), `predict(X)` предсказывает, `score(X, y)` — R² (регрессоры) или доля верных (классификаторы), `get_params` / `set_params` дают клонирование. Обученные величины оканчиваются на `_` (`coef_`, `labels_`).
71
+
72
+ Стержень дизайна — **потеря определяет модель**: весь шаг спуска это `g = loss.gradient(y, p) * link.derivative(z)`, поэтому линейная регрессия, логистическая регрессия и SVM — один движок с разной потерей и сжимающей функцией.
73
+
74
+ ---
75
+
76
+ ## Удобство: предобработка без Pipeline
77
+
78
+ Чтобы не собирать `Pipeline` руками, предобработку можно подключить прямо к модели.
79
+
80
+ **`prep(model, scale=1, clean_noise_features=1, pca=2)`** оборачивает **любую** модель и возвращает объект с обычным `fit`/`predict`/`score`/`fit_predict`. Опции: `scale=1` — масштабирование, `clean_noise_features=1` — убрать шумовые признаки, `pca=k` — сжать до k главных компонент (порядок: чистка → масштабирование → PCA → модель):
81
+
82
+ ```python
83
+ from claros import prep, LogisticRegression, KNeighborsClassifier
84
+
85
+ prep(LogisticRegression(), scale=1).fit(X, y) # + масштабирование
86
+ prep(KNeighborsClassifier(5), scale=1, clean_noise_features=1).fit(X, y) # + чистка шумовых признаков
87
+ prep(LogisticRegression(), pca=2).fit(X, y) # + сжатие до 2 главных компонент
88
+ ```
89
+
90
+ Это все предобработчики библиотеки (`StandardScaler`, `NoiseFeatureRemover`, `PCA`) — больше ничего через Pipeline не идёт. Полноценный `Pipeline` остаётся для произвольных цепочек.
91
+
92
+ У `DBSCAN` и `KMeans` есть встроенный флаг-сокращение `clean_noise_features` (1 — включить нашу чистку шумовых признаков, 0 — обычный режим):
93
+
94
+ ```python
95
+ from claros import DBSCAN
96
+ DBSCAN(eps=0.6, min_samples=6, clean_noise_features=1).fit_predict(X)
97
+ ```
98
+
99
+ Полноценный `Pipeline` (см. ниже) тоже остаётся — для произвольных цепочек.
100
+
101
+ ---
102
+
103
+ ## Функции с примерами
104
+
105
+ > В примерах `X` — матрица признаков `(n, d)`, `y` — цель, `X_new` — новые объекты.
106
+
107
+ ### Линейные модели
108
+
109
+ **`LinearRegression(loss=MSE(), link=Identity(), lr=0.1, n_iters=300, l2=0.0)`** — линейная регрессия градиентным спуском. Атрибуты: `coef_`, `intercept_`.
110
+ ```python
111
+ from claros import LinearRegression
112
+ m = LinearRegression().fit(X, y)
113
+ m.predict(X_new); m.score(X, y)
114
+ ```
115
+
116
+ **`LogisticRegression(loss=LogLoss(), link=Sigmoid(), lr=0.1, n_iters=300, l2=0.0)`** — бинарная классификация.
117
+ ```python
118
+ from claros import LogisticRegression
119
+ clf = LogisticRegression().fit(X, y)
120
+ clf.predict(X_new); clf.predict_proba(X_new)
121
+ ```
122
+
123
+ ### SVM
124
+
125
+ **`LinearSVC(C=1.0, lr=0.01, n_iters=1000)`** — линейный SVM (тот же движок + `HingeLoss`). `C` — обратная сила регуляризации.
126
+ ```python
127
+ from claros import LinearSVC
128
+ clf = LinearSVC(C=1.0).fit(X, y)
129
+ clf.predict(X_new); clf.decision_function(X_new)
130
+ ```
131
+
132
+ ### Наивный Байес
133
+
134
+ **`GaussianNB(var_smoothing=1e-9)`** — гауссов наивный Байес, мультикласс. Есть `predict_proba`.
135
+ ```python
136
+ from claros import GaussianNB
137
+ clf = GaussianNB().fit(X, y)
138
+ ```
139
+
140
+ ### Деревья решений
141
+
142
+ **`DecisionTreeClassifier(max_depth=5, min_samples_split=2, max_features=None, random_state=None)`** — примесь Gini.
143
+ **`DecisionTreeRegressor(...)`** — примесь = дисперсия.
144
+ ```python
145
+ from claros import DecisionTreeClassifier
146
+ clf = DecisionTreeClassifier(max_depth=5).fit(X, y)
147
+ ```
148
+
149
+ ### Ансамбли
150
+
151
+ **`RandomForestClassifier(n_estimators=50, max_depth=10, max_features="sqrt", random_state=None)`** / **`RandomForestRegressor(...)`** — бэггинг деревьев.
152
+ ```python
153
+ from claros import RandomForestClassifier
154
+ clf = RandomForestClassifier(n_estimators=100).fit(X, y)
155
+ ```
156
+
157
+ **`GradientBoostingClassifier(n_estimators=100, learning_rate=0.1, max_depth=3)`** / **`GradientBoostingRegressor(...)`** — бустинг по остаткам.
158
+ ```python
159
+ from claros import GradientBoostingRegressor
160
+ m = GradientBoostingRegressor(n_estimators=200).fit(X, y)
161
+ ```
162
+
163
+ ### Ближайшие соседи
164
+
165
+ **`KNeighborsClassifier(n_neighbors=5)`** / **`KNeighborsRegressor(n_neighbors=5)`** — k ближайших (векторный поиск, ×3 к прежнему).
166
+ ```python
167
+ from claros import KNeighborsClassifier
168
+ clf = KNeighborsClassifier(5).fit(X, y)
169
+ ```
170
+
171
+ ### Мультикласс
172
+
173
+ **`OneVsRestClassifier(estimator)`** — мультикласс из любой бинарной модели.
174
+ ```python
175
+ from claros import OneVsRestClassifier, LogisticRegression
176
+ clf = OneVsRestClassifier(LogisticRegression()).fit(X, y)
177
+ ```
178
+
179
+ ### Кластеризация
180
+
181
+ **`DBSCAN(eps=0.5, min_samples=5, clean_noise_features=0, feature_threshold=0.9)`** — плотностная кластеризация; метка `-1` — шум. `clean_noise_features=1` убирает шумовые признаки перед кластеризацией (наша доработка). Атрибуты: `labels_`, `remover_` (при включённом флаге).
182
+ ```python
183
+ from claros import DBSCAN
184
+ DBSCAN(eps=0.5, min_samples=5).fit_predict(X) # обычный DBSCAN
185
+ DBSCAN(eps=0.6, min_samples=6, clean_noise_features=1).fit_predict(X) # + чистка шумовых признаков
186
+ ```
187
+
188
+ **`KMeans(n_clusters=3, max_iter=100, n_init=10, random_state=None, clean_noise_features=0, feature_threshold=0.9)`** — по центрам, `n_init` перезапусков. Атрибуты: `cluster_centers_`, `labels_`, `inertia_`.
189
+ ```python
190
+ from claros import KMeans
191
+ KMeans(n_clusters=3).fit_predict(X)
192
+ ```
193
+
194
+ ### Снижение размерности
195
+
196
+ **`PCA(n_components=2)`** — главные компоненты через SVD. Методы: `transform`, `inverse_transform`; атрибут `explained_variance_ratio_`.
197
+ ```python
198
+ from claros import PCA
199
+ X2 = PCA(n_components=2).fit_transform(X)
200
+ ```
201
+
202
+ ### Функции потерь
203
+
204
+ **`MSE()`**, **`LogLoss()`**, **`HingeLoss()`**, **`DeadZoneLoss(delta=1.0)`** — `DeadZoneLoss` робастная (плоское дно + насыщение градиента, устойчива к выбросам).
205
+ ```python
206
+ from claros import LinearRegression, DeadZoneLoss
207
+ LinearRegression(loss=DeadZoneLoss(0.5), lr=0.02, n_iters=40000).fit(X, y)
208
+ ```
209
+
210
+ ### Сжимающие функции
211
+
212
+ **`Identity()`**, **`Sigmoid()`**, **`ArctanLink()`** — `ArctanLink` осторожнее сигмоиды (тяжёлые хвосты).
213
+ ```python
214
+ from claros import LogisticRegression, ArctanLink
215
+ LogisticRegression(link=ArctanLink()).fit(X, y)
216
+ ```
217
+
218
+ ### Предобработка и отбор признаков
219
+
220
+ **`StandardScaler()`** — среднее 0, дисперсия 1.
221
+ ```python
222
+ from claros import StandardScaler
223
+ Xs = StandardScaler().fit_transform(X)
224
+ ```
225
+
226
+ **`NoiseFeatureRemover(bins=20, threshold=0.9)`** — убирает признаки-шум (почти равномерная гистограмма). Атрибут `keep_mask_`.
227
+ ```python
228
+ from claros import NoiseFeatureRemover
229
+ Xc = NoiseFeatureRemover().fit_transform(X)
230
+ ```
231
+
232
+ ### Конвейер
233
+
234
+ **`prep(model, scale=0, clean_noise_features=0, pca=0)`** — предобработка к любой модели без ручного Pipeline: масштабирование, чистка шумовых признаков, PCA (см. раздел выше).
235
+ ```python
236
+ from claros import prep, KNeighborsClassifier
237
+ prep(KNeighborsClassifier(5), scale=1, clean_noise_features=1, pca=2).fit(X, y)
238
+ ```
239
+
240
+ **`Pipeline(steps)`** — произвольная цепочка `[(имя, объект), …]`: трансформеры по очереди, затем модель.
241
+ ```python
242
+ from claros import Pipeline, StandardScaler, LogisticRegression
243
+ Pipeline([("scale", StandardScaler()), ("model", LogisticRegression())]).fit(X, y)
244
+ ```
245
+
246
+ ### Подбор и оценка
247
+
248
+ **`train_test_split(X, y, test_size=0.25, random_state=None, shuffle=True)`** → `X_train, X_test, y_train, y_test`.
249
+ ```python
250
+ from claros import train_test_split
251
+ Xtr, Xte, ytr, yte = train_test_split(X, y, test_size=0.3, random_state=0)
252
+ ```
253
+
254
+ **`cross_val_score(model, X, y, cv=5, shuffle=True, random_state=None)`** → массив оценок.
255
+ ```python
256
+ from claros import cross_val_score, RandomForestClassifier
257
+ cross_val_score(RandomForestClassifier(), X, y, cv=5).mean()
258
+ ```
259
+
260
+ **`GridSearchCV(estimator, param_grid, cv=5)`** — перебор по сетке. Атрибуты: `best_params_`, `best_score_`, `best_estimator_`.
261
+ ```python
262
+ from claros import GridSearchCV, DecisionTreeClassifier
263
+ gs = GridSearchCV(DecisionTreeClassifier(), {"max_depth": [3, 5, 7]}, cv=5).fit(X, y)
264
+ gs.best_params_; gs.best_score_
265
+ ```
266
+
267
+ ### Метрики
268
+
269
+ Модуль **`claros.metrics`**, все вида `f(y_true, y_pred)`: регрессия — `mse`, `rmse`, `mae`, `r2_score`; классификация — `accuracy`, `precision`, `recall`, `f1_score`.
270
+ ```python
271
+ from claros.metrics import accuracy, r2_score
272
+ accuracy(y_true, y_pred); r2_score(y_true, y_pred)
273
+ ```
274
+
275
+ ---
276
+
277
+ ## Валидация
278
+
279
+ Сверено со scikit-learn на одинаковых данных:
280
+
281
+ | Модель | claros | sklearn |
282
+ |-------------------------------------|-------|---------|
283
+ | RandomForest — accuracy (круг) | 0.972 | 0.972 |
284
+ | KNN — accuracy (круг) | 0.983 | 0.983 |
285
+ | GradientBoosting — R^2 (sin) | 0.991 | 0.991 |
286
+ | LinearSVC — accuracy (две группы) | 1.000 | 1.000 |
287
+ | GaussianNB — accuracy (3 класса) | 0.972 | 0.972 |
288
+
289
+ Метки `GaussianNB` и `DBSCAN` совпадают со scikit-learn один-в-один, доли дисперсии `PCA` — до 4-го знака.
290
+
291
+ ## Структура и тесты
292
+
293
+ ```
294
+ claros-project/
295
+ ├── pyproject.toml README.md LICENSE PUBLISHING.md
296
+ ├── claros/ # base, losses, links, linear_model, svm, naive_bayes,
297
+ │ # tree, ensemble, neighbors, multiclass, decomposition,
298
+ │ # cluster, preprocessing, feature_selection, pipeline,
299
+ │ # model_selection, metrics
300
+ └── tests/ # 32 теста
301
+ ```
302
+
303
+ ```bash
304
+ pytest tests/ -q # 32 passed
305
+ ```
306
+
307
+ ## Дорожная карта
308
+
309
+ - [x] линейные модели, деревья, ансамбли, KNN, кластеризация, PCA
310
+ - [x] SVM, наивный Байес, GridSearchCV, мультикласс
311
+ - [x] удобство: флаг `clean_noise_features` и `prep(...)` — предобработка без Pipeline
312
+ - [x] ускорение: KNN векторизован (×3); DBSCAN — поточечный поиск O(n²) (для масштаба нужен C-индекс)
313
+ - [ ] публикация на PyPI — имя `claros` (инструкция в `PUBLISHING.md`)
314
+ - [ ] оформить результаты в виде научной статьи
315
+
316
+ ## Лицензия
317
+
318
+ MIT.
claros-0.7.0/README.md ADDED
@@ -0,0 +1,289 @@
1
+ # Claros
2
+
3
+ **Учебная ML-библиотека, написанная с нуля на чистом NumPy.** Sklearn-подобный интерфейс, никаких готовых ML-зависимостей — все алгоритмы реализованы руками.
4
+
5
+ `Python ≥ 3.9` · `только NumPy` · `лицензия MIT` · `32 теста зелёных`
6
+
7
+ ---
8
+
9
+ ## Содержание
10
+
11
+ - [Установка](#установка)
12
+ - [Документация](#документация)
13
+ - [Как устроено](#как-устроено)
14
+ - [Удобство: предобработка без Pipeline](#удобство-предобработка-без-pipeline)
15
+ - [Функции с примерами](#функции-с-примерами)
16
+ - [Валидация](#валидация)
17
+ - [Структура и тесты](#структура-и-тесты)
18
+ - [Дорожная карта](#дорожная-карта)
19
+
20
+ ---
21
+
22
+ ## Установка
23
+
24
+ ```bash
25
+ pip install -e . # библиотека
26
+ pip install -e ".[dev]" # + pytest и scikit-learn для тестов
27
+ ```
28
+
29
+ ## Документация
30
+
31
+ Полная документация — в папке [`docs/`](docs/index.md): по каждому классу параметры (тип, дефолт, смысл), методы, что возвращают, атрибуты, примеры, плюс гайд «как писать свои компоненты».
32
+
33
+ - [**Полный справочник всех функций**](docs/reference.md) — всё одним списком
34
+ - [Модели](docs/models.md) · [Кластеризация и PCA](docs/clustering.md) · [Потери и сжимающие функции](docs/losses-and-links.md)
35
+ - [Предобработка и конвейеры](docs/preprocessing-and-pipelines.md) · [Оценка и подбор](docs/evaluation.md) · [Как писать свои компоненты](docs/extending.md)
36
+
37
+ Можно собрать в сайт: `pip install mkdocs && mkdocs serve`.
38
+
39
+ ## Как устроено
40
+
41
+ Все модели наследуют `Estimator` и говорят на одном языке: `fit(X, y)` обучает (возвращает `self`), `predict(X)` предсказывает, `score(X, y)` — R² (регрессоры) или доля верных (классификаторы), `get_params` / `set_params` дают клонирование. Обученные величины оканчиваются на `_` (`coef_`, `labels_`).
42
+
43
+ Стержень дизайна — **потеря определяет модель**: весь шаг спуска это `g = loss.gradient(y, p) * link.derivative(z)`, поэтому линейная регрессия, логистическая регрессия и SVM — один движок с разной потерей и сжимающей функцией.
44
+
45
+ ---
46
+
47
+ ## Удобство: предобработка без Pipeline
48
+
49
+ Чтобы не собирать `Pipeline` руками, предобработку можно подключить прямо к модели.
50
+
51
+ **`prep(model, scale=1, clean_noise_features=1, pca=2)`** оборачивает **любую** модель и возвращает объект с обычным `fit`/`predict`/`score`/`fit_predict`. Опции: `scale=1` — масштабирование, `clean_noise_features=1` — убрать шумовые признаки, `pca=k` — сжать до k главных компонент (порядок: чистка → масштабирование → PCA → модель):
52
+
53
+ ```python
54
+ from claros import prep, LogisticRegression, KNeighborsClassifier
55
+
56
+ prep(LogisticRegression(), scale=1).fit(X, y) # + масштабирование
57
+ prep(KNeighborsClassifier(5), scale=1, clean_noise_features=1).fit(X, y) # + чистка шумовых признаков
58
+ prep(LogisticRegression(), pca=2).fit(X, y) # + сжатие до 2 главных компонент
59
+ ```
60
+
61
+ Это все предобработчики библиотеки (`StandardScaler`, `NoiseFeatureRemover`, `PCA`) — больше ничего через Pipeline не идёт. Полноценный `Pipeline` остаётся для произвольных цепочек.
62
+
63
+ У `DBSCAN` и `KMeans` есть встроенный флаг-сокращение `clean_noise_features` (1 — включить нашу чистку шумовых признаков, 0 — обычный режим):
64
+
65
+ ```python
66
+ from claros import DBSCAN
67
+ DBSCAN(eps=0.6, min_samples=6, clean_noise_features=1).fit_predict(X)
68
+ ```
69
+
70
+ Полноценный `Pipeline` (см. ниже) тоже остаётся — для произвольных цепочек.
71
+
72
+ ---
73
+
74
+ ## Функции с примерами
75
+
76
+ > В примерах `X` — матрица признаков `(n, d)`, `y` — цель, `X_new` — новые объекты.
77
+
78
+ ### Линейные модели
79
+
80
+ **`LinearRegression(loss=MSE(), link=Identity(), lr=0.1, n_iters=300, l2=0.0)`** — линейная регрессия градиентным спуском. Атрибуты: `coef_`, `intercept_`.
81
+ ```python
82
+ from claros import LinearRegression
83
+ m = LinearRegression().fit(X, y)
84
+ m.predict(X_new); m.score(X, y)
85
+ ```
86
+
87
+ **`LogisticRegression(loss=LogLoss(), link=Sigmoid(), lr=0.1, n_iters=300, l2=0.0)`** — бинарная классификация.
88
+ ```python
89
+ from claros import LogisticRegression
90
+ clf = LogisticRegression().fit(X, y)
91
+ clf.predict(X_new); clf.predict_proba(X_new)
92
+ ```
93
+
94
+ ### SVM
95
+
96
+ **`LinearSVC(C=1.0, lr=0.01, n_iters=1000)`** — линейный SVM (тот же движок + `HingeLoss`). `C` — обратная сила регуляризации.
97
+ ```python
98
+ from claros import LinearSVC
99
+ clf = LinearSVC(C=1.0).fit(X, y)
100
+ clf.predict(X_new); clf.decision_function(X_new)
101
+ ```
102
+
103
+ ### Наивный Байес
104
+
105
+ **`GaussianNB(var_smoothing=1e-9)`** — гауссов наивный Байес, мультикласс. Есть `predict_proba`.
106
+ ```python
107
+ from claros import GaussianNB
108
+ clf = GaussianNB().fit(X, y)
109
+ ```
110
+
111
+ ### Деревья решений
112
+
113
+ **`DecisionTreeClassifier(max_depth=5, min_samples_split=2, max_features=None, random_state=None)`** — примесь Gini.
114
+ **`DecisionTreeRegressor(...)`** — примесь = дисперсия.
115
+ ```python
116
+ from claros import DecisionTreeClassifier
117
+ clf = DecisionTreeClassifier(max_depth=5).fit(X, y)
118
+ ```
119
+
120
+ ### Ансамбли
121
+
122
+ **`RandomForestClassifier(n_estimators=50, max_depth=10, max_features="sqrt", random_state=None)`** / **`RandomForestRegressor(...)`** — бэггинг деревьев.
123
+ ```python
124
+ from claros import RandomForestClassifier
125
+ clf = RandomForestClassifier(n_estimators=100).fit(X, y)
126
+ ```
127
+
128
+ **`GradientBoostingClassifier(n_estimators=100, learning_rate=0.1, max_depth=3)`** / **`GradientBoostingRegressor(...)`** — бустинг по остаткам.
129
+ ```python
130
+ from claros import GradientBoostingRegressor
131
+ m = GradientBoostingRegressor(n_estimators=200).fit(X, y)
132
+ ```
133
+
134
+ ### Ближайшие соседи
135
+
136
+ **`KNeighborsClassifier(n_neighbors=5)`** / **`KNeighborsRegressor(n_neighbors=5)`** — k ближайших (векторный поиск, ×3 к прежнему).
137
+ ```python
138
+ from claros import KNeighborsClassifier
139
+ clf = KNeighborsClassifier(5).fit(X, y)
140
+ ```
141
+
142
+ ### Мультикласс
143
+
144
+ **`OneVsRestClassifier(estimator)`** — мультикласс из любой бинарной модели.
145
+ ```python
146
+ from claros import OneVsRestClassifier, LogisticRegression
147
+ clf = OneVsRestClassifier(LogisticRegression()).fit(X, y)
148
+ ```
149
+
150
+ ### Кластеризация
151
+
152
+ **`DBSCAN(eps=0.5, min_samples=5, clean_noise_features=0, feature_threshold=0.9)`** — плотностная кластеризация; метка `-1` — шум. `clean_noise_features=1` убирает шумовые признаки перед кластеризацией (наша доработка). Атрибуты: `labels_`, `remover_` (при включённом флаге).
153
+ ```python
154
+ from claros import DBSCAN
155
+ DBSCAN(eps=0.5, min_samples=5).fit_predict(X) # обычный DBSCAN
156
+ DBSCAN(eps=0.6, min_samples=6, clean_noise_features=1).fit_predict(X) # + чистка шумовых признаков
157
+ ```
158
+
159
+ **`KMeans(n_clusters=3, max_iter=100, n_init=10, random_state=None, clean_noise_features=0, feature_threshold=0.9)`** — по центрам, `n_init` перезапусков. Атрибуты: `cluster_centers_`, `labels_`, `inertia_`.
160
+ ```python
161
+ from claros import KMeans
162
+ KMeans(n_clusters=3).fit_predict(X)
163
+ ```
164
+
165
+ ### Снижение размерности
166
+
167
+ **`PCA(n_components=2)`** — главные компоненты через SVD. Методы: `transform`, `inverse_transform`; атрибут `explained_variance_ratio_`.
168
+ ```python
169
+ from claros import PCA
170
+ X2 = PCA(n_components=2).fit_transform(X)
171
+ ```
172
+
173
+ ### Функции потерь
174
+
175
+ **`MSE()`**, **`LogLoss()`**, **`HingeLoss()`**, **`DeadZoneLoss(delta=1.0)`** — `DeadZoneLoss` робастная (плоское дно + насыщение градиента, устойчива к выбросам).
176
+ ```python
177
+ from claros import LinearRegression, DeadZoneLoss
178
+ LinearRegression(loss=DeadZoneLoss(0.5), lr=0.02, n_iters=40000).fit(X, y)
179
+ ```
180
+
181
+ ### Сжимающие функции
182
+
183
+ **`Identity()`**, **`Sigmoid()`**, **`ArctanLink()`** — `ArctanLink` осторожнее сигмоиды (тяжёлые хвосты).
184
+ ```python
185
+ from claros import LogisticRegression, ArctanLink
186
+ LogisticRegression(link=ArctanLink()).fit(X, y)
187
+ ```
188
+
189
+ ### Предобработка и отбор признаков
190
+
191
+ **`StandardScaler()`** — среднее 0, дисперсия 1.
192
+ ```python
193
+ from claros import StandardScaler
194
+ Xs = StandardScaler().fit_transform(X)
195
+ ```
196
+
197
+ **`NoiseFeatureRemover(bins=20, threshold=0.9)`** — убирает признаки-шум (почти равномерная гистограмма). Атрибут `keep_mask_`.
198
+ ```python
199
+ from claros import NoiseFeatureRemover
200
+ Xc = NoiseFeatureRemover().fit_transform(X)
201
+ ```
202
+
203
+ ### Конвейер
204
+
205
+ **`prep(model, scale=0, clean_noise_features=0, pca=0)`** — предобработка к любой модели без ручного Pipeline: масштабирование, чистка шумовых признаков, PCA (см. раздел выше).
206
+ ```python
207
+ from claros import prep, KNeighborsClassifier
208
+ prep(KNeighborsClassifier(5), scale=1, clean_noise_features=1, pca=2).fit(X, y)
209
+ ```
210
+
211
+ **`Pipeline(steps)`** — произвольная цепочка `[(имя, объект), …]`: трансформеры по очереди, затем модель.
212
+ ```python
213
+ from claros import Pipeline, StandardScaler, LogisticRegression
214
+ Pipeline([("scale", StandardScaler()), ("model", LogisticRegression())]).fit(X, y)
215
+ ```
216
+
217
+ ### Подбор и оценка
218
+
219
+ **`train_test_split(X, y, test_size=0.25, random_state=None, shuffle=True)`** → `X_train, X_test, y_train, y_test`.
220
+ ```python
221
+ from claros import train_test_split
222
+ Xtr, Xte, ytr, yte = train_test_split(X, y, test_size=0.3, random_state=0)
223
+ ```
224
+
225
+ **`cross_val_score(model, X, y, cv=5, shuffle=True, random_state=None)`** → массив оценок.
226
+ ```python
227
+ from claros import cross_val_score, RandomForestClassifier
228
+ cross_val_score(RandomForestClassifier(), X, y, cv=5).mean()
229
+ ```
230
+
231
+ **`GridSearchCV(estimator, param_grid, cv=5)`** — перебор по сетке. Атрибуты: `best_params_`, `best_score_`, `best_estimator_`.
232
+ ```python
233
+ from claros import GridSearchCV, DecisionTreeClassifier
234
+ gs = GridSearchCV(DecisionTreeClassifier(), {"max_depth": [3, 5, 7]}, cv=5).fit(X, y)
235
+ gs.best_params_; gs.best_score_
236
+ ```
237
+
238
+ ### Метрики
239
+
240
+ Модуль **`claros.metrics`**, все вида `f(y_true, y_pred)`: регрессия — `mse`, `rmse`, `mae`, `r2_score`; классификация — `accuracy`, `precision`, `recall`, `f1_score`.
241
+ ```python
242
+ from claros.metrics import accuracy, r2_score
243
+ accuracy(y_true, y_pred); r2_score(y_true, y_pred)
244
+ ```
245
+
246
+ ---
247
+
248
+ ## Валидация
249
+
250
+ Сверено со scikit-learn на одинаковых данных:
251
+
252
+ | Модель | claros | sklearn |
253
+ |-------------------------------------|-------|---------|
254
+ | RandomForest — accuracy (круг) | 0.972 | 0.972 |
255
+ | KNN — accuracy (круг) | 0.983 | 0.983 |
256
+ | GradientBoosting — R^2 (sin) | 0.991 | 0.991 |
257
+ | LinearSVC — accuracy (две группы) | 1.000 | 1.000 |
258
+ | GaussianNB — accuracy (3 класса) | 0.972 | 0.972 |
259
+
260
+ Метки `GaussianNB` и `DBSCAN` совпадают со scikit-learn один-в-один, доли дисперсии `PCA` — до 4-го знака.
261
+
262
+ ## Структура и тесты
263
+
264
+ ```
265
+ claros-project/
266
+ ├── pyproject.toml README.md LICENSE PUBLISHING.md
267
+ ├── claros/ # base, losses, links, linear_model, svm, naive_bayes,
268
+ │ # tree, ensemble, neighbors, multiclass, decomposition,
269
+ │ # cluster, preprocessing, feature_selection, pipeline,
270
+ │ # model_selection, metrics
271
+ └── tests/ # 32 теста
272
+ ```
273
+
274
+ ```bash
275
+ pytest tests/ -q # 32 passed
276
+ ```
277
+
278
+ ## Дорожная карта
279
+
280
+ - [x] линейные модели, деревья, ансамбли, KNN, кластеризация, PCA
281
+ - [x] SVM, наивный Байес, GridSearchCV, мультикласс
282
+ - [x] удобство: флаг `clean_noise_features` и `prep(...)` — предобработка без Pipeline
283
+ - [x] ускорение: KNN векторизован (×3); DBSCAN — поточечный поиск O(n²) (для масштаба нужен C-индекс)
284
+ - [ ] публикация на PyPI — имя `claros` (инструкция в `PUBLISHING.md`)
285
+ - [ ] оформить результаты в виде научной статьи
286
+
287
+ ## Лицензия
288
+
289
+ MIT.