<jupyter_start><jupyter_text>Семинар № 4. Введение в МО 2.  План* Метрики качества* One-hot-encoding* Kaggle* RandomSearch* feature engeering (Polynomial features)* preprocessing* scaling* create your own classification* blending  Создание собственного классификатора в `sklearn`Чтобы написать собственный классификатор (регрессор), требуется реализовать класс наследующийся от `BaseEstimator` и `ClassifierMixin (RegressorMixin)`.И реализовать необходимые методы `__init__()`, `fit()`, `predict()`, `predict_proba()`<jupyter_code>from sklearn.base import BaseEstimator

class MyClassifier(BaseEstimator):
    """ A simple exaple of classifier """
    def __init__(self, param, other_param):
        self.param = param
        self.other_param = other_param
        
    def fit(self, X, y):
        """ This should fit classifier. All the "work" should be done here """
        <YOUR CORE HERE>
        return self
    
    def predict(self, X, y=None):
        """ Predict target class for X """
        <YOUR CODE HERE>
        return # prediction values for target
    
    def predict_proba(self, X, y=None):
        <YOUR CODE HERE>
        return # probability<jupyter_output><empty_output><jupyter_text>Переобучение<jupyter_code>reg_dtr_over = DTR()
X_test = np.arange(0,10, 0.5)[:,np.newaxis]
plot_reg(X_reg, y_reg, reg_dtr_over, X_test)<jupyter_output><empty_output><jupyter_text>Заметим, что данная функция не сильно похожа на то, что было в реальности ($\mathcal{F} = \sqrt{x}  + sin(x)$) до добавления шума. Это связано с тем, что мы взяли слишком большое пространство решений и выбрали то, которое подходит лучше всего для нашей тестовой выборки, но не факт, что подходит для нас.Давайте упростим модель.<jupyter_code>reg_dtr_under = DTR(max_depth=7, min_samples_leaf=3)
X_test = np.arange(0,10, 0.5)[:,np.newaxis]
plot_reg(X_reg, y_reg, reg_dtr_under, X_test)<jupyter_output><empty_output><jupyter_text>Недообучение<jupyter_code>reg_dtr_under = DTR(max_depth=2)
X_test = np.arange(0,10, 0.5)[:,np.newaxis]
plot_reg(X_reg, y_reg, reg_dtr_under, X_test)<jupyter_output><empty_output><jupyter_text>Если сравним эти 2 модели с реальной функцией $\mathcal{F} = \sqrt{x} + sin(x)$ то получим, что более простая модель по метрике $MAE$ приближает функцию `лучше`.<jupyter_code>reg_dtr_over.fit(X_reg, y_reg)
reg_dtr_under.fit(X_reg, y_reg)
X_test = np.arange(0, 10, 0.1)[:, np.newaxis]
Y_real = vf(X_test)
Y_over = reg_dtr_over.predict(X_test)
Y_under = reg_dtr_under.predict(X_test)
print(np.abs(Y_real - Y_over).sum(), np.abs(Y_real - Y_under).sum())<jupyter_output>11200.38170686884 11175.734949679203
{'fraction_non_alphanumeric': 0.1152373660030628, 'fraction_numerical': 0.02258805513016845, 'mean_word_length': 5.251196172248804, 'pattern_counts': {'":': 0, '<': 23, '<?xml version=': 0, '>': 23, 'https://': 0, 'lorem ipsum': 0, 'www.': 0, 'xml': 0}, 'pii_count': 0, 'substrings_counts': 0, 'word_list_counts': {'cursed_substrings.json': 1, 'profanity_word_list.json': 0, 'sexual_word_list.json': 0, 'zh_pornsignals.json': 0}}
{'chain_length': '5', 'dir': 'jupyter-structured-clean-dedup', 'id': '97272', 'license': 'MIT', 'n_tokens_mistral': 1081, 'n_tokens_neox': 1099, 'n_words': 228, 'path': 'sem04/Sem04.ipynb', 'repo_name': 'DeniskinBeast/mlmathmech', 'size': '2612'}