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.
- claros-0.7.0/LICENSE +21 -0
- claros-0.7.0/PKG-INFO +318 -0
- claros-0.7.0/README.md +289 -0
- claros-0.7.0/claros/__init__.py +58 -0
- claros-0.7.0/claros/base.py +27 -0
- claros-0.7.0/claros/cluster.py +109 -0
- claros-0.7.0/claros/decomposition.py +32 -0
- claros-0.7.0/claros/ensemble.py +132 -0
- claros-0.7.0/claros/feature_selection.py +26 -0
- claros-0.7.0/claros/linear_model.py +51 -0
- claros-0.7.0/claros/links.py +34 -0
- claros-0.7.0/claros/losses.py +58 -0
- claros-0.7.0/claros/metrics.py +42 -0
- claros-0.7.0/claros/model_selection.py +57 -0
- claros-0.7.0/claros/multiclass.py +36 -0
- claros-0.7.0/claros/naive_bayes.py +42 -0
- claros-0.7.0/claros/neighbors.py +35 -0
- claros-0.7.0/claros/pipeline.py +49 -0
- claros-0.7.0/claros/preprocessing.py +16 -0
- claros-0.7.0/claros/svm.py +32 -0
- claros-0.7.0/claros/tree.py +92 -0
- claros-0.7.0/claros.egg-info/PKG-INFO +318 -0
- claros-0.7.0/claros.egg-info/SOURCES.txt +38 -0
- claros-0.7.0/claros.egg-info/dependency_links.txt +1 -0
- claros-0.7.0/claros.egg-info/requires.txt +5 -0
- claros-0.7.0/claros.egg-info/top_level.txt +1 -0
- claros-0.7.0/pyproject.toml +37 -0
- claros-0.7.0/setup.cfg +4 -0
- claros-0.7.0/tests/test_cluster.py +46 -0
- claros-0.7.0/tests/test_decomposition.py +27 -0
- claros-0.7.0/tests/test_ensemble.py +39 -0
- claros-0.7.0/tests/test_linear_model.py +22 -0
- claros-0.7.0/tests/test_model_selection.py +13 -0
- claros-0.7.0/tests/test_multiclass.py +23 -0
- claros-0.7.0/tests/test_naive_bayes.py +25 -0
- claros-0.7.0/tests/test_neighbors.py +20 -0
- claros-0.7.0/tests/test_pipeline.py +47 -0
- claros-0.7.0/tests/test_preprocessing.py +20 -0
- claros-0.7.0/tests/test_svm.py +25 -0
- 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.
|