From f2bc09d4fb3870d3112854b54c5ce5519f481635 Mon Sep 17 00:00:00 2001 From: K Date: Sat, 9 Nov 2024 11:05:06 +0400 Subject: [PATCH] added coments --- lab3/lab3.ipynb | 56 +++++++++++++++++++++++++++++++++++++++++-------- 1 file changed, 47 insertions(+), 9 deletions(-) diff --git a/lab3/lab3.ipynb b/lab3/lab3.ipynb index 949a4786..42d3cd26 100644 --- a/lab3/lab3.ipynb +++ b/lab3/lab3.ipynb @@ -778,7 +778,7 @@ }, { "cell_type": "code", - "execution_count": 7, + "execution_count": null, "metadata": {}, "outputs": [ { @@ -858,7 +858,10 @@ "labels = ['0-2', '2-4', '4-6', '6-8', '8-10', '10-12', '12-14', '14-16', '16+'] # Названия категорий\n", "\n", "# Создание нового столбца 'Close_Disc' на основе дискретизации\n", - "df['Close_Disc'] = pd.cut(df['Close'], bins=bins, labels=labels, include_lowest=True)\n", + "df['Close_Disc'] = pd.cut(df['Close'], bins=bins, labels=labels, include_lowest=True) #pd.cut выполняет дискретизацию переменной\n", + "#include_lowest=True: Этот параметр гарантирует, что самое нижнее значение (в данном случае 0), будет входить в первую категорию.\n", + "\n", + "\n", "\n", "# Проверка результата\n", "print(\"После дискретизации 'Close':\")\n", @@ -878,7 +881,7 @@ }, { "cell_type": "code", - "execution_count": 8, + "execution_count": null, "metadata": {}, "outputs": [ { @@ -981,6 +984,9 @@ "X_resampled['Volume_Change'] = X_resampled['Volume'].pct_change()\n", "X_test['Volume_Change'] = X_test['Volume'].pct_change()\n", "X_val['Volume_Change'] = X_val['Volume'].pct_change()\n", + "# Результатом работы pct_change() является серия, где каждое значение представляет собой \n", + "# процентное изменение относительно предыдущего значения. Первое значение всегда будет NaN, \n", + "# так как для него нет предшествующего значения для сравнения.\n", "\n", "# Проверка создания новых признаков\n", "print(\"\\nНовые признаки в обучающей выборке:\")\n", @@ -1135,7 +1141,7 @@ }, { "cell_type": "code", - "execution_count": 10, + "execution_count": null, "metadata": {}, "outputs": [ { @@ -1262,6 +1268,9 @@ "fillna_X_resampled = X_resampled[['Volume_Change']].fillna(0)\n", "fillna_X_test = X_test[['Volume_Change']].fillna(0)\n", "fillna_X_val = X_val[['Volume_Change']].fillna(0)\n", + "# используется для заполнения всех значений NaN \n", + "# (Not a Number) в DataFrame или Series указанным значением. \n", + "# В данном случае, fillna(0) заполняет все ячейки, содержащие NaN, значением 0.\n", "\n", "\n", "print(fillna_df.shape)\n", @@ -1383,7 +1392,7 @@ }, { "cell_type": "code", - "execution_count": 12, + "execution_count": null, "metadata": {}, "outputs": [ { @@ -1437,6 +1446,8 @@ "X_resampled[numerical_features] = scaler.fit_transform(X_resampled[numerical_features])\n", "X_val[numerical_features] = scaler.transform(X_val[numerical_features])\n", "X_test[numerical_features] = scaler.transform(X_test[numerical_features])\n", + "# fit() - вычисляет среднее и стандартное отклонение для каждого признака в наборе данных.\n", + "# transform() - применяет расчеты, чтобы стандартизировать данные по приведенной выше формуле.\n", "\n", "# Вывод результатов после масштабирования\n", "print(\"Результаты после масштабирования:\")\n", @@ -1468,7 +1479,7 @@ }, { "cell_type": "code", - "execution_count": 13, + "execution_count": null, "metadata": {}, "outputs": [ { @@ -1561,7 +1572,7 @@ "# Создание EntitySet\n", "es = ft.EntitySet(id='stock_data')\n", "\n", - "# Добавление датафрейма с домами\n", + "# Добавление датафрейма с акциями\n", "es = es.add_dataframe(dataframe_name='stocks', dataframe=df, index='id')\n", "\n", "# Генерация признаков с помощью глубокой синтезы признаков\n", @@ -1580,10 +1591,12 @@ "\n", "# Генерация признаков\n", "feature_matrix, feature_defs = ft.dfs(entityset=es, target_dataframe_name='stocks', max_depth=2)\n", + "# Она автоматически генерирует новые признаки из исходного датафрейма и производит агрегацию по связям.\n", "\n", "# Преобразование признаков для контрольной и тестовой выборок\n", "val_feature_matrix = ft.calculate_feature_matrix(features=feature_defs, entityset=es, instance_ids=X_val.index)\n", "test_feature_matrix = ft.calculate_feature_matrix(features=feature_defs, entityset=es, instance_ids=X_test.index)\n", + "#генерирует матрицы признаков для контрольной и тестовой выборок, используя идентификаторы экземпляров из X_val.index и X_test.index соответственно.\n", "\n", "print(feature_matrix.head())\n" ] @@ -1614,7 +1627,7 @@ }, { "cell_type": "code", - "execution_count": 14, + "execution_count": null, "metadata": {}, "outputs": [ { @@ -2047,14 +2060,24 @@ "\n", "# Обучение модели\n", "model1 = LinearRegression()\n", + "#Линейная регрессия — это простая модель, которая пытается установить связь между двумя переменными, рисуя прямую линию на графике. \n", + "# Она прогнозирует значение зависимой переменной (Y) на основе одной или нескольких независимых переменных (X).\n", "model2 = DecisionTreeRegressor()\n", - "model3 = RandomForestRegressor(n_estimators=100) # Количество деревьев в лесу\n", + "#Это модель, которая принимает решения, дробя данные на «ветви», как дерево. На каждом уровне дерева модель выбирает, \n", + "# какой признак (фактор) использовать для разделения данных.\n", + "model3 = RandomForestRegressor(n_estimators=100) \n", + "#Случайный лес — это ансамблевая модель, которая использует множество деревьев решений. \n", + "# Вместо того чтобы полагаться на одно дерево, она комбинирует результаты нескольких деревьев, чтобы получить более точные предсказания.\n", "model4 = Lasso(alpha=0.1)\n", + "#Lasso регрессия — это разновидность линейной регрессии с добавлением регуляризации. \n", + "# Она помогает избежать переобучения модели, уменьшая влияние некоторых признаков.\n", "model5 = Ridge(alpha=0.1)\n", + "#Ridge регрессия похожа на Lasso, но вместо полного исключения некоторых переменных она уменьшает значения всех коэффициентов.\n", "\n", "print('\\nLinearRegression:')\n", "start_time = time.time()\n", "model1.fit(X_train, y_train)\n", + "#Метод fit обучает модель на обучающем наборе данных, состоящем из X_train (набор данных) и y_train (целевая переменная).\n", "\n", "# Время обучения модели\n", "train_time = time.time() - start_time\n", @@ -2062,8 +2085,11 @@ "y_predict = model1.predict(X_test)\n", "\n", "mse = mean_squared_error(y_test, y_predict, squared=False)\n", + "# Этот показатель показывает, насколько в среднем наши предсказания отклоняются от фактических значений. Чем меньше RMSE, тем лучше модель.\n", "r2 = r2_score(y_test, y_predict)\n", + "# Коффициент детерминации - показывает, насколько модель объясняет разброс значений в наборе данных\n", "mae = mean_absolute_error(y_test, y_predict)\n", + "# Измеряет среднее расстояние между предсказанными значениями и фактическими значениями, игнорируя направление ошибок.\n", "print(f'Коэффициент детерминации R²: {r2:.2f}')\n", "print(f'Время обучения модели: {train_time:.2f} секунд')\n", "print(f'Среднеквадратичная ошибка: {mse:.2f}')\n", @@ -2072,6 +2098,18 @@ "scores = cross_val_score(model1, X_train, y_train, cv=5, scoring='neg_mean_squared_error')\n", "rmse_cv = (-scores.mean())**0.5\n", "print(f\"Кросс-валидация RMSE: {rmse_cv} \\n\")\n", + "# Здесь мы используем метод cross_val_score для оценки модели с помощью кросс-валидации. \n", + "# cv=5 означает, что мы будем разбивать наш обучающий набор на 5 частей (фолдов) и \n", + "# использовать каждую часть для тестирования модели, обученной на остальных частях. \n", + "# (по сути разбивка на выборки но несколько раз с использованием разных разбиений, чтобы получить норм оценку)\n", + "\n", + "# Параметр scoring='neg_mean_squared_error' говорит о том, что мы хотим получать отрицательные значения среднеквадратичной ошибки, \n", + "# так как cross_val_score возвращает лучшие результаты как положительные значения. Таким образом, использование отрицательного \n", + "# значения MSE позволяет \"перевернуть\" метрику так, чтобы более низкие значения (более точные предсказания) приводили \n", + "# к более высоким (в терминах абсолютного значения) результатам.\n", + "\n", + "# После этого мы берем среднее значение отрицательной MSE и берем его корень (RMSE) \n", + "# для получения усредненной оценки ошибки модели через кросс-валидацию.\n", "\n", "\n", "# Визуализация результатов\n",