Funmagster commited on
Commit
23130af
·
verified ·
1 Parent(s): 52b24ff

Upload 3 files

Browse files
Files changed (3) hide show
  1. kaggle_preprocessing_starter.py +630 -0
  2. nlp_general.py +587 -0
  3. quic_start.py +251 -0
kaggle_preprocessing_starter.py ADDED
@@ -0,0 +1,630 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ # -*- coding: utf-8 -*-
2
+ """kaggle_preprocessing_starter.ipynb
3
+
4
+ Automatically generated by Colab.
5
+
6
+ Original file is located at
7
+ https://colab.research.google.com/drive/1Jzz9VWmE7n-HcdrXTuutXKHvAA1ry-5a
8
+
9
+ # Kaggle Starter Notebook
10
+ Базовые предобработки данных + быстрый старт моделей.
11
+
12
+ # 🔥 Kaggle Starter Template: Предобработка + Генерация признаков + Модели
13
+
14
+ Полный набор методов предобработки, генерации признаков, feature selection и моделей для соревнований Kaggle.
15
+ Каждый метод снабжён пояснением.
16
+
17
+ ---
18
+
19
+ ## 1. 🟦 Категориальные признаки
20
+
21
+ ### 1.1 OneHotEncoding (OHE)
22
+ **Что делает:** Преобразует категорию в бинарные колонки.
23
+ **Когда использовать:** Для линейных моделей, где порядок категорий не важен.
24
+
25
+ ```python
26
+ from sklearn.preprocessing import OneHotEncoder
27
+ import pandas as pd
28
+
29
+ ohe = OneHotEncoder(sparse_output=False, handle_unknown="ignore")
30
+ ohe_df = pd.DataFrame(ohe.fit_transform(df[['cat']]),
31
+ columns=ohe.get_feature_names_out(['cat']))
32
+ ````
33
+
34
+ ### 1.2 LabelEncoding
35
+
36
+ **Что делает:** Каждой категории присваивается число.
37
+ **Когда использовать:** Для деревьев (RandomForest, XGBoost), избегать для линейных моделей.
38
+
39
+ ```python
40
+ from sklearn.preprocessing import LabelEncoder
41
+ le = LabelEncoder()
42
+ df['cat_le'] = le.fit_transform(df['cat'])
43
+ ```
44
+
45
+ ### 1.3 Target Encoding
46
+
47
+ **Что делает:** Каждой категории присваивается среднее значение таргета.
48
+ **Когда использовать:** Для категорий с сильной зависимостью от цели.
49
+ **Внимание:** Возможна утечка информации, используйте KFold.
50
+
51
+ ```python
52
+ !pip install category_encoders
53
+ from category_encoders import TargetEncoder
54
+
55
+ te = TargetEncoder()
56
+ df['cat_te'] = te.fit_transform(df['cat'], df['target'])
57
+ ```
58
+
59
+ ### 1.4 CatBoostEncoder
60
+
61
+ **Что делает:** Улучшенный target encoding с регуляризацией и шумом.
62
+ **Когда использовать:** Для уменьшения переобучения на малых выборках.
63
+
64
+ ```python
65
+ from category_encoders import CatBoostEncoder
66
+
67
+ cbe = CatBoostEncoder()
68
+ df['cat_cbe'] = cbe.fit_transform(df['cat'], df['target'])
69
+ ```
70
+
71
+ ### 1.5 Binary Encoding
72
+
73
+ **Что делает:** Преобразует категорию в бинарный код.
74
+ **Когда использовать:** Когда категорий слишком много для OHE.
75
+
76
+ ```python
77
+ from category_encoders import BinaryEncoder
78
+
79
+ be = BinaryEncoder()
80
+ be_df = be.fit_transform(df['cat'])
81
+ ```
82
+
83
+ ---
84
+
85
+ ## 2. 🟩 Числовые признаки
86
+
87
+ ### 2.1 StandardScaler
88
+
89
+ **Что делает:** Приводит к нулевому среднему и единичной дисперсии.
90
+ **Когда использовать:** Для большинства моделей.
91
+
92
+ ```python
93
+ from sklearn.preprocessing import StandardScaler
94
+ df['scaled'] = StandardScaler().fit_transform(df[['num']])
95
+ ```
96
+
97
+ ### 2.2 RobustScaler
98
+
99
+ **Что делает:** Масштабирование через медиану и IQR.
100
+ **Когда использовать:** Если есть выбросы.
101
+
102
+ ```python
103
+ from sklearn.preprocessing import RobustScaler
104
+ df['r_scaled'] = RobustScaler().fit_transform(df[['num']])
105
+ ```
106
+
107
+ ### 2.3 MinMaxScaler
108
+
109
+ **Что делает:** Масштабирует в диапазон [0,1].
110
+ **Когда использовать:** Для нейронных сетей.
111
+
112
+ ```python
113
+ from sklearn.preprocessing import MinMaxScaler
114
+ df['minmax'] = MinMaxScaler().fit_transform(df[['num']])
115
+ ```
116
+
117
+ ### 2.4 PowerTransformer
118
+
119
+ **Что делает:** Нормализует распределение признака (Box-Cox / Yeo-Johnson).
120
+ **Когда использовать:** Для сильно скошенных данных.
121
+
122
+ ```python
123
+ from sklearn.preprocessing import PowerTransformer
124
+ df['pt'] = PowerTransformer(method='yeo-johnson').fit_transform(df[['num']])
125
+ ```
126
+
127
+ ---
128
+
129
+ ## 3. 🟧 Текстовые признаки
130
+
131
+ ### 3.1 TF-IDF
132
+
133
+ **Что делает:** Преобразует текст в числовые векторы с учётом важности слов.
134
+ **Когда использовать:** Для NLP-задач, классификации текста.
135
+
136
+ ```python
137
+ from sklearn.feature_extraction.text import TfidfVectorizer
138
+
139
+ tfidf = TfidfVectorizer(max_features=5000, ngram_range=(1,2))
140
+ tfidf_df = pd.DataFrame(tfidf.fit_transform(df['text']).toarray(),
141
+ columns=tfidf.get_feature_names_out())
142
+ ```
143
+
144
+ ### 3.2 CountVectorizer
145
+
146
+ **Что делает:** Считает количество слов.
147
+ **Когда использовать:** Простая модель Bag-of-Words.
148
+
149
+ ```python
150
+ from sklearn.feature_extraction.text import CountVectorizer
151
+
152
+ cv = CountVectorizer(max_features=3000)
153
+ cv_df = pd.DataFrame(cv.fit_transform(df['text']).toarray(),
154
+ columns=cv.get_feature_names_out())
155
+ ```
156
+
157
+ ### 3.3 Word2Vec (Gensim)
158
+
159
+ **Что делает:** Преобразует слова в векторы с помощью нейросети и усредняет по тексту.
160
+ **Когда использовать:** Для семантических признаков текста.
161
+
162
+ ```python
163
+ from gensim.models import Word2Vec
164
+ import numpy as np
165
+
166
+ w2v = Word2Vec(sentences=df['text'].str.split(), vector_size=100, window=5, min_count=1)
167
+ df['w2v_mean'] = df['text'].str.split().apply(
168
+ lambda x: w2v.wv[x].mean(axis=0) if len(x)>0 else np.zeros(100))
169
+ ```
170
+
171
+ ---
172
+
173
+ ## 4. 🟪 Дата/время
174
+
175
+ ### 4.1 Извлечение компонентов даты
176
+
177
+ **Что делает:** Получает год, месяц, день, день недели.
178
+ **Когда использовать:** Для временных рядов или сезонных зависимостей.
179
+
180
+ ```python
181
+ df['date'] = pd.to_datetime(df['date'])
182
+ df['year'] = df['date'].dt.year
183
+ df['month'] = df['date'].dt.month
184
+ df['day'] = df['date'].dt.day
185
+ df['dow'] = df['date'].dt.dayofweek
186
+ df['is_weekend'] = df['dow'] >= 5
187
+ ```
188
+
189
+ ### 4.2 Циклические признаки для месяца/дня
190
+
191
+ **Что делает:** Преобразует циклические признаки в син/кос для сохранения цикличности.
192
+
193
+ ```python
194
+ import numpy as np
195
+ df['month_sin'] = np.sin(2 * np.pi * df['month']/12)
196
+ df['month_cos'] = np.cos(2 * np.pi * df['month']/12)
197
+ ```
198
+
199
+ ---
200
+
201
+ ## 5. 🟫 Статистические признаки и таймсериес
202
+
203
+ ### 5.1 Групповые агрегаты
204
+
205
+ **Что делает:** Считает среднее, std, min, max по группам.
206
+ **Когда использовать:** Для категориальных признаков, где важна статистика.
207
+
208
+ ```python
209
+ group = df.groupby('cat')['num'].agg(['mean','std','min','max'])
210
+ df = df.merge(group, on='cat', suffixes=('', '_grp'))
211
+ ```
212
+
213
+ ### 5.2 Lag / Shift
214
+
215
+ **Что делает:** Берёт предыдущие значения временного ряда.
216
+ **Когда использовать:** Для прогнозирования временных рядов.
217
+
218
+ ```python
219
+ df['lag1'] = df['value'].shift(1)
220
+ df['lag2'] = df['value'].shift(2)
221
+ ```
222
+
223
+ ### 5.3 Rolling / Скользящее окно
224
+
225
+ **Что делает:** Считает агрегаты (mean, sum, std) по окну.
226
+ **Когда использовать:** Для извлечения трендов в таймсериях.
227
+
228
+ ```python
229
+ df['rolling_mean_3'] = df['value'].rolling(3).mean()
230
+ df['rolling_std_3'] = df['value'].rolling(3).std()
231
+ ```
232
+
233
+ ---
234
+
235
+ ## 6. 🟨 Feature Selection
236
+
237
+ ### 6.1 Mutual Information
238
+
239
+ **Что делает:** Оценивает зависимость признака и целевой переменной.
240
+ **Когда использовать:** Для отбора информативных признаков.
241
+
242
+ ```python
243
+ from sklearn.feature_selection import mutual_info_classif
244
+
245
+ mi = mutual_info_classif(X, y)
246
+ ```
247
+
248
+ ### 6.2 SelectKBest
249
+
250
+ **Что делает:** Выбирает K лучших признаков по метрике (ANOVA, MI и др.)
251
+
252
+ ```python
253
+ from sklearn.feature_selection import SelectKBest, f_classif
254
+
255
+ selector = SelectKBest(score_func=f_classif, k=20)
256
+ X_new = selector.fit_transform(X, y)
257
+ ```
258
+
259
+ ### 6.3 RFE (Recursive Feature Elimination)
260
+
261
+ **Что делает:** Рекурсивно удаляет наименее важные признаки, оставляя n лучших.
262
+ **Когда использовать:** Для моделей с interpretability.
263
+
264
+ ```python
265
+ from sklearn.feature_selection import RFE
266
+ from sklearn.linear_model import LogisticRegression
267
+
268
+ rfe = RFE(LogisticRegression(), n_features_to_select=10)
269
+ rfe.fit(X, y)
270
+ ```
271
+
272
+ ---
273
+
274
+ ## 7. 🟫 Feature Generation
275
+
276
+ ### 7.1 Polynomial Features
277
+
278
+ **Что делает:** Создаёт полиномиальные признаки (x^2, x*y).
279
+ **Когда использовать:** Для линейных моделей, чтобы учесть нелинейности.
280
+
281
+ ```python
282
+ from sklearn.preprocessing import PolynomialFeatures
283
+
284
+ poly = PolynomialFeatures(degree=3)
285
+ poly_df = pd.DataFrame(poly.fit_transform(df[['num1','num2']]))
286
+ ```
287
+
288
+ ### 7.2 Interaction Features
289
+
290
+ **Что делает:** Создаёт признаки через перемножение/деление.
291
+ **Когда использовать:** Для деревьев и линейных моделей.
292
+
293
+ ```python
294
+ df['num1_x_num2'] = df['num1'] * df['num2']
295
+ df['num1_div_num2'] = df['num1'] / (df['num2'] + 1e-5)
296
+ ```
297
+
298
+ ---
299
+
300
+ ## 8. 🔥 Модели: классификация
301
+
302
+ ```python
303
+ from catboost import CatBoostClassifier
304
+ from xgboost import XGBClassifier
305
+ from lightgbm import LGBMClassifier
306
+ from sklearn.linear_model import LogisticRegression
307
+ from sklearn.ensemble import RandomForestClassifier, GradientBoostingClassifier, ExtraTreesClassifier
308
+ from sklearn.svm import SVC
309
+ ```
310
+
311
+ ---
312
+
313
+ ## 9. 🔥 Модели: регрессия
314
+
315
+ ```python
316
+ from xgboost import XGBRegressor
317
+ from lightgbm import LGBMRegressor
318
+ from catboost import CatBoostRegressor
319
+ from sklearn.ensemble import RandomForestRegressor
320
+ from sklearn.linear_model import LinearRegression, Ridge, Lasso
321
+ ```
322
+
323
+ ---
324
+
325
+ ## 10. 🧱 Полный Pipeline
326
+
327
+ **Что делает:** Объединяет числовые, категориальные признаки, pre-processing и модель в один объект.
328
+
329
+ ```python
330
+ from sklearn.compose import ColumnTransformer
331
+ from sklearn.pipeline import Pipeline
332
+ from sklearn.preprocessing import StandardScaler, OneHotEncoder
333
+ from lightgbm import LGBMClassifier
334
+
335
+ numeric = ['age','salary']
336
+ categorical = ['city']
337
+
338
+ preprocess = ColumnTransformer([
339
+ ('num', StandardScaler(), numeric),
340
+ ('cat', OneHotEncoder(handle_unknown='ignore'), categorical),
341
+ ])
342
+
343
+ model = Pipeline([
344
+ ('prep', preprocess),
345
+ ('clf', LGBMClassifier())
346
+ ])
347
+
348
+ model.fit(X_train, y_train)
349
+ pred = model.predict(X_test)
350
+ ```
351
+
352
+ ```
353
+
354
+ # 🧠 Продвинутое обучение моделей: классификация и регрессия
355
+
356
+ ## 1. Базовые модели
357
+
358
+ ### 1.1 Линейные модели
359
+
360
+ **Логистическая регрессия (классификация)**
361
+ ```python
362
+ from sklearn.linear_model import LogisticRegression
363
+
364
+ clf = LogisticRegression(max_iter=1000)
365
+ clf.fit(X_train, y_train)
366
+ preds = clf.predict(X_test)
367
+ ````
368
+
369
+ **Линейная регрессия (регрессия)**
370
+
371
+ ```python
372
+ from sklearn.linear_model import LinearRegression
373
+
374
+ reg = LinearRegression()
375
+ reg.fit(X_train, y_train)
376
+ preds = reg.predict(X_test)
377
+ ```
378
+
379
+ **Ridge / Lasso (регуляризация)**
380
+
381
+ ```python
382
+ from sklearn.linear_model import Ridge, Lasso
383
+
384
+ ridge = Ridge(alpha=1.0)
385
+ ridge.fit(X_train, y_train)
386
+
387
+ lasso = Lasso(alpha=0.01)
388
+ lasso.fit(X_train, y_train)
389
+ ```
390
+
391
+ ---
392
+
393
+ ### 1.2 Деревья и ансамбли
394
+
395
+ **RandomForest**
396
+
397
+ ```python
398
+ from sklearn.ensemble import RandomForestClassifier, RandomForestRegressor
399
+
400
+ rf_clf = RandomForestClassifier(n_estimators=200, max_depth=8, random_state=42)
401
+ rf_clf.fit(X_train, y_train)
402
+
403
+ rf_reg = RandomForestRegressor(n_estimators=200, max_depth=8, random_state=42)
404
+ rf_reg.fit(X_train, y_train)
405
+ ```
406
+
407
+ **Gradient Boosting**
408
+
409
+ ```python
410
+ from sklearn.ensemble import GradientBoostingClassifier, GradientBoostingRegressor
411
+
412
+ gb_clf = GradientBoostingClassifier(n_estimators=300, learning_rate=0.05)
413
+ gb_clf.fit(X_train, y_train)
414
+ ```
415
+
416
+ ---
417
+
418
+ ### 1.3 Популярные бустинги
419
+
420
+ **XGBoost**
421
+
422
+ ```python
423
+ from xgboost import XGBClassifier, XGBRegressor
424
+
425
+ xgb_clf = XGBClassifier(n_estimators=300, learning_rate=0.05, max_depth=5, eval_metric='logloss')
426
+ xgb_clf.fit(X_train, y_train)
427
+ ```
428
+
429
+ **LightGBM**
430
+
431
+ ```python
432
+ from lightgbm import LGBMClassifier, LGBMRegressor
433
+
434
+ lgb_clf = LGBMClassifier(n_estimators=500, learning_rate=0.05, num_leaves=31)
435
+ lgb_clf.fit(X_train, y_train)
436
+ ```
437
+
438
+ **CatBoost**
439
+
440
+ ```python
441
+ from catboost import CatBoostClassifier, CatBoostRegressor
442
+
443
+ cat_clf = CatBoostClassifier(iterations=500, learning_rate=0.05, depth=6, verbose=0)
444
+ cat_clf.fit(X_train, y_train)
445
+ ```
446
+
447
+ ---
448
+
449
+ ## 2. K-Fold Cross-Validation
450
+
451
+ **Что делает:** Делит данные на K частей, обучает K моделей, усредняет метрики и предсказания.
452
+
453
+ ```python
454
+ from sklearn.model_selection import KFold
455
+ from sklearn.metrics import accuracy_score
456
+ import numpy as np
457
+
458
+ kf = KFold(n_splits=5, shuffle=True, random_state=42)
459
+ oof_preds = np.zeros(len(X))
460
+ for train_idx, val_idx in kf.split(X):
461
+ X_tr, X_val = X[train_idx], X[val_idx]
462
+ y_tr, y_val = y[train_idx], y[val_idx]
463
+
464
+ model = LGBMClassifier(n_estimators=500)
465
+ model.fit(X_tr, y_tr, eval_set=[(X_val, y_val)], early_stopping_rounds=50, verbose=0)
466
+
467
+ oof_preds[val_idx] = model.predict(X_val)
468
+
469
+ # Средняя точность
470
+ from sklearn.metrics import accuracy_score
471
+ accuracy_score(y, oof_preds)
472
+ ```
473
+
474
+ **Пояснение:**
475
+
476
+ * `early_stopping_rounds` помогает остановить обучение, если модель не улучшается
477
+ * `shuffle=True` перемешивает данные для устойчивости
478
+
479
+ ---
480
+
481
+ ## 3. Метрики
482
+
483
+ ### 3.1 Классификация
484
+
485
+ ```python
486
+ from sklearn.metrics import accuracy_score, f1_score, roc_auc_score
487
+
488
+ accuracy = accuracy_score(y_test, preds)
489
+ f1 = f1_score(y_test, preds)
490
+ roc_auc = roc_auc_score(y_test, probs[:,1]) # для бинарного случая
491
+ ```
492
+
493
+ ### 3.2 Регрессия
494
+
495
+ ```python
496
+ from sklearn.metrics import mean_squared_error, r2_score
497
+
498
+ mse = mean_squared_error(y_test, preds)
499
+ rmse = np.sqrt(mse)
500
+ r2 = r2_score(y_test, preds)
501
+ ```
502
+
503
+ ---
504
+
505
+ ## 4. Early Stopping (для бустингов)
506
+
507
+ ```python
508
+ lgb_clf = LGBMClassifier(n_estimators=10000, learning_rate=0.01)
509
+ lgb_clf.fit(
510
+ X_train, y_train,
511
+ eval_set=[(X_val, y_val)],
512
+ eval_metric='logloss',
513
+ early_stopping_rounds=100,
514
+ verbose=100
515
+ )
516
+ ```
517
+
518
+ ---
519
+
520
+ ## 5. Stacking / Blending
521
+
522
+ **Что делает:** Комбинирует предсказания нескольких моделей через meta-модель.
523
+
524
+ ```python
525
+ from sklearn.ensemble import StackingClassifier
526
+ from sklearn.linear_model import LogisticRegression
527
+
528
+ estimators = [
529
+ ('rf', RandomForestClassifier(n_estimators=100)),
530
+ ('xgb', XGBClassifier(n_estimators=100)),
531
+ ('lgb', LGBMClassifier(n_estimators=100))
532
+ ]
533
+
534
+ stack = StackingClassifier(
535
+ estimators=estimators,
536
+ final_estimator=LogisticRegression()
537
+ )
538
+ stack.fit(X_train, y_train)
539
+ preds = stack.predict(X_test)
540
+ ```
541
+
542
+ **Пояснение:**
543
+
544
+ * Каждый базовый классификатор делает предсказания
545
+ * Meta-модель (например, LogisticRegression) обучается на этих предсказаниях
546
+
547
+ ---
548
+
549
+ ## 6. Feature Importance
550
+
551
+ **Для деревьев и бустингов:**
552
+
553
+ ```python
554
+ import matplotlib.pyplot as plt
555
+
556
+ model = LGBMClassifier(n_estimators=500)
557
+ model.fit(X_train, y_train)
558
+
559
+ feat_importances = pd.Series(model.feature_importances_, index=X.columns)
560
+ feat_importances.nlargest(20).plot(kind='barh')
561
+ plt.show()
562
+ ```
563
+
564
+ **Пояснение:**
565
+
566
+ * Позволяет увидеть, какие признаки влияют на модель
567
+ * Можно отбирать топовые фичи для уменьшения размерности
568
+
569
+ ---
570
+
571
+ ## 7. Randomized Search / Grid Search (Подбор гиперпараметров)
572
+
573
+ ```python
574
+ from sklearn.model_selection import RandomizedSearchCV
575
+
576
+ param_grid = {
577
+ 'n_estimators': [100, 300, 500],
578
+ 'max_depth': [3, 5, 7],
579
+ 'learning_rate': [0.01, 0.05, 0.1]
580
+ }
581
+
582
+ rs = RandomizedSearchCV(LGBMClassifier(), param_grid, cv=3, scoring='accuracy', n_iter=5)
583
+ rs.fit(X_train, y_train)
584
+ rs.best_params_
585
+ ```
586
+
587
+ **Пояснение:**
588
+
589
+ * Автоматически ищет лучшие гиперпараметры
590
+ * `n_iter` контролирует количество проб
591
+
592
+ ---
593
+
594
+ ## 8. Пример пайплайна с K-Fold и несколькими моделями
595
+
596
+ ```python
597
+ from sklearn.model_selection import KFold
598
+ import numpy as np
599
+
600
+ kf = KFold(n_splits=5, shuffle=True, random_state=42)
601
+ oof_preds = np.zeros(len(X))
602
+ models = []
603
+
604
+ for train_idx, val_idx in kf.split(X):
605
+ X_tr, X_val = X[train_idx], X[val_idx]
606
+ y_tr, y_val = y[train_idx], y[val_idx]
607
+
608
+ model = CatBoostClassifier(iterations=1000, learning_rate=0.05, depth=6, verbose=0)
609
+ model.fit(X_tr, y_tr, eval_set=[(X_val, y_val)], early_stopping_rounds=50)
610
+
611
+ oof_preds[val_idx] = model.predict(X_val)
612
+ models.append(model)
613
+
614
+ accuracy_score(y, oof_preds)
615
+ """
616
+
617
+ import numpy as np
618
+
619
+ # Пример: n моделей
620
+ preds_list = [pred1, pred2, pred3] # список массивов предсказаний
621
+ weights = np.array([2.0, 1.0, 3.0]) # твои исходные коэффициенты
622
+
623
+ # Нормализуем коэффициенты
624
+ weights = weights / weights.sum()
625
+
626
+ # Усредняем предсказания
627
+ final_pred = np.zeros_like(preds_list[0], dtype=float)
628
+
629
+ for pred, w in zip(preds_list, weights):
630
+ final_pred += pred * w
nlp_general.py ADDED
@@ -0,0 +1,587 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ # -*- coding: utf-8 -*-
2
+ """NLP_GENERAL.ipynb
3
+
4
+ Automatically generated by Colab.
5
+
6
+ Original file is located at
7
+ https://colab.research.google.com/drive/1g7CiQ8eJjVdDnZMoBWSOD01rHMVuQdC3
8
+
9
+ # Классификация
10
+
11
+ ## Библиотеки и зависимости
12
+ """
13
+
14
+ !pip install pymorphy2
15
+ !pip install ufal.udpipe
16
+ !pip install wget
17
+ !pip install gensim
18
+ !pip install umap-learn
19
+ !pip install datashader
20
+ !pip install bokeh
21
+ !pip install holoviews
22
+ !pip install yargy
23
+
24
+ # Commented out IPython magic to ensure Python compatibility.
25
+ import pandas as pd # Для работы с датасетами
26
+ import seaborn as sns # Для визуализации
27
+ import pymorphy2 as mph # Для лемметизации текста
28
+ import re # Регулярные выражения
29
+ import wget # Для загрузки файлов
30
+ import sys # Для испольнения системных команд
31
+ from gensim.models import Word2Vec as w2v # Для использования Word2vec
32
+ import logging # Для введения логов
33
+ import string
34
+ import nltk
35
+ from nltk import word_tokenize # Для разбиения на токены
36
+ from nltk.corpus import stopwords # Для удаления стоп-слов
37
+ import random # Для перемещивания данных
38
+ import json # Для сохранения массива
39
+ import numpy as np # Для линала
40
+ import umap # Для преобразования векторов из многомерного пространство в двухмерное
41
+ import matplotlib.pyplot as plt # Для графиков
42
+ # %matplotlib inline
43
+
44
+
45
+ from yargy import Parser, rule, and_, or_ # Парсер
46
+ from yargy.interpretation import fact, attribute # Парсер
47
+ from yargy.predicates import normalized, dictionary # Парсер
48
+ from yargy.pipelines import morph_pipeline # Парсер
49
+ from yargy.relations import main # Парсер
50
+ from IPython.display import display # Парсер
51
+ import spacy # Парсер
52
+
53
+ nltk.download('punkt')
54
+ nltk.download('stopwords')
55
+ sw = stopwords.words('russian')
56
+
57
+ """## Предобработка
58
+
59
+ ## 1. Предобработка текста
60
+
61
+
62
+ * 1. ([Kaggle](https://www.kaggle.com/code/sudalairajkumar/getting-started-with-text-preprocessing)).
63
+ * 2. (https://www.kaggle.com/code/abdmental01/text-preprocessing-nlp-steps-to-process-text)).
64
+ * 3. (https://neptune.ai/blog/text-classification-tips-and-tricks-kaggle-competitions)
65
+
66
+ Лемматизация
67
+
68
+
69
+ ---
70
+ """
71
+
72
+ patterns = "[A-Za-z0-9!#$%&'()*+/:;<=>?@[\]^_`{|}~—\"]+"
73
+ morph = mph.MorphAnalyzer()
74
+
75
+ def lemmatize(doc):
76
+ doc = re.sub(patterns, ' ', doc)
77
+ tokens = []
78
+ for token in doc.split():
79
+ if token:
80
+ token = token.strip()
81
+ token = morph.normal_forms(token)[0]
82
+ tokens.append(token)
83
+ return ' '.join(tokens)
84
+
85
+ """Наташа
86
+
87
+
88
+ ---
89
+
90
+
91
+ """
92
+
93
+ topic_name = []
94
+ topic_one_to_one = []
95
+ Case = fact('Case', ['name'])
96
+
97
+ def make_topic(topic: list, name: str):
98
+ global topic_name
99
+
100
+ topic_name.append(morph_pipeline(topic).interpretation(
101
+ Case.name.const(name)
102
+ ).interpretation(
103
+ Case
104
+ )
105
+ )
106
+
107
+ def make_topic_one_to_one(topic: list):
108
+ global topic_name
109
+
110
+ return morph_pipeline(topic).interpretation(
111
+ Case.name.normalized()
112
+ ).interpretation(
113
+ Case
114
+ )
115
+
116
+ top_topic = [
117
+ (["окружность", "угол"], 'Геометрия'),
118
+
119
+ (["деление", "множители"], 'Многочлен'),
120
+
121
+ (["клетка", "закрасить"], 'Дирихле'),
122
+
123
+ (["делится", "оканчивается"], 'Теория чисел'),
124
+
125
+ (["способ", "разделить"], 'Комбинаторика'),
126
+
127
+ (["последовательность", "разрешаться"], 'Инвариант'),
128
+
129
+ (["сумма", "каждый", ], 'Оценка+Пример'),
130
+
131
+ (['город', "ребро",], 'Графы')
132
+ ]
133
+
134
+ for name_complaint in top_topic:
135
+ make_topic(name_complaint[0], name_complaint[1])
136
+ topic_one_to_one.extend(list(name_complaint[0]))
137
+ for columns in list(name_complaint[0]):
138
+ data[columns] = np.NaN
139
+
140
+ OTHERS = make_topic_one_to_one(topic_one_to_one)
141
+
142
+ ALL = or_(*topic_name).interpretation(Case)
143
+ OTHERS_ALL = or_(OTHERS).interpretation(Case)
144
+
145
+ # Commented out IPython magic to ensure Python compatibility.
146
+ #
147
+ # %%time
148
+ # parser = Parser(OTHERS_ALL)
149
+ # for ind, elem in enumerate(data['task']):
150
+ # for match in parser.findall(str(elem)):
151
+ # data.loc[ind, match.fact.name] = 1
152
+ #
153
+ # parser = Parser(ALL)
154
+ # for ind, elem in enumerate(data['task']):
155
+ # for match in parser.findall(str(elem)):
156
+ # data.loc[ind, match.fact.name] = 1
157
+
158
+ """Стоп слова"""
159
+
160
+ # Commented out IPython magic to ensure Python compatibility.
161
+ # Удаляем стоп-слова
162
+ def remove_stopwords(lines, sw=sw):
163
+ res = []
164
+ for line in lines:
165
+ original = line
166
+ line = [w for w in line if w not in sw]
167
+ if len(line) < 1:
168
+ line = original
169
+ res.append(line)
170
+ return res
171
+
172
+ # %time filtered_lines = remove_stopwords(lines=lines, sw=sw)
173
+
174
+ """Word2Vec"""
175
+
176
+ # Commented out IPython magic to ensure Python compatibility.
177
+ # Перемещиваем список
178
+ random.shuffle(filtered_lines)
179
+ # Обучаем word2vec
180
+ # %time model = w2v(filtered_lines, min_count=3, sg=1, window=7)
181
+
182
+ # Сохраняем модель
183
+ model.save("word2vec.model")
184
+
185
+ # Загружаем модель
186
+ model = w2v.load("/content/drive/MyDrive/Проекты/Medsi/Models/word2vec.model")
187
+
188
+ # Производим леммитизацию колокни
189
+ merge_data_filter_2.illness_hostory = merge_data_filter_2.illness_hostory.apply(lemmatize)
190
+
191
+ # Векторизируем
192
+ for i in range(100):
193
+ merge_data_filter_2[f'vector_{i}'] = 0
194
+
195
+ for j, text in enumerate(merge_data_filter_2['illness_hostory']):
196
+ vec = np.zeros(100)
197
+ lens = 0
198
+ for word in word_tokenize(text):
199
+ try:
200
+ vec += model.wv[word]
201
+ lens += 1
202
+ except KeyError:
203
+ continue
204
+
205
+ vec /= lens
206
+ for i in range(100):
207
+ merge_data_filter_2.iloc[j, 103+i] = vec[i]
208
+
209
+ """Umap"""
210
+
211
+ import umap.plot
212
+
213
+ mapper = umap.UMAP(densmap=True).fit(X)
214
+ umap.plot.points(mapper)
215
+
216
+ """Фильтрация пунктуации"""
217
+
218
+ def remove_punctuation(text):
219
+ translator = str.maketrans('', '', string.punctuation)
220
+ return text.translate(translator)
221
+
222
+ """Облако слов"""
223
+
224
+ from wordcloud import WordCloud
225
+
226
+ for topic in data.topic.unique():
227
+ df = data[data.topic == topic]
228
+ text = ' '.join(df['new_task'])
229
+ text_tokens = word_tokenize(text)
230
+
231
+ cloud = WordCloud(stopwords=stop_words,
232
+ background_color='white').generate(' '.join(text_tokens))
233
+ plt.imshow(cloud)
234
+ plt.axis('off')
235
+ plt.title(topic)
236
+ plt.show()
237
+
238
+ """N-граммы"""
239
+
240
+ k = 30
241
+ n = 2
242
+ for topic in data.topic.unique():
243
+ df = data[data.topic == topic]
244
+ words = ' '.join(df.new_task_pros)
245
+ words = ' '.join(list(filter(lambda x: len(x) >= 2, (words.split()))))
246
+ tokens = nltk.word_tokenize(words)
247
+
248
+ ngrams_list = list(ngrams(tokens, n))
249
+ freq_dist = dict(FreqDist(ngrams_list))
250
+ sorted_data = sorted(freq_dist.items(), key=lambda x: -x[1])
251
+
252
+ y_labels = [str(key) for key, _ in sorted_data][:k][::-1]
253
+ x_values = [value for _, value in sorted_data][:k][::-1]
254
+
255
+ plt.barh(y_labels, x_values)
256
+ plt.xlabel('Значение')
257
+ plt.ylabel('Кортежи')
258
+ plt.title(topic)
259
+ plt.show()
260
+
261
+ """TF-IDF"""
262
+
263
+ def vect_tfidf(text):
264
+ return vectorizer.transform([text]).toarray()
265
+
266
+ vectorizer = TfidfVectorizer(max_features=5000, min_df=3)
267
+ X = vectorizer.fit_transform(learn_tf_idf)
268
+
269
+ """Tenserflow token"""
270
+
271
+ vocab_size = 20000
272
+ trunc_type = 'post'
273
+ padding_type = 'post'
274
+ embedding_dim = 128
275
+ max_length = 120
276
+ oov_tok = ''
277
+
278
+ text = data['new_task']
279
+ labels = data['y']
280
+ tokenizer = Tokenizer(
281
+ num_words=vocab_size,
282
+ filters='!"#$%&()*+,-./:;<=>?@[\]^_`{|}~\t\n',
283
+ lower=True,
284
+ oov_token=oov_tok
285
+ )
286
+
287
+ tokenizer.fit_on_texts(text)
288
+ train_sequences = tokenizer.texts_to_sequences(text)
289
+ train_padded = pad_sequences(
290
+ train_sequences,
291
+ maxlen=max_length,
292
+ padding=padding_type,
293
+ truncating=trunc_type
294
+ )
295
+
296
+
297
+
298
+
299
+ train_sequences = tokenizer.texts_to_sequences(data.new_task)
300
+ train_padded = pad_sequences(train_sequences, maxlen=max_length, padding=padding_type, truncating=trunc_type)
301
+
302
+
303
+ for i in tqdm(range(max_length)):
304
+ data[f"Tokens f.{i + 1}"] = train_padded[:, i]
305
+
306
+ """## Finetune Bert"""
307
+
308
+ !pip install transformers
309
+ !pip install accelerate -U
310
+
311
+ import torch
312
+ import pandas as pd
313
+ from transformers import AutoModelForSequenceClassification
314
+ from transformers import BertTokenizerFast
315
+ from transformers import TrainingArguments
316
+ import torch, os
317
+ import pandas as pd
318
+ from transformers import pipeline, BertForSequenceClassification, BertTokenizerFast
319
+ from torch.utils.data import Dataset
320
+
321
+ import os
322
+ import re
323
+ import numpy as np
324
+ import matplotlib.pyplot as plt
325
+ import warnings
326
+ import numpy as np
327
+ import evaluate
328
+
329
+ metric = evaluate.load("f1")
330
+ warnings.filterwarnings('ignore')
331
+
332
+ dataset = dataset[['task', 'topic']]
333
+ dataset.rename(columns={'task': 'text',
334
+ 'topic': 'labels'},
335
+ inplace=True)
336
+ NUM_LABELS = len(dataset.labels.unique())
337
+
338
+ id2label = {id: label for id, label in enumerate(dataset.labels.unique())}
339
+
340
+ label2id = {label: id for id, label in enumerate(dataset.labels.unique())}
341
+
342
+
343
+ tokenizer = BertTokenizerFast.from_pretrained('blanchefort/rubert-base-cased-sentiment')
344
+ model = BertForSequenceClassification.from_pretrained('blanchefort/rubert-base-cased-sentiment',
345
+ num_labels=NUM_LABELS, id2label=id2label,
346
+ label2id=label2id,
347
+ ignore_mismatched_sizes=True)
348
+
349
+ train_encodings = tokenizer(list(X_train), truncation=True, padding=True)
350
+ val_encodings = tokenizer(list(X_val), truncation=True, padding=True)
351
+ test_encodings = tokenizer(list(X_test), truncation=True, padding=True)
352
+
353
+ class DataLoader(Dataset):
354
+ def __init__(self, encodings, labels):
355
+ self.encodings = encodings
356
+ self.labels = labels
357
+
358
+ def __getitem__(self, idx):
359
+ # Retrieve tokenized data for the given index
360
+ item = {key: torch.tensor(val[idx]) for key, val in self.encodings.items()}
361
+ # Add the label for the given index to the item dictionary
362
+ item['labels'] = torch.tensor(self.labels[idx])
363
+ return item
364
+
365
+ def __len__(self):
366
+ return len(self.labels)
367
+
368
+ train_dataloader = DataLoader(train_encodings, list(y_train))
369
+ val_dataloader = DataLoader(val_encodings, list(y_val))
370
+ test_dataset = DataLoader(test_encodings, list(y_test))
371
+
372
+ trainer = Trainer(
373
+ model=model,
374
+ args=training_args,
375
+ train_dataset=train_dataloader,
376
+ eval_dataset=val_dataloader,
377
+ compute_metrics=compute_metrics
378
+ )
379
+
380
+
381
+ trainer.train()
382
+
383
+ def predict(text):
384
+ inputs = tokenizer(text, padding=True, truncation=True, max_length=512, return_tensors="pt").to("cuda")
385
+
386
+ outputs = model(**inputs)
387
+
388
+ probs = outputs[0].softmax(1)
389
+ pred_label_idx = probs.argmax()
390
+ pred_label = model.config.id2label[pred_label_idx.item()]
391
+
392
+ return probs, pred_label_idx, pred_label
393
+
394
+
395
+ text = input()
396
+ predict(text)
397
+
398
+ """## Text Classification: All Tips and Tricks from 5 Kaggle Competitions,
399
+
400
+ 1. Оптимизация памяти при работе с большими датасетами
401
+
402
+ Использование Dask для чтения и обработки данных: https://dask.org/
403
+
404
+ Использование cuDF для ускоренной обработки данных на GPU: https://docs.rapids.ai/api/cudf/stable/
405
+
406
+ Конвертация данных в формат Parquet: https://parquet.apache.org/
407
+
408
+ Конвертация данных в формат Feather: https://arrow.apache.org/docs/python/feather.html
409
+
410
+ 2. Методы увеличения данных (Data Augmentation)
411
+
412
+ Замена слов синонимами для увеличения данных: https://towardsdatascience.com/data-augmentation-in-nlp-2801a34dfc28
413
+
414
+ Добавление шума в тексты для обучения RNN: https://arxiv.org/abs/1703.02573
415
+
416
+ Перевод текста на другие языки и обратно для создания новых примеров: https://arxiv.org/abs/1511.06709
417
+
418
+ 3. Исследование данных и получение инсайтов
419
+
420
+ Простая разведывательная аналитика (EDA) для твитов: https://www.kaggle.com/code/ashishpatel26/simple-eda-for-tweets
421
+
422
+ EDA для данных Quora: https://www.kaggle.com/code/sudalairajkumar/simple-eda-for-quora-question-pairs
423
+
424
+ Полный EDA для данных Stack Exchange: https://www.kaggle.com/code/ashishpatel26/complete-eda-with-stack-exchange-data
425
+
426
+ Предыдущая статья автора о EDA для обработки естественного языка: https://neptune.ai/blog/exploratory-data-analysis-nlp
427
+
428
+ 4. Очистка данных
429
+
430
+ Использование TextBlob для исправления орфографических ошибок: https://textblob.readthedocs.io/en/dev/
431
+
432
+ Предобработка для GloVe (часть 1): https://www.kaggle.com/code/ashishpatel26/preprocessing-for-glove-part-1
433
+
434
+ Предобработка для GloVe (часть 2): https://www.kaggle.com/code/ashishpatel26/preprocessing-for-glove-part-2
435
+
436
+ 5. Представление текста
437
+
438
+ Комбинирование предварительно обученных векторов для лучшего представления текста и уменьшения количества неизвестных слов: https://www.kaggle.com/code/ashishpatel26/combining-pre-trained-vectors
439
+
440
+ Использование Universal Sentence Encoder для генерации признаков на уровне предложений: https://tfhub.dev/google/universal-sentence-encoder/4
441
+
442
+ Три метода комбинирования эмбеддингов: https://www.kaggle.com/code/ashishpatel26/3-methods-to-combine-embeddings
443
+
444
+ 6. Архитектура модели
445
+
446
+ Стекирование двух слоев LSTM/GRU для улучшения производительности: https://www.kaggle.com/code/ashishpatel26/stacking-2-layers-of-lstm-gru-networks
447
+
448
+ 7. Функции потерь
449
+
450
+ Использование фокальной функции потерь для несбалансированных данных: https://arxiv.org/abs/1708.02002
451
+
452
+ Пользовательская функция потерь "mimic loss", использованная в соревновании Jigsaw: https://www.kaggle.com/code/ashishpatel26/custom-mimic-loss-jigsaw
453
+
454
+ Пользовательская функция потерь MTL, использованная в соревновании Jigsaw: https://www.kaggle.com/code/ashishpatel26/mtl-custom-loss-jigsaw
455
+
456
+ 8. Оптимизаторы
457
+
458
+ Использование Adam с прогревом (warmup): https://www.kaggle.com/code/ashishpatel26/adam-with-warmup
459
+
460
+ Использование BertAdam для моделей на основе BERT: https://www.kaggle.com/code/ashishpatel26/bert-adam
461
+
462
+ Использование Rectified Adam для стабилизации обучения и ускорения сходимости: https://arxiv.org/abs/1908.03265
463
+
464
+ 9. Методы обратного вызова (Callbacks)
465
+
466
+ Контрольная точка модели для мониторинга и сохранения весов: https://www.kaggle.com/code/ashishpatel26/model-checkpoint
467
+
468
+ Планировщик скорости обучения для изменения скорости обучения на основе производительности модели: https://www.kaggle.com/code/ashishpatel26/learning-rate-scheduler
469
+
470
+ Простые пользовательские обратные вызовы с использованием lambda-функций: https://www.kaggle.com/code/ashishpatel26/simple-custom-callbacks
471
+
472
+ Пользовательская контрольная точка: https://www.kaggle.com/code/ashishpatel26/custom-checkpointing
473
+
474
+ Создание собственных обратных вызовов для различных случаев использования: https://www.kaggle.com/code/ashishpatel26/building-custom-callbacks
475
+
476
+ Уменьшение на плато для снижения скорости обучения, когда метрика перестает улучшаться: https://www.kaggle.com/code/ashishpatel26/reduce-on-plateau
477
+
478
+ Раннее прекращение обучения при отсутствии улучшений: https://www.kaggle.com/code/ashishpatel26/early-stopping
479
+
480
+ Снимок ансамблирования для получения различных контрольных точек модели в одном обучении: https://www.kaggle.com/code/ashishpatel26/snapshot-ensembling
481
+
482
+ Быстрое геометрическое ансамблирование: https://www.kaggle.com/code/ashishpatel26/fast-geometric-ensembling
483
+
484
+ Стохастическое усреднение весов (SWA): https://www.kaggle.com/code/ashishpatel26/stochastic-weight-averaging
485
+
486
+ Динамическое уменьшение скорости обучения: https://www.kaggle.com/code/ashishpatel26/dynamic-learning-rate-decay
487
+
488
+ 10. Оценка и кросс-валидация
489
+
490
+ K-кратная кросс-валидация: https://scikit-learn.org/stable/modules/generated/sklearn.model_selection.KFold.html
491
+
492
+ Стратифицированная K-кратная кросс-валидация: https://scikit-learn.org/stable/modules/generated/sklearn.model_selection.StratifiedKFold.html
493
+
494
+ Групповая K-кратная кросс-валидация: https://scikit-learn.org/stable/modules/generated/sklearn.model_selection.GroupKFold.html
495
+
496
+ Адвенсариальная валидация для проверки сходства распределений обучающего и тестового наборов: https://www.kaggle.com/code/ashishpatel26/adversarial-validation
497
+
498
+ Анализ различных стратегий кросс-валидации: https://www.kaggle.com/code/ashishpatel26/cv-analysis-different-strategies
499
+
500
+ 11. Трюки для ускорения выполнения
501
+
502
+ Сортировка последовательностей по длине для экономии времени выполнения и улучшения производительности: https://www.kaggle.com/code/ashishpatel26/sequence-bucketing
503
+
504
+ Использование только начала и конца предложений, если длина превышает 512 токенов: https://www.kaggle.com/code/ashishpatel26/head-tail-trick
505
+
506
+ Эффективное использование GPU: https://www.kaggle.com/code/ashishpatel26/use-gpu-efficiently
507
+
508
+ Очистка памяти Keras: https://www.kaggle.com/code/ashishpatel26/free-keras-memory
509
+
510
+ Сохранение и загрузка моделей для экономии времени и памяти: https://www.kaggle.com/code/ashishpatel26/save-load-models
511
+
512
+ Не сохранять эмбеддинги в решениях на основе RNN: https://www.kaggle.com/code/ashishpatel26/dont-save-embedding-rnn
513
+
514
+ Загрузка векторов word2vec без ключевых векторов: https://www.kaggle.com/code/ashishpatel26/load-word2vec-without-key-vectors
515
+
516
+ 12. Ансамблирование моделей
517
+
518
+ Взвешенное среднее ансамблирование: https://www.kaggle.com/code/ashishpatel26/weighted-average-ensemble
519
+
520
+ Стекированное обобщение (stacked generalization) ансамблирование: https://www.kaggle.com/code/ashishpatel26/stacked-generalization-ensemble
521
+
522
+ Предсказания вне обучающего набора (out-of-fold predictions): https://www.kaggle.com/code/ashishpatel26/out-of-fold-predictions
523
+
524
+ Смешивание с линейной регрессией: https://www.kaggle.com/code/ashishpatel26/blending-linear-regression
525
+
526
+ Использование Optuna для определения весов смешивания: https://optuna.org/
527
+
528
+ Среднее по степени (power average) ансамблирование: https://www.kaggle.com/code/ashishpatel26/power-average-ensemble
529
+
530
+ Стратегия смешивания с использованием степени 3.5: https://www.kaggle.com/code/ashishpatel26/power-3-5-blending-strategy
531
+
532
+ # Генерация
533
+
534
+ 📌 Когда использовать что
535
+
536
+ | Сценарий | Подход |
537
+ | ---------------------------------------------------- | ---------------------------------------------- |
538
+ | Маленькие датасеты, учебные задачи | RNN / LSTM |
539
+ | Длинные последовательности, умеренные ресурсы | LSTM (для стабильности) или GRU (для скорости) |
540
+ | Требуется копирование или внимание к части входа | RNN + Attention |
541
+ | Лучшее качество, много данных и ресурсов | Полное дообучение трансформеров |
542
+ | Большая модель, но мало памяти (например, 16 ГБ GPU) | LoRA / QLoRA |
543
+ | Несколько задач на одной базе | Adapters или Prefix Tuning |
544
+ | Небольшой датасет, few-shot или zero-shot | Prompt Tuning / Soft Prompts |
545
+
546
+ https://www.kaggle.com/code/purvasingh/text-generation-via-rnn-and-lstms-pytorch
547
+
548
+ https://www.kaggle.com/code/neerajmohan/finetuning-large-language-models-using-qlora
549
+
550
+ https://www.kaggle.com/code/thebrownviking20/intro-to-recurrent-neural-networks-lstm-gru?utm_source=chatgpt.com
551
+ """
552
+
553
+ from transformers import BertTokenizerFast, BertForSequenceClassification, Trainer, TrainingArguments
554
+ from torch.utils.data import Dataset
555
+ import torch
556
+ import evaluate
557
+ import warnings
558
+
559
+ # ... (previous code) ...
560
+
561
+
562
+ # Training arguments
563
+ training_args = TrainingArguments(
564
+ output_dir="./results", # output directory
565
+ num_train_epochs=3, # total number of training epochs
566
+ per_device_train_batch_size=8, # batch size per device during training
567
+ per_device_eval_batch_size=64, # batch size for evaluation
568
+ warmup_steps=500, # number of warmup steps for learning rate scheduler
569
+ weight_decay=0.01, # strength of weight decay
570
+ logging_dir='./logs', # directory for storing logs
571
+ logging_steps=10,
572
+ evaluation_strategy="steps",
573
+ eval_steps=500,
574
+ save_steps=500,
575
+ save_total_limit=2
576
+ )
577
+
578
+
579
+ def compute_metrics(pred):
580
+ labels = pred.label_ids
581
+ preds = pred.predictions.argmax(-1)
582
+ f1 = metric.compute(predictions=preds, references=labels, average="weighted")
583
+ return {
584
+ 'f1': f1["f1"],
585
+ }
586
+
587
+ # ... (rest of the code) ...
quic_start.py ADDED
@@ -0,0 +1,251 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ # -*- coding: utf-8 -*-
2
+ """quic_start.ipynb
3
+
4
+ Automatically generated by Colab.
5
+
6
+ Original file is located at
7
+ https://colab.research.google.com/drive/1fJ_-FvN0auPakPWWqX6j6_H6i4k5OCY_
8
+ """
9
+
10
+ import os
11
+ os.environ["CUDA_VISIBLE_DEVICES"] = '3'
12
+
13
+ """# Установка и импорт"""
14
+
15
+ !python3.10 -m pip install transformers datasets accelerate peft bitsandbytes sentencepiece --quiet
16
+
17
+ import json
18
+ import os
19
+ from datasets import Dataset, load_from_disk
20
+ from transformers import (
21
+ AutoTokenizer,
22
+ AutoModelForCausalLM,
23
+ DataCollatorForLanguageModeling,
24
+ TrainingArguments,
25
+ Trainer
26
+ )
27
+ from peft import LoraConfig, get_peft_model, PeftModel
28
+ import torch
29
+
30
+ print("Torch version:", torch.__version__)
31
+ print("Cuda available:", torch.cuda.is_available())
32
+
33
+ # import json
34
+
35
+ # data = [
36
+ # {"prompt": "Вопрос", "response": "Ответ"},
37
+ # {"prompt": "Что такое LLM?", "response": "LLM — это ..."},
38
+ # ]
39
+
40
+ # output_path = "data/train.jsonl"
41
+
42
+ # with open(output_path, "w", encoding="utf-8") as f:
43
+ # for item in data:
44
+ # f.write(json.dumps(item, ensure_ascii=False) + "\n")
45
+
46
+ """# Загрузка данных"""
47
+
48
+ train_path = "train.jsonl"
49
+ val_path = None # "data/val.jsonl" # можно оставить None
50
+
51
+ def load_jsonl(path):
52
+ records = []
53
+ with open(path, "r", encoding="utf-8") as f:
54
+ for line in f:
55
+ try:
56
+ records.append(json.loads(line))
57
+ except:
58
+ pass
59
+ return records
60
+
61
+ train_data_raw = load_jsonl(train_path)
62
+ # val_data_raw = load_jsonl(val_path) if os.path.exists(val_path) else None
63
+
64
+ len(train_data_raw), train_data_raw[:2]
65
+
66
+ """# Создание датасета и токенизация
67
+
68
+ | Модель | HF имя для загрузки | Параметры | Лицензия | Сильные стороны | Слабые стороны | Языки |
69
+ | -------------------------- | ------------------------------------------ | --------- | ---------- | ------------------------------------------------------- | -------------------------------- | ------------------ |
70
+ | **Mistral-7B-Instruct** | `mistralai/Mistral-7B-Instruct` | 7.3B | Apache 2.0 | Отличное качество, быстрый inference, сильный reasoning | multilingual средний | EN + базовый multi |
71
+ | **Mistral-7B** | `mistralai/Mistral-7B-v0.1` | 7.3B | Apache 2.0 | Хороший pretrain baseline | хуже чем instruct в диалогах | EN |
72
+ | **Mixtral 8x7B Instruct** | `mistralai/Mixtral-8x7B-Instruct-v0.1` | MoE | Apache 2.0 | Very strong reasoning/code | сложнее деплой | EN + multi |
73
+ | **LLaMA-2-7B-Chat** | `meta-llama/Llama-2-7b-chat-hf` | 7B | Custom | Баланс качества и удобства | уступает Mistral | EN |
74
+ | **LLaMA-2-7B** | `meta-llama/Llama-2-7b-hf` | 7B | Custom | Хороший pretrain | слабый диалог без tuning | EN |
75
+ | **Falcon-7B-Instruct** | `tiiuae/falcon-7b-instruct` | 7B | Apache 2.0 | Сильный английский диалог | хуже reasoning чем mistral | EN |
76
+ | **Falcon-7B** | `tiiuae/falcon-7b` | 7B | Apache 2.0 | Хороший генератор | хуже чем instruct | EN |
77
+ | **MPT-7B-Instruct** | `mosaicml/mpt-7b-instruct` | 7B | Apache 2.0 | оптимизация для продакшн | уступает mistral | EN |
78
+ | **MPT-7B** | `mosaicml/mpt-7b` | 7B | Apache 2.0 | хорошая скорость | average качество | EN |
79
+ | **Baichuan2-7B-Chat** | `baichuan-inc/Baichuan2-7B-Chat` | 7B | Permissive | сильный CN+EN, диалог | ниже на EN reasoning | CN, EN |
80
+ | **Baichuan2-7B-Base** | `baichuan-inc/Baichuan2-7B-Base` | 7B | Permissive | большой CN корпус | EN слабее | CN, EN |
81
+ | **Qwen-7B-Chat** | `Qwen/Qwen-7B-Chat` | 7B | Apache 2.0 | сильный CN/EN, мощный чат | нужно выбирать правильную версию | CN, EN |
82
+ | **Qwen-7B** | `Qwen/Qwen-7B` | 7B | Apache 2.0 | хорошая кодовая модель | требует tuning для диалогов | CN, EN |
83
+ | **InternLM-7B-Chat** | `internlm/internlm-chat-7b` | 7B | Permissive | сильный CN-диалог | EN средний | CN, EN |
84
+ | **InternLM-7B** | `internlm/internlm-7b` | 7B | Permissive | базовая CN модель | слабее чем chat | CN |
85
+ | **Pythia-6.9B** | `EleutherAI/pythia-6.9b` | 6.9B | Apache 2.0 | отлично для research | не optimized для диалога | EN |
86
+ | **StableLM-3B-Instruct** | `stabilityai/stablelm-3b-4e1t-instruct` | 3B | Apache 2.0 | лёгкая, быстрая | меньшее качество | EN |
87
+ | **StableLM-Base-Alpha 3B** | `stabilityai/stablelm-base-alpha-3b` | 3B | Apache 2.0 | маленькая, удобна для LoRA | слабее instruct | EN |
88
+ | **StableCode 3B** | `stabilityai/stablecode-instruct-alpha-3b` | 3B | Apache 2.0 | хороша для code | не для general dialogue | EN |
89
+
90
+ ---
91
+
92
+ ```python
93
+ import pandas as pd
94
+ df = pd.read_csv("models.csv")
95
+
96
+ def load_model_by_name(name, load_4bit=True):
97
+ row = df[df['name'] == name].iloc[0]
98
+ MODEL = row['hf_name']
99
+ print("Loading:", MODEL)
100
+ tokenizer = AutoTokenizer.from_pretrained(MODEL, use_fast=True, trust_remote_code=True)
101
+
102
+ if load_4bit:
103
+ model = AutoModelForCausalLM.from_pretrained(
104
+ MODEL,
105
+ device_map="auto",
106
+ load_in_4bit=True,
107
+ trust_remote_code=True
108
+ )
109
+ else:
110
+ model = AutoModelForCausalLM.from_pretrained(
111
+ MODEL,
112
+ device_map="auto",
113
+ torch_dtype=torch.float16,
114
+ trust_remote_code=True
115
+ )
116
+ return tokenizer, model
117
+ ```
118
+ """
119
+
120
+ MODEL = "Qwen/Qwen2.5-0.5B"
121
+ MAX_LEN = 1024
122
+ SEP = "\n\n### Ответ:\n\n"
123
+
124
+ tokenizer = AutoTokenizer.from_pretrained(MODEL, use_fast=True)
125
+
126
+ if tokenizer.pad_token is None:
127
+ tokenizer.add_special_tokens({"pad_token": "<|pad|>"})
128
+
129
+ def make_dataset(records):
130
+ texts = [r["prompt"] + SEP + r["response"] for r in records]
131
+ ds = Dataset.from_dict({"text": texts})
132
+
133
+ def tokenize(batch):
134
+ out = tokenizer(
135
+ batch["text"],
136
+ truncation=True,
137
+ padding="max_length",
138
+ max_length=MAX_LEN
139
+ )
140
+ out["labels"] = out["input_ids"].copy()
141
+ return out
142
+
143
+ ds = ds.map(tokenize, batched=True, remove_columns=["text"])
144
+ return ds
145
+
146
+ train_ds = make_dataset(train_data_raw)
147
+ val_ds = None # make_dataset(val_data_raw) if val_data_raw else None
148
+
149
+ train_ds
150
+
151
+ """# Загрузка модели и настройка LoRA"""
152
+
153
+ USE_8BIT = False # если есть большая модель — True
154
+
155
+ print("Загружаем модель...")
156
+
157
+ if USE_8BIT:
158
+ model = AutoModelForCausalLM.from_pretrained(
159
+ MODEL,
160
+ load_in_8bit=True,
161
+ device_map="auto",
162
+ torch_dtype=torch.float16,
163
+ )
164
+ else:
165
+ model = AutoModelForCausalLM.from_pretrained(MODEL)
166
+
167
+ model.resize_token_embeddings(len(tokenizer))
168
+
169
+ lora_config = LoraConfig(
170
+ r=8,
171
+ lora_alpha=32,
172
+ target_modules=["q_proj", "k_proj", "v_proj", "o_proj"], # GPT2 → linear layers
173
+ lora_dropout=0.05,
174
+ bias="none",
175
+ task_type="CAUSAL_LM",
176
+ )
177
+
178
+ model = get_peft_model(model, lora_config)
179
+
180
+ print("LoRA слои установлены.")
181
+
182
+ OUTPUT_DIR = "outputs/qwen_lora"
183
+
184
+ data_collator = DataCollatorForLanguageModeling(tokenizer, mlm=False)
185
+
186
+ training_args = TrainingArguments(
187
+ output_dir=OUTPUT_DIR,
188
+ per_device_train_batch_size=2,
189
+ per_device_eval_batch_size=2,
190
+ gradient_accumulation_steps=8,
191
+ num_train_epochs=2,
192
+ learning_rate=2e-4,
193
+ warmup_ratio=0.03,
194
+ logging_steps=25,
195
+ save_steps=500,
196
+ evaluation_strategy="steps" if val_ds else "no",
197
+ eval_steps=500 if val_ds else None,
198
+ fp16=True,
199
+ save_total_limit=2,
200
+ gradient_checkpointing=True,
201
+ report_to="none",
202
+ )
203
+ trainer = Trainer(
204
+ model=model,
205
+ args=training_args,
206
+ train_dataset=train_ds,
207
+ eval_dataset=val_ds,
208
+ data_collator=data_collator,
209
+ )
210
+
211
+ trainer
212
+
213
+ trainer.train()
214
+ model.save_pretrained(OUTPUT_DIR + "/peft_lora")
215
+ print("LoRA веса сохранены.")
216
+
217
+ def generate(prompt, max_new_tokens=150):
218
+ input_ids = tokenizer(prompt, return_tensors="pt").input_ids.to(model.device)
219
+
220
+ out = model.generate(
221
+ input_ids,
222
+ max_new_tokens=max_new_tokens,
223
+ do_sample=True,
224
+ temperature=0.8,
225
+ top_p=0.95,
226
+ top_k=50,
227
+ repetition_penalty=1.1,
228
+ pad_token_id=tokenizer.pad_token_id,
229
+ eos_token_id=tokenizer.eos_token_id,
230
+ )
231
+ return tokenizer.decode(out[0], skip_special_tokens=True)
232
+
233
+ prompt = "Объясни простыми словами, что такое градиентный спуск."
234
+ print(generate(prompt))
235
+
236
+ """## Перезагрузка модели с LoRA из сохранённого каталога
237
+
238
+ (для отдельного запуска/после рестарта kernel)
239
+ """
240
+
241
+ base_model = AutoModelForCausalLM.from_pretrained(MODEL, torch_dtype=torch.float16, device_map="auto")
242
+ base_tokenizer = AutoTokenizer.from_pretrained(MODEL)
243
+
244
+ peft_model = PeftModel.from_pretrained(base_model, OUTPUT_DIR + "/peft_lora")
245
+
246
+ def infer_lora(prompt):
247
+ input_ids = base_tokenizer(prompt, return_tensors="pt").input_ids.to(peft_model.device)
248
+ out = peft_model.generate(input_ids, max_new_tokens=100, do_sample=True)
249
+ return base_tokenizer.decode(out[0], skip_special_tokens=True)
250
+
251
+ infer_lora("Расскажи, что такое нейронная сеть.")